Law Engineering Field Guide
Rothken Law (techfirm.com) · Edition 1.24.1 · September 2026
Translating law into interface, code, and data — an illustrated living primer for lawyers and engineers.
Law Engineering Field Guide
Translate law into interface, code, and data — then prove it.
| Publisher | Rothken Law · techfirm.com |
| Audience | Product counsel · litigators advising tech · founders · product & platform engineers |
| Edition | 1.24.1 · Beta |
| Guide author | Ira P. Rothken · Rothken Law (techfirm.com) — high-tech counsel since the early commercial internet |
| As of | September 2026 |
Welcome
This guide is for people who ship regulated product surfaces — and for the counsel who have to defend them later.
For years, the industry ran a bad handoff. Lawyers drafted a memo, sent it to the engineers who control the stack, and hoped the logic made it into code. Sometimes it did. Often it didn’t. Courts and agencies look at what the product actually did, not at what the PDF hoped.
Law Engineering is the opposite of that hope. It means working with engineering so you can see the stack when you need to: the signup screen, the cancel path, the network tab, the row that gets written. You don’t fully delegate legal decisions that show up in interface, code, or data design. You translate the duty into something a release can pass or fail — then keep the proof.
A Law Engineer is a licensed attorney with software and product expertise. Engineers and other builders implement the gates under that counsel’s oversight. They are essential colleagues. They are not titled Law Engineers. Liability and legal meaning stay with counsel.
Where this guide came from
The Law Engineering idea grew out of our practice at Rothken Law (techfirm.com). Over the years we built playbooks for product counsel and eng leads — formation evidence, cancel gates, privacy congruence, takedown clocks, harbor ladders. We turned some of those playbooks and experiences into this Field Guide so the people who come after us don’t have to invent the method under deadline pressure.
We saw a gap on the shelf. A lot of energy goes into Legal Engineering and into AI that automates law practice — drafting, research, matter tooling. Useful neighbors. Different job. Other guides cover cybersecurity, or survey internet law in general. What seemed sorely needed was a guide that helps tech lawyers get compliance by code, design, and data — interface, server gates, and exportable proof — with counsel still owning the legal meaning.
That’s this book. Not a brochure. A bench kit.
Who is walking you through this
I’m Ira. I’ve practiced high-technology law since the early commercial internet — counseling product teams when the stack was still inventing the category, and litigating when the category invented new claims.
I founded Rothken Law in 1993. By the mid-1990s the work was already e-commerce policies, early affiliate programs, and risk design for sites that had no clear precedent — only a release date. I’m a licensed attorney with a computer-science background. That mix is why this guide treats interface, code, and data as where the legal duty lives.
One early matter stays with me as teaching context: I served as co-lead settlement class counsel in In re DoubleClick Privacy Litigation — a nationwide consumer privacy case about merging clickstream behavior with personally identifiable information. The fight was about cookies, retention, and what privacy meant when a product could profile a user across the open web. It did not end with a PDF policy alone. It ended with product commitments the industry could copy — purge rules, shorter cookie life, public education, and independent compliance review.
Past matters do not predict your facts. They do explain why this guide insists that counsel who only write memos lose ground, and counsel who can redesign the stack have a chance.
How to use this guide
This Field Guide is written for new lawyers and summer associates joining a tech practice — and for the product counsel and engineers who work with them. Each chapter covers a surface you are likely to see: formation, cancel, privacy tags, age gates, DMCA, repeat infringers, and the rest.
The job of each memo is the same. Keep you interested. Marry the statute or case theme to what must exist in the stack. Show why with a hypo or public case fact pattern. Then hand you Interface / Code / Data moves you can ship — so you protect the company creatively, not by pasting a PDF into a ticket.
- Chapter 0 — What Law Engineering Is — the discipline in plain English, and how it differs from Legal Engineering.
- Chapter 1 — The Method Loop — Law → Interface → Code → Data → Counsel sign-off.
- Worked examples — formation, dispute architecture, cancel, privacy congruence, age gates, DMCA, repeat-infringer ladders, agentic flows, payments, messaging, moderation, and more. Open the chapter that matches the surface you are shipping.
- Operating model — who staffs what, release gates, and how patterns evolve.
- Pattern Map + LE title index — find the teaching chapter for each pattern id when you need a quick pointer.
A good first pass (about 45 minutes): Chapter 0 → Chapter 1 → one worked example that matches your product → the Pattern Map rows you will touch this quarter → the operating-model chapter before the next release train.
A good working rhythm: When a ticket touches a legal act (agree, consent, opt-out, cancel, report, verify age, remove content), open the matching teaching chapter, run the method loop, and require counsel sign-off before the gate opens in production.
Engineers: treat the Code and Data rows as acceptance-test seeds, not informal hunches.
Lawyers: review Interface at wireframe time — not after the App Store build.
Each worked example follows the same memo rhythm: interesting fact pattern or case theme → what went wrong → how Law Engineering would have changed the ending (Interface / Code / Data) → then checklists and Lawyer/Engineer cards. Checklists come after the aha, not before.
Edition and versioning note
This is a living field guide. Law and product surfaces move; the guide should move with them.
| Concept | What it means for you |
|---|---|
| Guide edition | The edition number on the title block (1.24 here). It bumps when chapters, patterns, or operating rules change in a material way. |
| As-of date | When the legal and product assumptions in this edition were last checked (September 2026). Re-check primary authorities before you ship — statutes, rules, and opinions move between editions. |
| Pattern Map (LE-nn) | Maps each teaching pattern to the chapter that explains it. Teaching patterns, not matter advice. |
| Living updates | When the law changes or you add a new surface, update the matching pattern, bump the edition, and re-run acceptance tests. Do not wait for an annual reprint. |
| Themes vs holdings | Where this guide summarizes enforcement themes or pleading-stage points, treat them as orientation. Unsettled methods and jurisdiction-specific questions need counsel sign-off for your facts. |
Recommended habit: one line per edition in your own notes — what changed, which LE ids you touched, who signed off.
What this guide is not
- Not a substitute for reading the statute, the regulation, or the opinion.
- Not a complete ops runbook for every high-risk workflow (AML, CSAM preservation, incident response) — those need your counsel and your own runbooks.
- Not permission to ship “AI agreed for the user” as assent.
Educational field guide — not legal advice. It does not create an attorney–client relationship. Enforceability and regulatory posture are fact- and jurisdiction-specific. Have counsel own the legal meaning before you ship. Re-check primary authorities for your facts and jurisdiction.
Table of Contents
Contents
If you are new to the method, read Chapter 0 and Chapter 1 first. Then open the chapter that matches the work in front of you.
Page numbers match this PDF edition. Links jump to chapter anchors in HTML / GoodReader. Pattern Deck is a separate companion file (not in this PDF).
Chapter 0 — What Law Engineering Is
Audience: Product counsel, litigators who advise tech clients, founders, and the engineers who ship the stack.
The discipline in plain English
If you are new to the firm — or new to product counsel work — start here before any surface-specific chapter. Everything after it assumes you know what Law Engineering is, who owns legal meaning, and why a memo alone is not a release gate.
Law Engineering is the practice of translating a legal duty into interface, code, and data — then keeping exportable proof that the duty ran.
In plain English: make the rule real in the product, then keep the evidence.
A Law Engineer is a licensed attorney with software and product expertise. Engineers build the gates under that counsel’s oversight. They are partners in the build. The title stays with counsel, because liability and legal meaning stay with counsel.
This is not “ask engineering to add a checkbox.”
This is not memo-to-coders and hope.
And it is not Legal Engineering as often practiced — builders creating tools that touch legal process without counsel owning what the rule means.
| Law Engineering | Legal Engineering (related, distinct) | |
|---|---|---|
| Who leads | Law Engineer — a licensed attorney with software / product expertise (may staff with engineers under that counsel) | Often builders / ops / legaltech implementers |
| Core move | Translate law into UI, code, evidence | Build platforms and workflows that touch law |
| Success looks like | A release that can survive a motion to compel — or an AG letter — because the stack matches the rule | A faster intake form or clause library |
| Failure mode | Beautiful UX that still loses formation (Specht-style themes) | Clever automation that encodes the wrong rule |
If you remember only one staffing rule from this chapter: counsel owns legal meaning; engineering owns implementation under that ownership.
The origin story — how this grew from Rothken Law playbooks into a field guide aimed at compliance by code, design, and data — lives in the front matter. This chapter is the definition and the why.
Why the old handoff broke
Counsel drafts a policy or Terms PDF. Someone pastes a footer link. Engineering ships. Years later, in a dispute, nobody can show what the user saw, clicked, or agreed to.
Courts did not invent that gap. Products did.
Cases like Specht v. Netscape and Nguyen v. Barnes & Noble are famous for a simple reason: the interface told a different story than the legal aspiration. The law wanted conspicuous notice and unambiguous assent. The stack offered a Download button and hope.
Privacy taught the same lesson from another angle. When clickstream behavior and identity start to merge, a PDF notice that does not match the live tags is not a drafting typo — it is a product failure. Formation fights taught that when the user can see the terms is often the whole case. Device and platform disputes taught that courts will look at what the product actually does.
That gap is why Law Engineering exists. Your job is to close it before the release train leaves — not after discovery starts.
Design the evidence now
When you walk into court to defend a class action and want to enforce Terms, arbitration, and a class waiver, you need to attach evidence of robust notice and user consent. Better data makes that showing more likely.
So build for that day now:
- Date and time of the assent act (server clock)
- IP (and user-agent as your retention map allows)
- Version number of the Terms the user saw
- Hash of the exact bytes shown
- A path to a declaration that can swear to the pack
Design that well in advance — not the night before the hearing. Chapter 2 walks the formation screen. Chapter 1 shows the loop that produces that pack every time.
Why it matters even more now
Two forces make the discipline urgent.
First, compliance became a state machine.
Age verification, automatic-renewal cancel paths, privacy signals, takedown clocks, and multi-jurisdiction duties abroad are not “put it in the Terms.” They are product surfaces with states, timers, and fail-closed behavior. Fail closed means: if the check fails, the high-risk path does not open.
Second, AI and agentic commerce can act faster than review.
Probabilistic systems draft, recommend, click, buy, and message. Deterministic legal duties still require recorded assent, honored opt-outs, and auditable removals. If an agent can bind the company before a human reviews the act, counsel must place gates in the stack — not prompt-only guidance.
Field rule: Probabilistic systems may propose. Deterministic Law Engineering gates dispose.
In plain terms: the model can suggest. The gate decides.
Commitments that keep the practice honest
Law Engineering rests on a few plain commitments:
- The rule comes first. Start from statute, regulation, or holding — stated as something the product can pass or fail.
- The interface is part of the law story. What the user sees at the moment of the legal act matters as much as the PDF in the vault.
- UI without a server gate is incomplete. If the backend will accept the act anyway, you did not finish.
- If you cannot export the evidence, you did not finish. Discovery and regulators ask for records, not recollections.
- Counsel signs the legal meaning before production — especially on agentic paths.
- Builders under counsel are colleagues, not Law Engineers by title. Keep the label honest so staffing and liability stay clear.
None of that requires jargon. It requires ownership — and a willingness to sit with your eng lead until the gate and the evidence row are real.
A quick preview of the method loop
Chapter 1 walks the loop in detail. Here is the shape so you know where you are going:
| Step | Question you answer |
|---|---|
| Law | What must be true under the rule? |
| Interface | What does the user see and do at the moment of the legal act? |
| Code | What does the server refuse or require? |
| Data | What evidence pack can you export later? |
| Counsel sign-off | Who owns the legal meaning before the gate opens in production? |
Colloquially, Interface + Code + Data is The Build — the product surface that makes the legal requirement real before counsel sign-off.
When the law changes, or the product adds a new surface, you don’t rewrite a novel. You update the pattern, bump the guide edition, and re-run acceptance tests. That’s why this is a living field guide.
Field rules you can carry into a kickoff
Use these as orientation — not as matter advice, and not as slang that would sound hollow under a civil investigative demand (CID):
- Notice and assent live in the product, not only in a linked PDF.
- Gates are deterministic. Soft prompts and model “judgment” may assist; they do not replace recorded legal acts.
- Fail closed on high-risk paths. If the vendor, webhook, or age check fails, do not invent a checkbox fallback.
- Clocks are real. Removal windows, breach notice periods, and retention limits belong in code and calendars, not only in memos.
- Evidence is a first-class deliverable. Schema it like a feature.
- Jurisdiction is a product input. Geo and market flags change which gate runs.
- Title follows license. Law Engineer means licensed attorney with software expertise; builders ship under counsel.
Who this field guide is for
- Lawyers who want to stop throwing memos over the wall and start shipping enforceable designs.
- Engineers who want crisp acceptance tests and schemas instead of ambiguous “make it legal.”
- Teams that will keep a living pattern library as the law and the product change.
This guide uses plain language on purpose. Serious discipline. Clear help. No condescension.
Publisher: Rothken Law · techfirm.com.
What comes next
- Chapter 1 — The Method Loop (Law → Interface → Code → Data → Counsel sign-off).
- Worked examples — formation, cancel, privacy, age gates, takedowns, agentic flows, payments, messaging, moderation, and related surfaces. Open the chapter that matches what you’re shipping.
- Operating model, then the Pattern Map and LE title index when you need a quick pointer from pattern id to teaching chapter.
When you’re ready, turn the page. We’ll walk the loop.
Chapter 1 — The Method Loop
This is the method memo. Every durable compliance feature in this guide — clickwrap, cancel, Global Privacy Control (GPC), age gate, takedown — runs the same five steps. Once you can run the loop, the later chapters are just the loop applied to a new statute or surface.
Colloquially, Interface + Code + Data can be called The Build — the product surface that makes the legal requirement real before counsel sign-off. A Law Engineer (a licensed attorney with software and product expertise) owns the legal meaning. Engineers implement the gates under that counsel’s oversight.
Think of the loop as a checklist you keep on the bench, not a theory you memorize once. Walk a live ticket through Law → Interface → Code → Data → Counsel sign-off with counsel and eng on the call. Ask which step is still a memo. If it’s still a memo, you’re still in the old handoff — and you’re still fully delegating a legal decision the stack is about to make for you.
1. Law — what must be true
Start from a holding or statute. Say it as an engineering-relevant requirement — something a release can pass or fail.
Example (formation theme): the user must receive reasonably conspicuous notice of terms and give an unambiguous manifestation of assent (Specht; Meyer; Nguyen themes).
In plain English: the user must clearly see that Terms exist, and must clearly do something that means “I agree.”
Write it as a testable sentence, not an aspiration:
- “Signup cannot complete unless assent to Terms version V is recorded.”
If you can’t write that sentence, you’re not ready for Interface yet. You still have a memo.
2. Interface — what the user sees and does
Design the screen at the moment of the legal act — the tap, check, or confirm that makes the law “happen.”
Ask, with the wireframe open:
- Is notice visible without scrolling on a small phone?
- Is the action language tied to agreement (“By tapping Create account, you agree…”)?
- Are links real links, not gray decoration?
- Did we avoid pre-checked boxes and footer-only browsewrap?
Browsewrap means Terms live only in a quiet footer link, with no sentence tying the tap to agreement. Courts often treat that as weak or failing notice.
Lawyers review wireframes here — not after the App Store build. Catching a submerged Terms link at wireframe time is cheap. Catching it in a motion to compel is not.
3. Code — gates and events
UI without enforcement is incomplete. The beautiful assent sentence means little if POST /users creates the account anyway.
Hit Create without assent and watch what the server returns:
- Reject
POST /userswithout a valid acceptance event. - Single sign-on (SSO) still hits an assent gate before paid or high-risk features unlock.
- Material Terms changes set
requires_reconsent=trueand block gated APIs until a new acceptance fires.
Engineers own the gates. Counsel owns which events are “material.” That split keeps both sides honest: Legal doesn’t invent half-built APIs, and Engineering doesn’t decide alone when the law requires a fresh yes.
4. Data — the evidence pack
If you can’t export it, you didn’t finish.
Picture the hearing. You want to enforce Terms, arbitration, class waiver. Someone asks: what did this user see, and what did they do? Your answer should be a row you can attach — not a shrug and a Slack search.
Minimum formation pack — design it well in advance:
- user id
- terms version id + content hash of the exact bytes shown
- UI surface (signup_ios, checkout_web…)
- action type (checkbox vs sign-in-wrap)
- server timestamp (date and time), IP/user-agent as appropriate
- optional screenshot/DOM archive
- a path so counsel can swear a declaration to the pack
A content hash is a fingerprint of the exact Terms file the user saw. It defeats “we posted a new PDF later” disputes. Better data → more likely you can show robust notice and consent when it matters.
This is how you answer discovery without grepping application logs under deadline pressure.
5. Counsel sign-off — especially before agentic release
For ordinary create-read-update-delete (CRUD) apps, sign-off is a release checklist.
For agentic flows — tools that purchase, post, or “agree” — sign-off is a hard gate. No probabilistic path around deterministic requirements.
Field rule: Probabilistic systems may propose. Deterministic Law Engineering gates dispose.
In plain terms: the model can draft a cart or suggest a reply. Counsel-approved gates decide whether money moves, terms bind, or content ships.
How the loop stays alive
When the law changes — or the product adds a new surface — you don’t rewrite a novel. You update the pattern for that surface, bump the guide edition, and re-run acceptance tests.
That’s why this guide is a living field guide, not a frozen paperback. Chapter 2 puts the loop to work on formation UX — the court-evidence beat, live on a signup screen. From there, every worked example is the same five steps with different facts.
This chapter is for education and discussion. It is not legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
Chapter 2 — Worked Example: Formation UX (Lost vs Fixed)
Pattern family: Online terms assent (LE-01)
Legal anchors: Specht v. Netscape, 306 F.3d 17 (2d Cir. 2002); Nguyen v. Barnes & Noble, 763 F.3d 1171 (9th Cir. 2014); Meyer v. Uber Technologies, 868 F.3d 66 (2d Cir. 2017); Douglas v. Talk America, 495 F.3d 1062 (9th Cir. 2007) for later amendments.
Why this memo exists
Illustrative reconstructions for teaching. Not official screenshots of any party’s product.
Picture signup on a phone. Big button: Create account. Somewhere below the fold, a quiet gray link says Terms. The user taps Create. Years later, counsel needs to prove they agreed.
Formation means: did the parties actually make a deal the court will recognize? For product teams, that usually means two things. Did the user get reasonably conspicuous notice of the Terms? And did they give an unambiguous manifestation of assent — a clear act that means “I agree”?
Keep this court day in mind. You walk into court to defend a class action. You want to enforce Terms, arbitration, and a class waiver. You need to attach evidence of robust notice and user consent. Better data → more likely you can show it. So we design — well in advance — a pack that can carry:
- Date and time (server timestamp of the act)
- IP (and user-agent as your retention map allows)
- Version number of the Terms the user saw
- Hash of the exact bytes shown
- A path to a declaration counsel can swear to
If that pack doesn’t exist at accept-time, you’re grepping logs under deadline pressure. That’s not Law Engineering. That’s hope.
I spent years watching courts ask what the user saw before Buy — including shrink-wrap EULA fights where the terms lived inside the box (Baker-era themes: pre-purchase access and a real return path matter). The teaching point is simple: if the user cannot see the deal before the irreversible act, formation is already in trouble.
Review this chapter with counsel and eng on the same call. Ask whether a reasonable user would know they were agreeing. That question is the whole game.
Side A — What loses
Here’s the lose pattern. The user taps a primary action — Download, Register, or Pay. Terms are mentioned only after scrolling, or only as a quiet hyperlink with no assent language. The screen story is “I just wanted the thing,” not “I agreed to a contract.”
Why courts care: Formation needs conspicuous notice and unambiguous assent. A submerged license link does not tell a reasonable user they are bargaining. Cases in the Specht and Nguyen family are famous because the interface told a different story than counsel’s aspiration.
Lawyer lens — what I’d ask on the call: You will struggle to compel arbitration or enforce Terms if the screen story is “I just downloaded the thing.” Discovery will ask for the exact screen and the exact text shown. Hope is not an exhibit. Without date, time, IP, version, and hash, your declaration has nothing solid to attach.
Engineer lens: If the API creates the account whenever the button is pressed — no acceptance event — there is nothing honest to log. You cannot invent a row later that the stack never wrote.
Non-compliance checklist (red flags)
Before you call a signup “done,” check this list. Any hit is a formation risk:
- Footer-only browsewrap (Terms only in a submerged footer link) as the sole theory
- Terms below the fold relative to the call-to-action (CTA)
- No “By tapping… you agree” language
- Pre-checked “I agree”
- Links that 404 or open after the account already exists
- No stored
terms_version/ content hash - No server timestamp / IP on the acceptance row
- No path to export a pack counsel can declare to
Side B — What works better
Here’s what I want you to build.
Pattern (sign-in-wrap done carefully): An uncluttered screen; an assent sentence adjacent to the CTA; conspicuous Terms/Privacy links; notice visible without scrolling (Meyer-style themes). Sign-in-wrap means the act of creating the account (or signing in) is itself presented as agreement — but only when the notice is clear and tied to that act.
Stronger still (clickwrap): The CTA stays disabled until the user checks “I agree to the Terms.” Prefer this for dating, adult, paid subscriptions, and other high-stakes flows. Clickwrap is the classic checked-box pattern — when the box starts unchecked and the user must affirmatively check it.
Code gate: POST /users rejects without acceptance of the current required version. Try Create without assent. You should see a reject — not a 201.
Data — the court pack: An append-only acceptance row + hash of the exact Terms bytes shown + UI surface id + date/time + IP + version. Expand into the Evidence pack checklist below before you call the release done. Design the declaration path now.
Compliance checklist (green flags)
- Assent language tied to the action
- Working, obvious links
- Above-the-fold on target devices (test 320–390px width)
- Server-side gate
- Exportable evidence pack (date, time, IP, version, hash → declaration)
- Material amendments require notice + re-consent (Douglas theme) — not silent posting
How the stack implements formation (LE-01)
Here’s how the gates look when counsel and engineering own them together — not when Legal throws a memo over the wall:
| Gate | Behavior |
|---|---|
| G1 | POST /users (and equivalent signup/checkout completes) reject without acceptance_event_id for the current required Terms version |
| G2 | SSO / social login still hits the assent gate before paid or high-risk features unlock |
| G3 | Material Terms publish sets requires_reconsent=true; gated APIs 403 until a new acceptance event fires |
| G4 | Acceptance stores terms_version_id + content hash of the exact bytes shown (CDN stale-copy risk) |
| G5 | Marketing / A/B flags cannot remove the assent sentence or Terms links from the legal-act surface |
Interface: Assent sentence adjacent to the CTA; conspicuous working Terms/Privacy links; visible without scrolling on 320–390px; no pre-checked “I agree”; prefer disabled CTA until clickwrap check on high-stakes flows.
Interface must-not: Footer-only browsewrap as the sole theory; Terms below the fold relative to the CTA; links that 404 or open only after the account already exists.
Code: Server validates acceptance before account/session privileges that depend on Terms; a client modal alone is not enough. Acceptance tests: create-without-assent → reject; create-with-assent → row written; material bump → APIs blocked until re-consent; hash mismatch / wrong version → reject.
Data: Append-only term_acceptances (user id, terms_version_id, content_hash, UI surface id, action type checkbox vs sign-in-wrap, server timestamp, IP/UA as appropriate, optional DOM/screenshot archive id). Exportable for one user_id without grepping logs — so counsel can attach a declaration without archaeology.
Interface / code / data — one-page checklists
Interface (must-show at the legal act): conspicuous notice; assent language tied to the action; working Terms/Privacy links; above-the-fold on target devices.
Interface (must-not): pre-checked agree; footer-only browsewrap alone; submerged license; post-create Terms reveal.
Code: gates G1–G5 above; acceptance-test coverage for reject-without-accept, SSO still gated, reconsent block, evidence export.
Data: versioned Terms bytes + hash; append-only acceptance rows keyed to surface; counsel sign-off id on version publish; date/time/IP ready for the hearing pack.
Template: Lawyer / Engineer card
Use this card in the kickoff. Lawyer column = legal meaning. Engineer column = what must be true in the stack.
| Lawyer | Engineer |
|---|---|
| Do we have conspicuous notice + unambiguous assent on this surface? | Which acceptance tests fail if marketing removes the assent line in an A/B test? |
| Can we prove the exact Terms text — date, time, IP, version, hash — and swear a declaration? | Is content_hash stored at accept-time with server timestamp + IP? |
| Are minors / age-verification issues separated from formation? | Is age/AV a different gate (LE-09/LE-10), not overloaded into ToS? |
| What happens on material Terms changes? | Does requires_reconsent block APIs until a new event fires? |
Try this on your product tomorrow
- Screenshot signup and checkout on a small phone.
- Circle the CTA. Can you see assent + links without scrolling?
- Create a test account and ask: what row was written — date, time, IP, version, hash?
- Ask counsel: could you attach a declaration to that pack tomorrow morning?
- If the answer is “nothing” or “maybe from logs,” you don’t have Law Engineering yet — you have a PDF.
Acceptance-language + checkbox ladder
Courts sort online formation by what a reasonable user would notice and do on the screen — not by what counsel hoped the footer meant. Climb the ladder deliberately. Don’t treat a magic phrase as a substitute for screen facts.
| Rung | Pattern | Screen facts (theme) | Engineering takeaway |
|---|---|---|---|
| 1 — Lose | Browsewrap | Terms live only in a footer (or other submerged) link; primary CTA does not reference them | Do not rely on this as the sole formation theory for account, Pay, or heavy dispute clauses (Specht-shaped) |
| 2 — Weak | Hyperlink near the button without assent words | A Terms link sits near Register/Download/Pay, but no sentence ties the tap to agreement | Nguyen-shaped risk: proximity of a link is not unambiguous assent |
| 3 — Better | Sign-in-wrap | Uncluttered screen; above the fold: “By tapping/creating… you agree to the [Terms] and [Privacy Policy]”; conspicuous, working links; CTA adjacent | Meyer-shaped themes when notice is clear and the act is the agreement |
| 4 — Stronger | Clickwrap | Unchecked box; CTA disabled until the user checks; named docs linked | Prefer for heavy arbitration, dating/adult, paid subscriptions, and other high-stakes flows |
What the assent sentence must do
- Tie the CTA (tap / create / pay / continue) to named documents — not “our policies” or an unnamed “legal stuff” blob.
- Use present tense assent (“you agree,” “I agree”) bound to that action.
- Keep the box unchecked by default; never pre-check “I agree.”
- Make links look like links (underline / distinct treatment); they must resolve to the current version before privileges unlock.
- Keep the legal-act surface uncluttered so the sentence and links remain conspicuous on 320–390px widths.
Field rule: There is no magic winning phrase. The same words fail when buried, pre-checked, linked to a 404, or overwritten by an A/B flag (G5). Screen facts + a logged affirmative act decide the motion.
Privacy Policy juxtaposition
When Terms and Privacy Policy appear in the same assent sentence (“you agree to the Terms and Privacy Policy”), courts often treat that pairing as one notice package for the account relationship — notice that those documents exist and that creating the account is tied to them.
That package does not equal consent for every later use. Keep the distinction clear when you brief product:
- Sale / share / GPC opt-out and related signals still need their own gates (LE-07; Chapter 4).
- Non-essential cookies / SDK / pixel load still needs consent-management-platform (CMP)–style gating (LE-08; Chapter 4). A CMP is the banner and preference center that records category choices.
- SMS / TCPA marketing assent is a separate affirmative act (LE-21) — not swallowed by account Terms.
- Loyalty, Conditions of Sale, and other program paper bind the act that incorporates them — see the multi-doc table under checkout below.
Field rule: One sign-in-wrap sentence can form the account relationship. It does not silently authorize every later processing, messaging, or purchase program. Keep separate controls, separate incorporation_set (or equivalent) ids, and separate evidence rows where the legal act is different.
Evidence pack (Data row) — export checklist
Frame this as proof of what was shown and what was clicked — not surveillance. Counsel should be able to export one user_id (or acceptance_event_id) without grepping application logs — and swear a declaration to it.
| Field | Why it matters |
|---|---|
| Server timestamp (date + time) | Authoritative time of the act (not client-only clock) — you’ll attach this in court |
terms_version_id |
Which labeled version was required |
| Content hash of the bytes shown | Defeats “we posted a new PDF later” / CDN stale-copy disputes |
| Privacy version + hash | When Privacy was packaged in the same assent act |
| UI surface id | Which screen / flow (signup vs Pay vs re-consent) |
| Action type | Checkbox clickwrap vs sign-in-wrap button (or equivalent) |
| IP / user-agent | As appropriate under counsel’s retention / minimization map |
| Optional DOM / screenshot archive id | Reconstruct conspicuousness if the motion needs the visual |
| Declaration path | Named export + hash chain counsel can swear to |
Also retain (adjacent, not optional for a serious pack): acceptance_event_id; user / account id; incorporation_set_id when multiple docs bind one act; counsel sign-off id on the published version. G4 already requires hash-at-accept; this checklist makes the export shape explicit. Design it well in advance.
Electronic records and signatures (E-SIGN / UETA) — practical note
Federal E-SIGN (Electronic Signatures in Global and National Commerce Act) and state UETA (Uniform Electronic Transactions Act) orient that a contract or signature is not denied legal effect solely because it is electronic. For product stacks, the practical floor is still ordinary formation plus three engineering-facing duties:
- Intent to sign — the user takes an affirmative act that the UI presents as agreeing (checkbox check or sign-in-wrap CTA), not a submerged browse.
- Association with the record — the act is bound to the specific Terms (and Privacy, when packaged) version and content hash shown.
- Retention of the record — keep the acceptance row and versioned bytes so the agreement can be reproduced (and declared to).
Tie those duties to the logged affirmative act + retained hash in the evidence pack. This is orientation for release gates — not a treatise on every E-SIGN consumer carve-out. Where an agent binds on a user’s behalf, see Chapter 6B.
Lost vs won — case / fact-pattern table
Themes for orientation. Pinpoint cites are in the chapter header; don’t treat the “Outcome theme” column as a holding for your facts.
| Case | Screen facts (theme) | Outcome theme | Engineering takeaway |
|---|---|---|---|
| Specht v. Netscape | Download / use; license notice not fairly presented as part of the act | Browsewrap-style notice failed formation themes | Do not put the only Terms theory below or apart from the primary action |
| Nguyen v. Barnes & Noble | Terms hyperlink near checkout without a clear “I agree” / assent sentence | Hyperlink proximity alone insufficient | Assent words + named links; not “link nearby” hope |
| Meyer v. Uber Technologies | Uncluttered signup; conspicuous “By creating… you agree” with working Terms links | Sign-in-wrap enforced on those facts | Keep notice above the fold, uncluttered, tied to the CTA |
| Douglas v. Talk America | Later material Terms changes without adequate notice / assent to the new terms | Amendments need a real notice + assent story | Material publish → requires_reconsent (G3); no silent posting |
Checkout when dispute clauses are high-stakes
Account signup and Pay are different legal acts. A clean sign-in-wrap at registration does not rescue a checkout that relies on a quiet footer Terms link while the Conditions of Sale bury arbitration and a class waiver.
Lost pattern: Guest or returning buyer taps Pay. The only Terms affordance is a footer hyperlink. Confirmation email says “Order confirmed.” Counsel later needs to compel arbitration and cannot show conspicuous notice at the purchase act (Specht / Nguyen themes; contrast Meyer-style uncluttered notice). No date/time/IP/version/hash pack for the Pay act either.
Fixed pattern: At Pay, an assent sentence (or checkbox on high-stakes / heavy-arbitration flows) ties the tap to the Site Terms + Conditions of Sale versions actually linked; links work; notice is above the fold on a small phone. Optional programs (SMS, loyalty) use separate controls — messaging assent is not purchase assent. The Pay acceptance row carries the same court-ready fields.
Multi-doc stacks (which paper binds which act)
| Act | Documents that should travel with the evidence | Same-sentence packaging? |
|---|---|---|
| Create account | Site Terms + Privacy notice | Often yes — one account-relationship notice package; still not sale/share, cookie, or SMS consent |
| Pay / place order | Sale Terms (+ Return / Authenticity terms when those SKUs are in cart) | Separate act from account create; use purchase incorporation_set |
| SMS opt-in | Messaging Terms (separate) | Never fold into account or Pay assent alone (LE-21) |
| Join/earn loyalty | Loyalty Terms (separate) | Separate control + acceptance row |
Methods stacks commonly encode an incorporation_set_id on the acceptance row so export does not pretend one checkbox bound every program. Privacy juxtaposition (above) explains why Terms+Privacy in one account sentence is still not a blank check for later processing gates (LE-07 / LE-08; Chapter 4).
Order-as-offer timing
Some Sale Terms treat the customer’s order as an offer, with seller acceptance on shipment (or on a separate notice). In that design, a confirmation email is receipt of an offer — not acceptance. Methods stacks commonly encode a distinct seller_acceptance_at (often at first shipment) and keep confirmation copy honest (“Order received”) so the evidence timeline matches the paper.
Where this goes next
Dispute architecture (arb / class / LoL / waiver / indemnity) — Chapter 2B (LE-68).
ROSCA / cancel (easy cancel that actually cancels) — Chapter 3.
Privacy tag congruence (pixels that fire vs what the policy discloses) — Chapter 4.
Ecommerce authenticity, final-sale, compare-at, and loyalty patterns — later ecommerce chapters.
Pattern Map and LE title index at the end of this guide.
This chapter is for education and discussion. It is not legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
Chapter 2B — Worked Example: Dispute Architecture (Arb / Class / LoL / Waiver / Indemnity)
Pattern family: Subscriber dispute architecture — arbitration, class waiver, limitation of liability, unknown-claim waiver, indemnity as Interface / Code / Data (LE-68). Deepens formation UX (LE-01 / LE-02; Chapter 2).
Legal anchors (themes): Arbitration / class-waiver presentation themes (Meyer / Nguyen / clickwrap conspicuity); limitation-of-liability and indemnity as contract design that must be findable at assent; California Civ. Code § 1542-style unknown-claim waiver themes when releases ship; unconscionability / public-injunction / mass-arbitration / FOSTA carve-out pressures — counsel-owned, fact-specific. No underwriting puff — this chapter doesn’t promise any clause will be enforced.
As of September 2026: Re-check forum, mass-arb fees, and public-injunction caselaw before anyone encodes “always enforceable” in a release note.
Why this memo exists
Arbitration, class waiver, limitation of liability, and indemnity only protect the company if the formation screen and evidence pack can carry them.
When you walk into court (or a motion to compel arb), the paper only wins if the formation and checkout evidence match the clause stack. Design that congruence now.
The story in one glance
Picture a signup that “has arbitration.”
Buried page 47 of Terms mentions arb, class waiver, a liability cap, a § 1542-style release, and a broad indemnity. The checkbox says “I agree to the Terms.” Assent evidence stores a Terms URL — not a clause_set_version. When a dispute hits, Product can’t show what the user saw about arb that day. Finance asks whether the LoL cap “covers” a regulatory fine. Someone drafts marketing that says “our Terms protect us from everything.”
Formation without a dispute architecture is a PDF hope.
Walk one signup with Terms open to the arbitration section. Ask: would a reasonable user know arb was part of the deal that day? Can you export the clause_set_version that was live — or only a URL that now 404s?
This chapter treats arbitration (arb) + class waiver + limitation of liability (LoL) + unknown-claim waiver + indemnity as first-class legal acts: conspicuous notice where required, versioned clause_set, and assent evidence you can export. Caveats stay loud. Teaching only — generic Brand.
Plain English — five clauses, one evidence pack
| Clause theme | What product must make true | Typical miss |
|---|---|---|
| Arbitration | Notice + assent tied to versioned arb clause | Link-only; no export of what was shown |
| Class waiver | Paired presentation; not a surprise | Silent in mobile WebView |
| Limitation of liability (LoL) | Cap/types disclosed where counsel requires conspicuousness | Cap contradicted by “unlimited protection” marketing |
| Unknown-claim waiver (§ 1542-style) | Plain-language callout when used | Copied legalese nobody saw |
| Indemnity | Scope understandable at assent for B2C/B2B as designed | Infinite user indemnity on a consumer SKU without review |
Field rule — put this on the release checklist: If you can’t export clause_set_version + UI screenshot/hash + assent event for the day of signup, you have Terms — not dispute architecture.
Remember: a Law Engineer is a licensed attorney with software and product expertise. Engineers build gates under that counsel’s oversight.
Counsel-owned caveats (don’t encode as guarantees)
- Unconscionability — procedural + substantive; presentation and substance both matter.
- Public injunction / public policy carve-outs — some claims may remain outside private arb in some forums.
- Mass arbitration — fee and process design can become the product risk; counsel owns strategy.
- FOSTA / criminal / non-waivable rights — dispute clauses don’t erase statutory duties (LE-13 adjacency).
- No underwriting puff — never train sales that “arb means we can’t be sued” or “LoL caps all regulatory exposure.”
Review this with counsel and eng on the same call. If Side A matches production, you’re still in the memo-to-coders handoff.
Side A — What loses (“it’s in the Terms”)
What goes wrong: One megabyte Terms. Arb and class waiver unhighlighted.
Mobile checkout scrolls past. A/B removes the “Dispute resolution” summary.
Assent row stores only terms_url. Indemnity and LoL never appear in the formation evidence pack (LE-01).
Support macros promise refunds that contradict the LoL narrative. Mass-arb arrives; nobody can prove the clause_set that shipped.
Lawyer lens — what I’d ask on the call: You need versioned clause bundles and conspicuousness design — not a vibe that “clickwrap always wins.”
Engineer lens: If assent ignores clause_set_version, discovery reconstructs from Wayback and hope.
Any hit means you don’t ship yet.
Non-compliance checklist (red flags)
- Arb/class waiver not presented with formation-grade notice
- No
clause_set_versionon assent events
- Marketing overclaims enforceability or regulatory immunity
- A/B can strip dispute summary (LE-62 adjacency)
- Consumer indemnity without counsel SKU review
- FOSTA/criminal duties “solved” by Terms language
Side B — What works better (clause_set → notice → assent → export)
What works better: Counsel maintains clause_set bundles (arb, class_waiver, lol, unknown_claim_waiver, indemnity) with jurisdictions and SKU applicability.
Signup / upgrade surfaces show required summaries; full Terms link remains. Assent writes clause_set_version + document hashes + UI surface id.
Evidence export joins LE-01 pack. Experiment lint forbids removing dispute components.
Training forbids enforceability puff. Mass-arb / public-injunction playbooks live with counsel — not in CI as “safe.”
Fixed user story: User signs up → sees dispute summary (if required) → agrees → assent_events cite clause_set_v2026-09-15 → later dispute → export pack shows exact clause_set + UI.
Compliance checklist (green flags)
- Versioned clause_set registry
- Conspicuous summaries where counsel requires
- Assent evidence includes clause_set_version
- No marketing enforceability guarantees
- Experiment lint on dispute UI
- Caveat memo linked from eng handbook
Template: Lawyer / Engineer card
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
| Lawyer | Engineer |
|---|---|
| Which clause_set applies to this SKU/geo? | clause_set_version pinned in config? |
| What must be conspicuous at assent? | Summary components in allowlist; A/B cannot drop? |
| Any non-waivable / FOSTA notes for training? | Lint bans “arb = immune” macros? |
| Can we export formation + dispute clauses together? | LE-01 export joins clause_set rows? |
When this lands in court or before a regulator, better data wins. Design the export — timestamps, versions, hashes, and a path to a declaration — well in advance.
Interface / code / data — one-page checklists
Run these as acceptance seeds — not as informal hunches. If you can’t export the Data row, you didn’t finish.
Interface (must-show): Dispute-resolution summary where required; accessible Terms; version or “effective date” visible to counsel tooling; no dark-pattern skip of required notice.
Interface (must-not): “You can’t sue us” marketing; hidden class waiver on mobile; silent A/B removal.
Code: clause_set_registry; assent requires version; experiment lint; evidence export API.
Data: clause_sets; clause_set_versions; assent_events (user, surface, clause_set_version, terms_hash, timestamp); export_packs.
Lost vs fixed (scene card)
| Lost | Fixed | |
|---|---|---|
| Assent proof | Terms URL only | clause_set_version + UI hash |
| Arb notice | Page 47 | Summary at legal act |
| Sales talk | “We’re immune” | Caveats + no puff |
| A/B | Strips dispute UI | Lint blocks |
Try this on your product tomorrow
Screenshots and exports beat opinions.
- Export last week’s assent — is
clause_set_versionpresent?
- On mobile, find arb/class waiver presentation in ≤2 taps from agree.
- Attempt experiment removing dispute summary — CI fail?
- Search marketing for “can’t be sued” / “fully protected by Terms.”
- Ask counsel which caveats are briefed to Support.
Where this goes next
Keep the loop moving — Law → Interface → Code → Data → Counsel sign-off.
- Formation UX / clickwrap — Chapter 2 (LE-01 / LE-02).
- Agreement factory (populate + e-sign) — Chapter 2C (LE-76).
- Cancel / ROSCA — Chapter 3 (LE-03).
- Legal review triggers / experiments — Chapter 31B (LE-62).
- Section 230 design line (immunity ≠ ToS assertion) — Chapter 9B (LE-58).
- Pattern Map LE-68 — Chapter 32.
Field rule — put this on the release checklist: Dispute clauses are product surfaces. Version them, show them, prove them — and never sell them as a guarantee.
This chapter is for education and discussion. It isn’t legal advice. Unconscionability, public injunction, mass-arb, and FOSTA issues are counsel-owned. No underwriting of enforceability.
This chapter is for education and discussion. It is not legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
Chapter 2C — Worked Example: Agreement Factory (Populate + E-Sign)
Pattern family: Agreement factory — verification-gated populate + e-sign (LE-76). Sits after dispute architecture (LE-68; Chapter 2B) and formation UX (LE-01; Chapter 2). Cross-cuts creator/affiliate packs (LE-28 / LE-19), custom deals (LE-71; Chapter 13B), and unified payee diligence (LE-73; Chapter 8B).
Legal anchors (themes): Assent evidence joined to versioned templates; no unsigned PDF orphan as “the contract”; e-sign ceremony evidence (who, what version, when, IP/UA where collected); counsel-owned overrides for custom deals still route through Deal OS — not a free-form Word paste.
As of September 2026: Teaching reconstructions only — generic Brand / KYC vendor / e-sign vendor. No client names.
Why this memo exists
Creator and partner deals need versioned templates, e-sign, and hash chains — not a PDF emailed from someone’s laptop.
Every generated agreement needs the same court-ready trail: who signed, which version, which hash, when.
The story in one glance
Ops emailing a static Creator Agreement PDF, then “we’ll get wet ink later.”
The creator uploads content and receives payouts against clickwrap alone. Weeks later someone attaches a signed scan with a different exclusivity clause. Assent events (LE-01) never mention template_id or esign_envelope_id. Custom deals (LE-71) still live as email attachments. Finance can’t prove which pack bound which payout.
Walk one creator payout that “has a signed agreement somewhere.” Ask: which template_version and e-sign envelope bind that payout? If finance shrugs, you have a drawer — not a factory.
You need an agreement factory: verification gates → populate versioned templates → e-sign → join evidence to assent — not a PDF museum.
Plain English — factory, not drawer
| Control | Meaning |
|---|---|
| Verification gate | KYC/KYB / payee diligence clear (LE-73) before pack generation |
| Versioned templates | template_id + template_version + content hash per pack type |
| Populate | Party fields, Brand marks, jurisdiction, fee tables from registry — not hand-edit |
| E-sign ceremony | Envelope + signer identity + timestamps + final PDF hash |
| Assent join | LE-01 assent row stores template_version + esign_envelope_id |
| Custom override | Counsel-owned via LE-71 deal registry — factory refuses unsigned orphans |
Field rule — put this on the release checklist: If payout or publish can proceed against an unsigned PDF sitting in Drive, you don’t have an agreement factory.
Remember: a Law Engineer is a licensed attorney with software and product expertise.
Review this with counsel and eng on the same call. If Side A matches production, you’re still in the memo-to-coders handoff.
Side A — What loses (“PDF + hope”)
What goes wrong: Static PDFs emailed. Creators “agree” via clickwrap that never names the pack. Wet-ink scans arrive with different terms. Custom redlines bypass template versions. E-sign vendor used ad hoc; no join to assent schema. Ops reprints last year’s Affiliate Agreement for a new geo.
Any hit means you don’t ship yet.
Non-compliance checklist (red flags)
- Unsigned PDF used as “executed”
- No
template_versionon assent
- Pack generated before KYC clear
- Custom deal PDF outside LE-71 registry
- E-sign envelope not joinable to payee_id
- Hand-edited Word as source of truth
Side B — What works better (gate → populate → sign → join)
What works better: After diligence tier clears (LE-73), factory selects pack (creator / affiliate / custom_deal_shell).
Populate from party + Brand registries. Present e-sign with conspicuous terms summary.
On complete: store final PDF hash, envelope id, signer events; write LE-01 assent with template_version + esign_envelope_id. Publish/pay gates require joined assent for in-scope roles.
Custom economics/IP still counsel-owned in LE-71; factory only emits shells or merges approved overrides.
Compliance checklist (green flags)
- No pack until diligence gate
- Version + hash on every emit
- E-sign evidence joinable
- Assent schema includes template + envelope
- Unsigned orphan can’t unlock payout
- Custom overrides via Deal OS only
Template: Lawyer / Engineer card
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
| Lawyer | Engineer |
|---|---|
| Which pack types need wet-ink vs e-sign? | Factory routes by pack_type + jurisdiction? |
| What must join LE-01 assent? | template_version + esign_envelope_id written? |
| Who may override template language? | Only LE-71 counsel path; hand-edit blocked? |
| When is unsigned PDF forbidden as evidence? | Payout/publish gate requires envelope complete? |
| Retention for executed packs? | Artifact store + hash; counsel retention policy? |
Interface / code / data
Interface: Diligence-status banner before “Generate agreement”; template version visible; e-sign ceremony UX; download of executed pack only after complete; custom-deal badge when LE-71 overrides apply.
Code: agreement_factory service; template registry; populate pipeline; e-sign adapter; assent writer joining LE-01; gates on publish/pay for role packs.
Data: agreement_templates; agreement_emits; esign_envelopes; esign_events; assent join keys; final_pdf_sha256. Prefer vendor refs for ID docs — not raw vault dumps in the factory log.
Lost vs fixed
| Lost | Fixed | |
|---|---|---|
| Source | Email PDF | Versioned factory |
| Gate | Anyone can “agree” unsigned | Diligence → emit → e-sign |
| Evidence | Orphan scan | Assent + envelope join |
| Custom | Word redline chaos | LE-71 counsel overrides |
Try this on your product tomorrow
Screenshots and exports beat opinions.
- Generate a Creator pack while KYC is
pending— should refuse.
- Complete e-sign — does assent row show
template_version+ envelope id?
- Attempt payout with only an unsigned Drive PDF — gate fail?
- Custom exclusivity change without LE-71 deal_id — blocked?
- Export one executed pack zip (PDF hash + events + assent join).
Where this goes next
Keep the loop moving — Law → Interface → Code → Data → Counsel sign-off.
- Formation UX / assent schema — Chapter 2 (LE-01).
- Dispute clause versions — Chapter 2B (LE-68).
- Unified payee diligence — Chapter 8B (LE-73).
- Custom creator Deal OS — Chapter 13B (LE-71).
- Pattern Map LE-76 — Chapter 32.
Field rule — put this on the release checklist: Agreements are emitted artifacts with joins — not PDFs that wandered in from email.
This chapter is for education and discussion. It isn’t legal advice. No client names or deal values appear in this teaching reconstruction.
This chapter is for education and discussion. It is not legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
Chapter 3 — Worked Example: ROSCA / Easy Cancel (Lost vs Fixed)
Pattern family: Negative-option enrollment and simple cancellation (LE-03; overlays LE-04 CA ARL, LE-05 trial/price display)
Legal anchors: Restore Online Shoppers’ Confidence Act (ROSCA) § 8403, 15 U.S.C. §§ 8401–8405; FTC Act § 5; California Automatic Renewal Law, Bus. & Prof. Code §§ 17600 et seq. (esp. § 17602, including AB 2863 amendments for contracts on/after July 1, 2025); FTC v. Match Group enforcement themes (simple cancel; no dispute retaliation).
As of September 2026: FTC 2024 Negative Option (“Click-to-Cancel”) Rule amendments were vacated (Custom Communications v. FTC, 8th Cir. 2025); Commission restarted with a 2026 ANPRM. Design to the ROSCA + § 5 + state ARL floor, not the vacated text.
A fact pattern that makes the duty real
Imagine an ecommerce subscription site — call it FitBox Monthly. Checkout is slick. Three taps on a phone: pick a plan, enter a card, tap Start free trial. The button says “$0 today.” Post-trial price, billing interval, and “renews until you cancel” sit below the fold or only inside a linked Terms PDF. The user never checks an affirmative renew box; scroll and tap are treated as enough.
Thirty-five days later, a $49.99 charge hits the card. The user wants out. Account → Billing shows Manage plan, which opens a chat bot that offers a 20% discount and never shows a cancel control. Phone cancel is “available during business hours.” A support ticket is created; nothing writes an effective date. Soft-decline retries and the next renewal still fire. When the user disputes the charge with the bank, the account locks “for fraud review” and core features stay frozen until the dispute is dropped.
That pattern is why negative-option enforcement exists. Under ROSCA, before you take billing information you need clear, conspicuous disclosure of material terms; before you charge you need express informed consent; and you need simple mechanisms to stop recurring charges. FTC Act § 5 and state automatic-renewal laws (especially California’s ARL) attack the same product story from unfairness and dark-pattern angles: cancel harder than signup, phone-only after online enroll, retention mazes that hide cancel, billing that continues after the consumer said stop.
Enforcement themes in public FTC negative-option and ROSCA matters — and in Match-shaped cancel / dispute-retaliation themes — keep returning to that consumer experience: easy to join online, hard to leave, charges that outlive the “cancel request.” Treat those as themes for orientation; re-check captions and holdings with counsel for your facts. Do not counsel vacated 2024 Part 425 text as live law.
What went wrong at FitBox was not a missing paragraph in the Terms. It was Interface (disclosure and cancel path), Code (renewal job ignoring cancel), and Data (no exportable consent or cancel row). The checklist at the end of this chapter only helps after you see that ending.
Illustrative reconstructions for teaching. Not exhibits. Not official screenshots of any party’s product. Match-shaped themes below are public enforcement themes (complaint and later settlement press), not a claim that your product resembles any defendant’s UI.
If Chapter 2 was “can we prove they agreed,” this chapter is “can they leave as easily as they arrived — and does billing actually stop?”
How Law Engineering would have changed the ending
Walk the same FitBox facts through Interface, Code, and Data.
Interface — notice and an exit that is real. Before the user enters a card or taps Start, the screen shows recurring nature, amount, interval, trial length, post-trial price, and how to cancel — in visual proximity to the consent control, readable on a small phone. Consent is affirmative (unchecked checkbox or an equally clear counsel-approved CTA), not scroll-wrap hope. Cancel lives under Account → Billing within a few taps. Online enrollments complete cancel online. If a save offer appears, the cancel control stays visible and enabled at the same time. Confirmation screen plus a retainable email or in-app receipt states end date and last-charge status.
Code — the renewal job listens. subscription.create requires disclosure_version_id + consent_event_id. An authenticated Cancel API sets cancel_effective_at without a human agent and returns the effective date. Charge, renewal, and dunning jobs skip when cancel_effective_at <= now. Feature flags for “save offer” cannot remove the cancel CTA. Dispute or chargeback status does not lock core account features as retaliation.
Data — the pack you’d hand a CID. Versioned disclosure rows with content hash and structured amount/interval/trial fields. Append-only negative-option consent events (surface, action type, IP/UA, UI archive id). Cancellation rows with cancel_requested_at, cancel_effective_at, channel, retention-offer flags, confirmation message id. Join those to the charge log for one user_id without grepping Zendesk.
That is the aha: ROSCA’s “simple mechanisms” and ARL’s “without steps that obstruct or delay” are product tests. A ticket that never wrote cancel_effective_at is not a simple mechanism. Phone-only cancel after online signup is a classic red flag. Better data — timestamps, versions, hashes, and a path to a declaration — designed well in advance is what changes the hearing or the CID response.
Negative-option offers are recurring charges that continue until the consumer stops them. On the internet they sit on a three-part ROSCA floor:
- Clear and conspicuous disclosure of material terms before you collect billing information.
- Express informed consent before you charge.
- Simple mechanisms to stop recurring charges.
State automatic-renewal laws often harden the same themes: retainable acknowledgment, same-medium cancel for online enrollments, and (online) a simultaneous prominent cancel control when you show a retention offer. Law Engineering’s job is one continuous path: enroll → disclose → consent → cancel → evidence — and a billing job that actually stops when cancel is recorded.
Side A — What loses (the cancel maze)
What goes wrong: The user signed up in three taps online. Cancel requires a phone queue during business hours, a “chat with retention” dead-end, a ticket that never sets an effective date, or a guilt screen that hides the cancel control. Renewals and soft-decline retries keep firing. In dating and other high-friction stacks, a chargeback can also trigger account lock or feature hostage — Match-theme unfairness territory.
Why this matters in court / before a regulator: ROSCA’s “simple mechanisms” and CA ARL’s “without steps that obstruct or delay” are product tests, not brochure tests. Phone-only cancel after online signup is a classic red flag. Cancel harder than signup is a dark-pattern tell under § 5 / ARL / (for privacy consent) CPRA overlays — don’t conflate those hooks, but don’t ignore any of them.
Lawyer lens: When the CID arrives, you need disclosure version, consent event, cancel request/effective timestamps, channel, and charge log reconciled to the consent window. A Zendesk ticket that never wrote cancel_effective_at isn’t a simple mechanism.
Engineer lens: If subscription.create doesn’t require disclosure_version_id + consent_event_id, or if the renewal job ignores cancel_effective_at, the UI story is incomplete paper compliance.
Non-compliance checklist (red flags)
- Material terms (price, interval, trial length, post-trial price, “renews until canceled”) missing or below the fold relative to Pay/Subscribe on mobile
- Pre-checked renew consent; “$0” / “Free” CTA that omits conversion price
- Online signup → phone-only, mail-only, or chatbot-only cancel that never calls a cancel API
- Retention / save offer that hides or disables cancel (CA ARL wants simultaneous prominent click-to-cancel online)
- Cancel “request” that leaves renewals and dunning alive
- Account lock / feature hostage after billing dispute or chargeback
- No exportable disclosure bytes, consent row, or cancel confirmation receipt
Side B — What works better (easy cancel that cancels)
What works better: Before submit, the user sees recurring nature, amount, interval, trial/promo length, post-trial price, and how to cancel — in visual proximity to the consent control. Consent is affirmative (unchecked checkbox or equally clear counsel-approved CTA) — not scroll-wrap hope. Cancel lives in Account → Billing within a few taps; online enrollments complete cancel online; confirmation screen + retainable email/in-app receipt states end date / last charge status. If you show a save offer, the cancel control stays visible and enabled at the same time.
Code gates (from LE-03):
| Gate | Behavior |
|---|---|
| G1 | subscription.create requires disclosure_version_id + consent_event_id |
| G2 | Charge/renewal job skips when cancel_effective_at <= now |
| G3 | Authenticated Cancel API succeeds without a human agent; returns effective date |
| G4 | Retry/dunning respects cancel timestamp |
| G5 | Feature flags for “save offer” cannot remove the cancel CTA |
Data worth keeping: versioned disclosure rows with content hash and structured amount/interval/trial fields; append-only negative-option consent events (surface, action type, IP/UA, UI archive id); cancellation rows with cancel_requested_at, cancel_effective_at, channel, retention-offer flags, confirmation message id. Retention: align to the longer of ROSCA practice, CA ARL (often ≥ 3 years or 1 year after termination), and counsel’s map.
Compliance checklist (green flags)
- Disclosures visible without hunting on 320–390px widths
- Affirmative consent bound to the disclosure version shown
- Online cancel completes online; signup friction ≥ cancel friction (document the tap counts)
- Confirmation + receipt; renewals suppressed in the same release
- Chaos test: cancel, then force the renewal job — expect
SKIPPED_CANCELED
- In-app purchase (IAP) dual-path documented (store manage deep-link + in-app status sync)
- No retaliation path on dispute/chargeback
Template: Lawyer / Engineer card
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
| Lawyer | Engineer |
|---|---|
| Were material terms clear before billing info, and was consent express and informed? | Which acceptance test fails if marketing A/B-tests away the post-trial price line? |
| For CA traffic, does online cancel finish online without obstructing steps? | Does Cancel hit an API that sets cancel_effective_at, or only open a ticket? |
| If we show a retention offer, is click-to-cancel simultaneous and prominent? | Can a feature flag remove the cancel CTA component? (It must not.) |
Can we export disclosure + consent + cancel + charges for one user_id? |
Is disclosure content_hash captured at show/consent time (CDN stale-copy risk)? |
| After a chargeback, do we avoid account hostage? | Is dispute status decoupled from authz to core account features? |
| Are we counseling vacated 2024 Part 425 text as live law? (No.) | Are acceptance tests pinned to ROSCA/ARL floors and tagged for ANPRM watch? |
Interface / code / data — one-page checklists
Run these as acceptance seeds — not as informal hunches. If you can’t export the Data row, you didn’t finish.
Interface (must-show before charge): recurring nature; amount + interval; trial length + post-trial price + first paid charge timing; how to cancel; affirmative consent control; mobile visibility next to CTA.
Interface (cancel): short path from account/billing; online completion; confirmation + receipt; simultaneous cancel control with any save offer.
Interface (must-not): pre-checked renew; phone-only after online signup; confirm-shaming that disables cancel; cancel tickets without effective dates; dispute retaliation.
Code: gates G1–G5 above; acceptance-style tests for enroll-with-disclosure, block-without-consent, online cancel, retention UX, post-cancel charge skip, evidence export.
Data: subscription_disclosures, negative_option_consents (append-only), subscription_cancellations; counsel sign-off id on disclosure versions; immutable enough for a tabletop CID.
Try this on your product tomorrow
Screenshots and exports beat opinions.
- Screenshot enroll and cancel on a small phone. Count taps signup vs cancel.
- Complete cancel as a real test user. Did
cancel_effective_atland? Did a renewal job still charge?
- Turn on the save offer. Is cancel still on-screen and enabled?
- Ask counsel for one SKU’s disclosure version id. Can engineering join it to consent and charges in under an hour?
- If cancel is “email us,” you don’t have LE-03 yet — you have a hope queue.
Where this goes next
Keep the loop moving — Law → Interface → Code → Data → Counsel sign-off.
- Privacy tag congruence (pixels that fire vs what the policy discloses) — Chapter 4.
- CA ARL overlay depth (LE-04) and free-to-paid trial display (LE-05).
- Chargeback evidence bundles (LE-26) that reuse the same consent/cancel rows.
This chapter is for education and discussion. It is not legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
Chapter 4 — Worked Example: Privacy Policy ↔︎ Live Tags / SDKs (Lost vs Fixed)
Pattern family: Privacy notice congruence and tag/SDK gating (LE-41 congruence scanner; LE-08 CMP / pixel gating; LE-07 sale/share / GPC)
Legal anchors: FTC Act § 5 privacy unfairness/deception when practices ≠ notices; CCPA/CPRA notice-at-collection, sale/share, and GPC themes; cookie/SDK classification and dark-pattern consent UX; GDPR Arts. 13/14 transparency and ePrivacy-style consent for non-essential cookies where the product reaches the EEA/UK.
As of September 2026: US sale/share opt-out isn’t the same legal machine as EU cookie consent — region packs live in LE-42.
A fact pattern that makes congruence real
Illustrative reconstructions for teaching. Not exhibits. Not official screenshots of any party’s product.
Picture a polished privacy policy PDF that lists “our analytics provider” and a handful of named vendors. Now open the live site in a private window and watch the network tab before anyone touches the cookie banner. A dozen third-party hosts phone home. Some never appear in the PDF. Marketing added a “temporary” pixel last sprint. Growth shipped an ad SDK in the app binary. Server-side tag manager still fires partners the CMP never heard of.
That gap is this chapter. FTC Act § 5 theories often start from a simple sentence: you told consumers one thing; the stack did another. State sale/share and GPC themes, and EU-style consent for non-essential cookies where you reach those users, harden the same product problem from different angles.
DoubleClick was an early lesson in what happens when clickstream and identity try to become one profile without a matching notice story. (I was co-lead settlement class counsel in that matter; past work is teaching context, not advice for your facts.) Congruence between what you disclose and what the stack fires is not optional.
Congruence means the privacy story you publish matches the tracking that actually runs. If those two diverge, you have a Law Engineering problem — Interface (CMP and notices), Code (tags that wait for permission), and Data (an approved vendor register you can export) — not a drafting typo.
What the law is asking the product to do
Privacy law is increasingly a congruence problem, not a drafting problem.
- If the policy (or notice at collection) says who receives personal information and for what, the live inventory of pixels, software development kits (SDKs), and server-side endpoints should match that story.
- If the region requires consent before non-essential tracking, those tags must not initialize until category permission exists.
- If the business sells or shares for cross-context behavioral advertising, opt-out and GPC / Sec-GPC must suppress the same vendors end-to-end — not decorate a footer while ads keep firing. GPC (Global Privacy Control) is a browser signal that means “don’t sell or share my personal information.”
- FTC § 5 theories often start from a simple sentence: you told consumers one thing; the stack did another.
Law Engineering’s goal: an approved vendor register + policy version + CMP/gates + a scanner that diffs live inventory and can fail a deploy or open a severity ticket when they drift.
A CMP (consent management platform) is the banner and preference center that records category choices and, if wired correctly, tells loaders what may run.
Review this with counsel and eng on the same call. If Side A matches production, you’re still in the memo-to-coders handoff.
Side A — What loses (paper compliance)
What goes wrong: Marketing adds a “temporary” Meta/Google/TikTok pixel. Growth ships ad SDKs in the next app binary.
Someone pastes a partner into server-side Google Tag Manager (GTM). The privacy policy still lists Vendor A and “our analytics provider.” On first paint — before the CMP — HTTP Archive (HAR) capture shows a dozen third-party calls.
GPC is ignored or half-honored. Reject All is a tiny link under bright Accept All.
Annual “legal review” is a PDF diff that never sees production.
Why regulators and plaintiffs care: Undisclosed or pre-consent tracking supports § 5 deception/unfairness narratives; CCPA/CPRA notice and sale/share failures; GDPR/ePrivacy transparency and cookie-consent failures. Dark-pattern consent (reject harder than accept; pre-checked non-essential) weakens the consent story. COPPA-adjacent surfaces that still load behavioral tags are a sharper, separate mode (LE-09).
Lawyer lens — what I’d ask on the call: When an AG or California Privacy Protection Agency (CPPA) letter asks “what fired on date T?”, a Word policy isn’t an answer. You need inventory snapshots, consent strings, allowlist hashes, and a diff against the policy schedule that was public that day.
Engineer lens: If tags are hard-coded in index.html, or native SDKs init in Application.onCreate before reading consent flags, the CMP is a sticker on a firehose — incomplete, not a real gate.
Any hit means you don’t ship yet.
Non-compliance checklist (red flags)
- Tags / SDKs / conversion-API (CAPI) endpoints live in prod but absent from the public policy schedule or vendor register
- Non-essential marketing pixels in the first network burst before consent (consent regions) or despite GPC / Do Not Sell or Share (DNS-Share) (sale/share contexts)
- “We don’t sell” UI while share-for-ads continues
- Pre-checked non-essential categories; Accept prominent / Reject buried
- Mobile binary SDK list never mirrored in the web-centric policy
- Server-side GTM / partner pixels unscanned
- Annual manual PDF review as the only control; no CI or runtime brake
- “Approve all” vendor tickets with no
owner_team
Side B — What works better (CMP gates + congruence scanner)
What works better: Every vendor has a row: legal name, category (Essential / Analytics / Ads / …), role (service provider / contractor / third party / cross-context behavioral advertising (CCBA) — as counsel classifies), data processing agreement (DPA) status, policy schedule reference, owning team.
The public cookie/SDK list is generated from that register, not hand-edited in parallel. A CMP (config-as-code) gates non-essential loaders.
Edge middleware reads Sec-GPC where required and sets suppress flags before non-essential tags load (LE-07). Kill switches can disable a vendor globally in minutes even if the CMP misbehaves.
Congruence scanner (LE-41):
| Gate | Behavior |
|---|---|
| G1 | CI scans web bundles + tag-manager config for known pixel/SDK signatures |
| G2 | Mobile pipeline scans app binaries / manifests for SDK package ids |
| G3 | Diff against approved_vendor_register + privacy_policy_version |
| G4 | Undisclosed high-risk vendor → fail deploy or require legal_exception_id |
| G5 | Runtime monitor / Content Security Policy (CSP) / endpoint allowlist catches hotfix drift that bypassed CI |
| G6 | QA HAR: pre-consent quiet for non-essential vendors; GPC suppresses sale/share tags |
Fixed user story: Fresh visit in a consent region → no marketing third parties until Accept (by category). Reject All is as easy as Accept All where counsel requires symmetry. CA visitor with GPC on → sale/share vendors suppressed and the preference center says so. Staging pull request that adds an unlisted pixel → CI red. Counsel dashboard: policy version vs inventory snapshot vs diffs, exportable for the date of an inquiry.
Compliance checklist (green flags)
- Single source of truth: register → policy schedule → CMP allowlist
- Wrapper pattern:
if (!allow(vendor)) return;before script inject / SDK init
- Server-side pixels and in-app WebViews on the same consent bridge
- Equal-prominence Reject where required; no non-essential pre-checks
- GPC honored without forcing account creation
- Immutable
vendor_inventory_snapshots+congruence_diffs+cmp_consent_events
- Ownership so marketing can’t silent-ship vendors
- Child-directed modes: empty non-essential inventory (or affirmative auth per counsel)
Template: Lawyer / Engineer card
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
| Lawyer | Engineer |
|---|---|
| Does the public notice name the recipients/purposes that actually run? | What CI job diffs live signatures against approved_vendor_register? |
| For consent regions, is non-essential tracking gated before first paint? | Does HAR-before-interaction fail the build if a marketing host appears? |
| For sale/share, do DNS-Share and GPC suppress the same vendor set? | Does edge set sale_share_opt_out before tag bootstrap? |
| Can we reconstruct inventory + consent for the date of an AG letter? | Are snapshots keyed by deploy_sha, surface (web/ios/android), and time? |
| Are vendor roles (service provider vs third party) backed by DPAs/purpose limits? | Is role a field on the register that drives allow/suppress logic? |
| Is Reject as usable as Accept where required? | Is CMP config reviewed as code, not a vendor console click-trail? |
Interface / code / data — one-page checklists
Run these as acceptance seeds — not as informal hunches. If you can’t export the Data row, you didn’t finish.
Interface (must-show): CMP with category toggles; symmetrical Reject/Accept where required; link to cookie/SDK list; footer “Cookie settings” reopen; preference-center status when GPC is honored; DNS-Share entry unless counsel documents a signal-only path; mobile App Tracking Transparency (ATT)/SDK permission UX that doesn’t silently init ad SDKs.
Interface (must-not): Pre-checked non-essential; Accept-only walls without a required reject path; hard-coded marketing tags in templates; claiming no sale while share-for-ads continues.
Code: LE-08 gates (wrapper, mobile init, server-side check, CI register check, kill switch); LE-07 GPC/DNS suppress; LE-41 CI + runtime congruence; QA acceptance tests for pre-consent quiet, reject-all, category accept, GPC+CMP, WebView bridge, evidence export.
Data: vendor_register; vendor_inventory_snapshots; congruence_diffs; deploy_gates; cmp_consent_events (consent string, categories, region, gpc_honored, allowlist snapshot id); vendor_runtime_blocks. Retain immutable snapshots on a multi-year defense horizon counsel sets.
Failure modes worth chaos-testing
| Failure | Mitigation |
|---|---|
| Hard-coded HTML/SSR tags bypass CMP | Ban in templates; CSP |
| Obfuscated pixels / server-side GTM miss | Runtime HAR + scan server configs |
| Policy HTML edited apart from register | Generate schedule from register |
| Consent stored, native app ignores | Single consent service + WebView bridge |
| Hotfix in prod console skips CI | Runtime monitor + severity alerts |
Failure mode — Cookie Settings control that does nothing
A cousin of paper compliance: the footer promises Cookie Settings (or Your Privacy Choices), but the link is #, a 404, or a static cookie policy with no toggles. The CMP never opens. GPC may still be claimed in the privacy narrative while sale/share tags fire.
Why this matters in court / before a regulator: Congruence isn’t only “vendors named ↔︎ vendors loaded.” It’s also “controls promised ↔︎ controls that work.” A dead settings entry is a user-facing break in the same family as undisclosed pixels (LE-08 / LE-07 / LE-41).
Lost pattern — I’ve seen this movie: Footer link → policy PDF. No preference UI. Reject/Accept happened once on first visit (or never); the shopper can’t reopen choices. QA never clicks the footer.
Fixed pattern — here’s what I want you to ship: Footer Cookie Settings opens the same working CMP/preference center that gates vendors. Guest-accessible where counsel requires. When GPC is on, the UI says so. Synthetic QA clicks the footer on every staging deploy; label “Settings” can’t point at a policy-only URL. If the CMP is down, show an honest unavailable state and page counsel — don’t silent-404.
Add to tomorrow’s checklist: click Cookie Settings in a private window. If nothing interactive appears, you have a congruence defect even when the vendor register is clean.
Try this on your product tomorrow
Screenshots and exports beat opinions.
- Open a private window. Capture HAR before touching the banner. Circle every third-party host.
- Diff that list against your public privacy/cookie schedule. Extra names are LE-41 findings.
- Enable GPC (or send
Sec-GPC: 1in a test profile). Do sale/share pixels still load?
- Ask: who can add a vendor without a legal ticket and a register row? If “anyone with GTM access,” congruence is optional — and optional congruence fails.
- Export one day’s inventory snapshot. If you can’t, you aren’t ready for the letter that assumes you can.
Where this goes next
Keep the loop moving — Law → Interface → Code → Data → Counsel sign-off.
- CIPA / session replay / prior consent — Chapter 4B (LE-53). Same vendor wrappers help, but wiretap-class prior consent is a different theory from CMP congruence and notice schedules.
- Regional UX packs (LE-42) so US opt-out and EU consent stay separate machines.
- COPPA / age-gate tag kill (LE-09 / LE-10) on child-directed paths.
- Later chapters that compress LE-06…LE-08 + LE-41 into release checklists.
This chapter is for education and discussion. It isn’t legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
This chapter is for education and discussion. It is not legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
Chapter 4B — Worked Example: CIPA, Session Replay & Prior Consent
Pattern family: California Invasion of Privacy Act (CIPA) prior consent for session replay, third-party chat transcripts, and content-learning analytics (LE-53). Adjacent — not identical — to privacy tag congruence and CMP gating (LE-41, LE-08, LE-07; Chapter 4).
Legal anchors (themes): Cal. Penal Code §§ 631 (wiretap / learn contents in transit), 632 (confidential eavesdropping), 632.7 (cellular/cordless — no confidentiality requirement in the classic telling; mobile web traffic themes), 637.2 (civil damages themes — often pleaded as $5,000 per violation or 3× actual damages — Verify); Flanagan v. Flanagan, 27 Cal. 4th 766 (2002) (§ 632 confidential-communication themes); Popa v. Harriet Carter Gifts, 52 F.4th 121 (3d Cir. 2022) (persuasive PA wiretap party/eavesdropper analogy — note CA district divergence); Kearney v. Salomon Smith Barney, 39 Cal. 4th 95 (2006) (extraterritorial / CA-resident reach themes); Ninth Circuit prior-consent themes for § 631 (footer/browsewrap insufficient; affirmative conspicuous disclosure before interception — themes, not an invented reporter cite here).
As of September 2026: Re-check operative Penal Code text, your forum’s pleading posture on session replay / chat / pixels, and counsel’s party-vs-tool classification before shipping a banner that claims you’re “done” with CIPA.
Why this memo exists
Are we recording keystrokes and clicks before the user said yes?
Session replay is a new costume on an old problem: capturing behavior the user never agreed to watch. Prior consent — or don’t load the script.
The story in one glance
Picture a shopper who never touched a cookie banner.
The homepage paints. A session-replay script starts streaming mouse moves, clicks, scroll depth, and — on the checkout form — keystrokes. A live-chat bubble opens a third-party transcript pipe. An analytics pixel reads field values as “content.” The privacy policy PDF still says “we use cookies to improve your experience.” The CMP, if it appears at all, only mentions Analytics and Ads.
That gap is this chapter.
Session replay is a new costume on an old problem: capturing behavior the user never agreed to watch.
Chapter 4 taught congruence: the policy schedule must match the live vendors, and non-essential tags wait for category permission. This chapter is a different theory.
Plaintiffs plead CIPA as wiretap / eavesdropping — that the stack learned the contents of a communication in transit, or eavesdropped on a confidential session, without prior consent.
A beautiful CMP that never disclosed “we record your session” is incomplete for that fight.
Walk this with one private window and the network tab open. Ask three questions. Did anything that records or learns contents load before an affirmative Accept? Can counsel prove consent_at before first_replay_init_at? If the visitor hits Reject, do FullStory, Hotjar, chat, and content pixels stay dark?
Law Engineering’s answer is prior consent as a gate — Interface names the recording, Code blocks init until Accept, Data proves the order.
Teaching reconstructions only. Not screenshots of any party’s live product and not exhibits.
Plain English — what CIPA is, and why ecommerce “eavesdrops” in the complaint
CIPA is California’s Invasion of Privacy Act — older wiretap and eavesdropping rules in the Penal Code, with a private right of action. In the ecommerce telling, the “communication” is the visitor’s session with your site: pages, forms, sometimes chat. The “eavesdropper” in the pleading is often a third-party vendor that receives mouse movements, clicks, typed input, or chat text while the visit is underway.
Plaintiffs say that looks like learning contents in transit (§ 631 themes) or eavesdropping on a confidential communication (§ 632 themes). On mobile web, § 632.7 themes show up too — and that provision’s classic telling does not require the same confidentiality showing.
Damages under § 637.2 are often pleaded at $5,000 per violation or three times actual damages. Treat those figures as a Verify flag: re-check the statute and current pleading practice for your matter.
The engineering implication is blunt either way — per-visitor exposure narratives make “we’ll fix the banner next quarter” an expensive habit.
This is not only a privacy-notice problem. You can name every vendor in a schedule and still face a CIPA story if recording began before consent.
What the law is asking the product to do (themes)
Orient to four design pressures. Counsel owns the final map for your facts.
- § 631 themes — contents in transit. If a tool intentionally learns what the visitor is sending while the session runs, prior consent of the parties is the statutory theme. Session replay and content-aware form analytics are the usual product suspects.
- § 632 themes — confidential eavesdropping. Flanagan themes ask whether the participant reasonably expected the conversation was not being overheard. Account forms, checkout, chat with support — design as if expectation of privacy is live until counsel says otherwise.
- § 632.7 themes — mobile / cordless lineage. Pleadings often reach mobile web traffic under this section’s themes without the same confidentiality gate. Don’t ship a desktop-only consent story.
- Prior consent before interception. Ninth Circuit prior-consent themes for § 631 push toward affirmative, conspicuous disclosure before the tool loads. Footer Terms, browsewrap, or “by continuing you agree” buried under the fold is a weak sole theory. Accept must be real; Reject must work.
Party vs eavesdropper. Vendors sometimes argue they are a tool of the site (one party’s tape recorder), not an independent eavesdropper. Popa v. Harriet Carter Gifts, 52 F.4th 121 (3d Cir. 2022), is a persuasive Pennsylvania wiretap analogy on that family of facts — useful for orientation, not binding CIPA law. California district courts diverge on similar session-replay and pixel stories. Law Engineering posture: encode prior visitor consent and clean contracts anyway; don’t bet the release on “we’re a party” alone without counsel’s written classification.
Reach. Kearney v. Salomon Smith Barney, 39 Cal. 4th 95 (2006), themes remind you that California residents can sit at the center of the story even when servers or vendors sit elsewhere. Geo and profile scoping belong in the gate design.
Review this with counsel and eng on the same call. If Side A matches production, you’re still in the memo-to-coders handoff.
Side A — What loses (tools on first paint)
What goes wrong: Marketing installs session replay “for UX research.” Support embeds a third-party chat bubble that stores every transcript by default.
Growth adds a pixel that scrapes form fields for funnel analytics. All three load in the first network burst.
The cookie banner — if any — talks about Analytics and Ads. It never says recording.
Reject All leaves replay running because someone marked it Essential. The privacy policy lists “service providers” in the abstract.
When a demand letter asks for the moment consent preceded first intercept, the export is empty.
Why CIPA themes care: The complaint writes itself as wiretap / eavesdropping without prior consent — not as “please update your cookie schedule.” § 637.2 damages themes turn each quiet session into a number. Mobile visitors amplify § 632.7 themes. Out-of-state infra doesn’t erase Kearney resident-reach themes.
Lawyer lens — what I’d ask on the call: A Word policy and a CMP config screenshot are incomplete. You need disclosure text (hashed), Accept events, and init timestamps that prove order. If the vendor is an independent third party learning contents for its own purposes, party-consent theories get harder — classify before you ship, and still gate.
Engineer lens: If FullStory / Hotjar / chat snippets sit in index.html or init in Application.onCreate before reading cipa_consent, the banner is a sticker on a firehose. If “Accept all cookies” sets a flag that never mentioned session recording, you bridged the wrong legal machine.
Any hit means you don’t ship yet.
Non-compliance checklist (red flags)
- Session replay, chat transcript, or content-learning pixels in the first paint before affirmative Accept
- Footer / browsewrap / buried Privacy Policy as the only “consent”
- Pre-checked Accept; Reject harder than Accept; Reject that still leaves replay on
- Replay labeled Essential to bypass CMP
- EU cookie Accept treated as CIPA consent without recording disclosure
- No
consent_at/first_replay_init_atordering proof
- No CIPA-sensitive vendor register or kill switch
- Desktop banner only while mobile WebView loads native SDKs dark
Side B — What works better (disclose → Accept → then load)
What works better: Counsel lists every CIPA-sensitive vendor on a register: session replay, chat, form/content analytics, heatmaps that capture DOM text.
On first visit (CA-scoped or counsel-scoped), a banner or modal names the behavior before those scripts exist in the page. Affirmative Accept (not pre-checked).
Reject as usable as Accept. Details link explains what is recorded, who receives it, and how to withdraw.
Code wrappers refuse init until cipa_consent_at. Data stores consent_version, disclosure_hash, consent_at, first_replay_init_at, vendor_id — and CI fails if init precedes consent.
If counsel splits CIPA from EU cookie categories, keep separate events and copy. A visitor can accept strictly necessary cookies and still Reject session recording. If counsel combines them, the combined disclosure must actually say recording / content learning — not only “analytics.”
Fixed user story: Fresh visit → quiet network for CIPA-sensitive hosts → visitor reads short disclosure → Accept → only then does replay/chat/content analytics init → export shows consent timestamp earlier than first init. Reject → those hosts never appear. Kill switch can darken a vendor in minutes when classification or copy changes.
Compliance checklist (green flags)
- Disclosure names session replay / chat recording / content analytics in plain English
- Accept affirmative; Reject real; no pre-check
- Wrappers block FullStory / Hotjar / chat / content pixels until consent
- Separate from EU categories when counsel splits
- Register + kill switch + owner_team for every CIPA-sensitive vendor
- Evidence:
disclosure_hash,consent_atbeforefirst_*_init_at
- Mobile WebView / native SDK on the same consent bridge
- Public policy schedule lists the same vendors (Chapter 4 congruence)
When this lands in court or before a regulator, better data wins. Design the export — timestamps, versions, hashes, and a path to a declaration — well in advance.
Interface / code / data — one-page checklists
Run these as acceptance seeds — not as informal hunches. If you can’t export the Data row, you didn’t finish.
Interface (must-show): Banner/modal before CIPA-sensitive tools load; plain-English recording disclosure; affirmative Accept; Reject; working Details link; reopen/withdraw path; mobile-equivalent UX.
Interface (must-not): Browsewrap-only; pre-checked Accept; Accept-only with buried Reject; silent first-paint replay; “essential” mislabel; details that never mention recording.
Code: Block vendor init until cipa_consent; optional split from CMP category flags; inventory register; kill switch; CI/HAR assert pre-consent quiet and consent-before-init ordering; server-side paths honor the same flag.
Data: consent_version, disclosure_hash, consent_at, first_replay_init_at (and chat/pixel siblings), vendor_id, ui_surface, register snapshot. Retain on the defense horizon counsel sets.
Template: Lawyer / Engineer card
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
| Lawyer | Engineer |
|---|---|
| Does disclosure name recording / content learning before tools load — not only “cookies”? | Is every CIPA-sensitive script behind if (!cipa_consent) return;? |
| Is Accept affirmative and Reject usable? | Pre-consent HAR quiet for replay / chat / content hosts? |
| Can we prove consent before first intercept for date T? | Do we store and assert consent_at < first_replay_init_at? |
| Tool vs independent third party — classified in writing? | Is vendor_id role on the register driving gates and exports? |
| CA-resident / mobile scoping (Kearney / § 632.7 themes) covered? | Same bridge for web, WebView, and native SDK init? |
| § 637.2 figures verified for this matter? | Kill switch + CI signature scan for hotfix snippets? |
Lost vs fixed (scene card)
| Lost | Fixed | |
|---|---|---|
| First paint | Replay + chat + content pixels already running | CIPA-sensitive hosts dark until Accept |
| Disclosure | “We use cookies” / footer Privacy | Banner names session recording / transcripts / content analytics |
| Choice | Browsewrap or pre-checked Accept | Affirmative Accept + real Reject |
| CMP relation | EU Accept All silently enables replay | Split or combined only with counsel-owned copy |
| Proof | No ordering evidence | disclosure_hash + consent_at before first_replay_init_at |
| Ops | Vendor pasted in GTM forever | Register + kill switch + congruence with Chapter 4 |
Try this on your product tomorrow
Screenshots and exports beat opinions.
- Private window. Capture HAR before any click. Circle session-replay, chat, and form-analytics hosts.
- Read your banner aloud. Does it say you record the session or learn form contents — or only “cookies”?
- Click Reject. Do those hosts still appear?
- After Accept, export one row:
consent_atandfirst_replay_init_at. Which is earlier?
- Ask who can paste FullStory in GTM without a register row and a kill switch. If “anyone,” CIPA gating is optional — and optional gating fails.
- Repeat on a phone-sized WebView. § 632.7 themes don’t care that your desktop banner looked fine.
Where this goes next
Keep the loop moving — Law → Interface → Code → Data → Counsel sign-off.
- Privacy policy ↔︎ live tags / CMP congruence — Chapter 4 (LE-41, LE-08, LE-07). Same wrappers help; CIPA is still a wiretap-class theory, not only notice congruence.
- Multi-jurisdictional privacy UX packs — Chapter 30 (LE-42) when CA CIPA disclosure sits beside EU cookie categories.
- Formation-style evidence instincts (version, hash, surface, time) — Chapter 2 (LE-01).
- Operating model / release gates — Chapter 31. Pattern Map LE-53 — Chapter 32.
This chapter is for education and discussion. It isn’t legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
This chapter is for education and discussion. It is not legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
Chapter 5 — Worked Example: Age Verification + TAKE IT DOWN (Lost vs Fixed)
Pattern family: State adult-content age verification (LE-10) + federal TAKE IT DOWN Act notice-and-removal (LE-11)
Legal anchors: State adult AV statutes (e.g., Tex. Civ. Prac. & Rem. Code ch. 129B / H.B. 1181; La. R.S. 9:2800.28; Fla. Stat. § 501.1737); Free Speech Coalition, Inc. v. Paxton, 606 U.S. ___ (June 27, 2025) (upheld Texas AV under intermediate scrutiny — does not auto-validate every sister statute or every vendor method); TAKE IT DOWN Act, Pub. L. No. 119-12 (May 19, 2025) → 47 U.S.C. § 223(h) (criminal) and § 223a (platform N&R; process by May 19, 2026; FTC enforcement from that date).
As of September 2026: Keep a state matrix and method allowlist current; re-check FTC penalty adjustments and injunction status before quoting numbers in a matter.
Two duties that get mashed into one ticket
Illustrative reconstructions for teaching. Not exhibits. Not official screenshots of any party’s product.
Picture two product meetings that get collapsed into one “safety UX” ticket. In the first, a covered state asks: who may enter adult material? In the second, a federal statute asks: how do nonconsensual intimate images leave within 48 hours?
On the lost side, a visitor taps Enter behind a lone “I’m 18+” checkbox. Thumbnails and signed media URLs load without a verified age state. Intimate-image reports land in the copyright form, or soft-hide without a CDN purge, and nobody can show a 48-hour clock.
Adult and mixed UGC — and dating hybrids — often need both stacks. They are not the same machine. One is a gate in. The other is a clock out. Clocks and verification are not Terms poetry. They are product surfaces with fail-closed behavior and exportable decisions.
Ask of one covered URL: who may enter — and how does nonconsensual intimate imagery leave within 48 hours?
Why these two patterns travel together
Age verification (AV) and intimate-image removal solve different legal problems. Teams collapse them into one checkbox and ship neither correctly.
| Duty | What it asks | Typical miss |
|---|---|---|
| State adult AV (LE-10) | Before access to covered sexual material harmful to minors in covered geos, verify age by a statute-recognized method; often non-retention of identifying info after access | “I am 18+” checkbox; CDN still serves media; ID images parked in object storage forever |
| TAKE IT DOWN § 223a (LE-11) | Covered platforms: clear process; on a valid written request, remove as soon as possible but not later than 48 hours, plus reasonable efforts for known identical copies | Account-only “Report”; tickets lost in DMCA; no SLA clock; soft-hide without CDN purge |
Field rule — put this on the release checklist: AV is a gate in. TIDA (TAKE IT DOWN Act) is a clock out. One evidence pack doesn’t replace the other.
Review this with counsel and eng on the same call. If Side A matches production, you’re still in the memo-to-coders handoff.
Side A — What loses
Don’t ship this. If your current build matches Side A, stop the release train and fix it with counsel.
AV (LE-10) failure mode
What goes wrong: User taps Enter. A pre-checked or lone checkbox says “I’m 18+.” Thumbnails and signed media URLs work without a verified av_status=passed. If the product collects a government ID at all, the scan lives in application storage “for fraud.”
Why statutes care (theme): Template state laws (LA/TX-style and peers) typically trigger when a substantial portion — often more than one-third — of the site/app is sexual material harmful to minors. Methods commonly include digitized/government ID, commercially reasonable transactional data, and (in Florida) an anonymous option alongside standard verification. Many statutes pair the duty with no retention of identifying information after access is granted. Checkbox assent isn’t that architecture.
Lawyer lens — what I’d ask on the call: After Paxton (2025), facial First Amendment challenges to Texas-style AV are harder — but counsel still needs a state matrix, a documented substantial-portion methodology, and a method allowlist. Overreading Paxton as a nationwide blessing for estimation-only vendors is a research error — estimation compliance is state-specific / often unsettled and needs counsel sign-off for your method and geo.
Engineer lens: If media URLs issue whenever the session cookie exists, you built a banner — not AV.
TIDA (LE-11) failure mode
What goes wrong: Intimate-image reports require login, live three menus deep under “Other,” or land in a copyright form that demands ownership swearing. Support replies “we’ll look into it.” Soft-hide leaves the object publicly reachable. Duplicates are the victim’s problem.
Why the statute cares (theme): Under § 223a, covered platforms (public UGC forums, or entities that regularly host/curate nonconsensual intimate imagery (NCII)) needed a process by May 19, 2026. A valid written request needs signature, locate info, good-faith nonconsent statement, and contact. Clock: remove ≤ 48 hours and make reasonable efforts on known identical copies. FTC treats unreasonable noncompliance as a rule-defined UDAP violation; May 2026 materials cite civil penalties on the order of $53,088 per violation subject to 16 C.F.R. § 1.98 inflation adjustments. Verify (as of September 2026 — re-check before citing in a matter): penalty amount and inflation adjustment. Good-faith removal has a § 223a limitation on liability; it’s not the DMCA § 512 harbor.
Lawyer lens — what I’d ask on the call: TIDA § 3 does not create a private right of action against platforms on its face (FTC track). Victims may still use 15 U.S.C. § 6851, state NCII, and other law against publishers. Parallel intakes (DMCA, CSAM/NCMEC, state NCII) stay separate.
Engineer lens: If received_at is “when someone opened the email,” the 48-hour duty is unprovable.
Any hit means you don’t ship yet.
Non-compliance checklist (red flags)
- Checkbox-only AV in covered states
- Scrapable full-res media without AV token
- Retaining raw ID images after pass contrary to non-retention design
- Intimate-image report path account-gated or >3 navigations from the media
- TIDA fields missing; tickets merged into DMCA
- No
sla_deadline_at = valid_at + 48h
- Soft-hide without hard CDN/object disable
- No hash / identical-copy sweep log
- Marketing claims (“48-hour removal,” “anonymous AV”) that the stack can’t meet
Side B — What works better
Here’s the build worth shipping — gates, records, and an export counsel can defend.
AV that can survive an audit (LE-10 theme)
- Counsel factual memo: Is this property in substantial-portion scope for which states? Enable list is a product flag counsel owns — not a growth experiment.
- Geo → interstitial → vendor → webhook → unlock: Media/CDN signed URLs require
av_session=passedfor covered jurisdictions.
- Method allowlist per state: Gov ID / transactional / Florida anonymous+standard where required. Face estimation only if counsel enables that state (
estimation_allowed). Commercial stacks commonly implement the gov-ID path as document + liveness + face match, and return pass/fail or over-18 tokens rather than images — encode method codes and refuse disallowed ones server-side.
- Non-retention: Prefer pass/fail tokens; purge raw artifacts on schedule; export jurisdiction, method, vendor, timestamps — not illicit ID bytes.
- Separate COPPA (LE-09): Under-13 personal-information rules are a different regime.
Method depth: For statutory buckets vs vendor implementations (Texas-style gov-ID / transactional, Florida anonymous+standard, estimation step-up, webhook/token integration, biometric privacy and re-verification nuances), see the under-18 age-verification chapter later in this guide — this chapter keeps the AV+TIDA pairing; that chapter owns the method stack.
TIDA N&R that can survive an FTC letter (LE-11 theme)
- Coverage memo: UGC-forum prong vs. regular-course NCII prong; exclusions (broadband, email, incidental interactivity) read carefully — prong (II) isn’t saved by “incidental chat.”
- Clear entry: “Report nonconsensual intimate image” (plain language), including non-account holders; in-content overflow preferred.
- Statutory form fields map 1:1; incomplete → no SLA start; valid → confirmation / report number +
received_at/valid_at/sla_deadline_at.
- Remove + sweep: Hard disable; perceptual/cryptographic hash; child tickets for copies; re-upload blocklist.
- Queues: TIDA ≠ DMCA ≠ CSAM (§ 2258A / NCMEC). Digital forgeries that meet the intimate-depiction tests are in the TIDA taxonomy — train Trust & Safety.
- Export pack: Request payload, timeline, operator actions, sweep results, notice logs, manifest hash.
Compliance checklist (green flags)
- Substantial-portion sign-off + state/method matrix
- CDN/API refuse without AV pass in covered geos
- Purge receipts for raw AV artifacts
- Non-account TIDA intake with four statutory elements
- Auditable 48-hour SLA + identical-copy standard operating procedure
- Separate DMCA / TIDA / CSAM routing
- Status messaging to reporters (removed / need more info / not covered)
- Counsel-tested evidence export for both LE-10 and LE-11
Interface / code / data — one-page checklists
Run these as acceptance seeds — not as informal hunches. If you can’t export the Data row, you didn’t finish.
Interface (AV): Geo-triggered interstitial before covered media; method picker only from counsel allowlist; privacy explainer (what is checked / not retained); no checkbox-only path in covered states.
Interface (TIDA): Plain-language “Report nonconsensual intimate image” including non-account holders; statutory fields 1:1; confirmation / report number; status messaging (removed / need more info / not covered); menus distinct from DMCA and CSAM.
Interface must-not: Scrapable media without AV token; account-gated intimate-image report; soft-hide without CDN/object disable; marketing “48-hour” / “anonymous AV” claims the stack can’t meet.
Code (AV): Media/CDN signed URLs require av_session=passed in covered geos; refuse disallowed methods server-side; fail closed if vendor webhook signature fails — no checkbox fallback.
Code (TIDA): Dedicated intake → received_at / valid_at / sla_deadline_at = valid_at + 48h; hard disable + hash sweep jobs; separate queues from DMCA/CSAM; incomplete forms don’t start the SLA clock.
Data: AV — jurisdiction, method code, vendor, opaque token/session id, purge status (no illicit ID bytes). TIDA — request payload, timeline, operator actions, sweep results, notice logs, manifest hash. Export packs for both LE-10 and LE-11.
Template: Lawyer / Engineer card
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
| Lawyer | Engineer |
|---|---|
| For each property, are we in scope for which AV states — and on what counting method? | Is substantial_portion_covered counsel-set, and do media URLs 403 without av_session=passed? |
| Which verification methods are allowed per state? Is estimation signed off or forbidden? | Does the flow refuse disallowed methods server-side? |
| Non-retention: can we prove purge without keeping banned raw ID data? | Token-only storage + raw_purge_status audit? |
| Are we a covered platform under § 223a? Was process live by May 19, 2026? | Dedicated TIDA endpoint, non-auth path, immutable received_at? |
| On a valid request, can we show remove ≤ 48h + reasonable efforts on known identical copies? | SLA job, hash sweep table, hard CDN purge — not soft-hide? |
| Are TIDA, DMCA, and CSAM intakes legally and operationally distinct? | Distinct schemas, queues, and menus? |
Try this on your product tomorrow
Screenshots and exports beat opinions.
- From a covered geo (or geo-spoof lab), request a media manifest before AV. Did you get bytes?
- Complete AV; then ask storage: do we still hold the ID image?
- As a logged-out person, find “Report nonconsensual intimate image” from a content page in ≤3 taps.
- Submit a valid test request; export the ticket. Is
removed_at ≤ valid_at + 48h? Are copy sweeps logged?
- Open Report menus: Intimate image vs Copyright vs other abuse — three different forms?
If step 1 serves media, or step 4 can’t export a clock, you have policy language — not Law Engineering.
Where this goes next
Keep the loop moving — Law → Interface → Code → Data → Counsel sign-off.
- TIDA consent ledger & anti-weaponization (proof-of-consent, requester verify option, anti-weaponization) — Chapter 5B (LE-61).
- Method-stack depth for AV vendors and allowlists — under-18 age-verification chapter later in this guide.
- State NCII companion patterns (LE-12) and CSAM / NCMEC routing (LE-13) — orthogonal but operationally adjacent.
- DMCA intake kept parallel (LE-15).
- Chatbot / character products that also host media: Chapter 6 / LE-38 guardrails — don’t treat a system prompt as an AV or TIDA gate.
This chapter is for education and discussion. It isn’t legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
This chapter is for education and discussion. It is not legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
Chapter 5B — Worked Example: TIDA Consent Ledger & Anti-Weaponization
Pattern family: TAKE IT DOWN Act verification-centered consent ledger + anti-weaponization (LE-61). Deepens notice-and-removal (LE-11; Chapter 5). Sits beside adult UGC × card-network controls (LE-60; Chapter 10B), NCII reporting (LE-12; Chapter 20), and § 2257 producer recordkeeping (LE-14; Chapter 21).
Legal anchors (themes): TAKE IT DOWN Act, Pub. L. No. 119-12 → 47 U.S.C. § 223(h) (criminal) and § 223a (platform N&R; process by May 19, 2026; FTC enforcement). Valid written request themes: signature, locate info, good-faith nonconsent statement, contact. Remove as soon as possible but not later than 48 hours + reasonable efforts on known identical copies. Good-faith / “apparently unlawful” limitation themes when platforms act on requests. No statutory counter-notice analogous to DMCA § 512(g) — weaponization and due-process design pressure. Unsettled / counsel-owned: whether requester identity/liveness verification (when a contrary consent ledger entry is on file) is a lawful reading of collecting “relevant information to verify lack of consent.” Public-concern asymmetry: criminal § 223(h) vs civil N&R § 223a — different engines, same media object.
As of September 2026: Re-check FTC materials, penalty inflation, and counsel’s reading of requester-verification options before encoding any gate as “required by TIDA.”
Why this memo exists
A consent ledger you never query is a prop. Weaponization thrives when removal is frictionless against consented catalogs — and when you can’t show a reasoned audit on the clock.
The story in one glance
Picture a covered platform that already “does TAKE IT DOWN.”
There’s a Report Intimate Image button. Tickets get a 48-hour SLA. Hashes sweep known copies. Counsel can export a clock.
Then a removal request lands on an upload that already carries a proof-of-consent ledger entry: uploader government-ID + liveness + explicit consent capture, timestamps, vendor tokens from a KYC vendor — not a free-text “I consent” checkbox.
The requester refuses any identity check. Ops removes first and asks questions never.
Or the opposite: ops freezes for a week while Legal debates “apparently unlawful,” and the 48-hour clock dies in Slack.
Neither extreme is a program.
Walk this chapter with one intimate upload that already has a consent-ledger entry, and one removal request that conflicts with it. Ask three questions. Can you surface the ledger entry on the ticket in one click? Does the 48-hour clock still run while counsel weighs the conflict? If the requester refuses any identity check, what does your counsel-owned path do — remove, verify, or freeze forever?
This chapter deepens LE-11 into a verification-centered consent ledger and an anti-weaponization design: capture consent evidence when you publish intimate UGC; treat contrary consent as relevant information counsel may weigh; design requester verification as an optional, counsel-owned path when the ledger conflicts; keep the 48-hour clock honest; log the decision audit pack. Teaching reconstructions only — generic Brand / KYC vendor / analytics SDK language. No client names, incident dates, or message counts.
Plain English — clock out + ledger in
Chapter 5 taught the split: AV is a gate in; TIDA is a clock out. LE-61 adds a third machine that sits under the clock:
| Machine | Question | Typical miss |
|---|---|---|
| Visitor AV (LE-10) | Who may enter covered material? | Checkbox theater |
| TIDA N&R (LE-11) | How does nonconsensual intimate imagery leave ≤ 48h + identical copies? | Soft-hide; no clock; DMCA merge |
| Consent ledger + anti-weaponization (LE-61) | What proof-of-consent existed at publish — and how do we decide when a request conflicts with that ledger without inviting abuse or missing the clock? | Free-text consent; no requester friction when ledger conflicts; no audit pack |
Field rule — put this on the release checklist: A consent ledger is evidence you may weigh — not a veto of a valid § 223a request, and not a license to ignore the 48-hour duty while counsel “thinks about it.”
Remember: a Law Engineer is a licensed attorney with software and product expertise. Engineers build ledger schemas and clocks under that counsel’s oversight.
What the law is asking the product to do (themes)
Orient to eight pressures. Counsel owns the final map — especially the unsettled requester-verification option.
- Keep the LE-11 clock. Valid request →
sla_deadline_at = valid_at + 48h; hard disable + identical-copy sweep. LE-61 doesn’t soften that clock.
- Capture consent at publish for intimate UGC classes. Uploader gov-ID + liveness + explicit consent artifact →
consent_ledger_entrywith vendor method codes (KYC vendor tokens — not illicit ID bytes in the app DB).
- Ledger is relevant information. When a removal request names media that already has a contrary consent entry, the ticket must surface that entry to the decisioning path.
- Requester verification — counsel-owned option (unsettled). Some counsel read “relevant information to verify lack of consent” as allowing identity/liveness checks on the requester when a contrary consent ledger exists. Encode as a policy flag, not a hard statute claim. Fail closed on the clock either way: if you can’t complete verification inside the SLA design, remove (or counsel-approved hold with documented legal basis — rare).
- No statutory counter-notice. Unlike DMCA § 512(g), TIDA doesn’t hand you a put-back ritual. Design anti-weaponization (rate limits, duplicate-request detection, fraud signals) without inventing a fake counter-notice harbor.
- “Apparently unlawful” / good faith. When consent evidence is strong and the request looks abusive, document the good-faith analysis — don’t invent immunity folklore.
- Public-concern asymmetry. Criminal § 223(h) themes and civil N&R § 223a are different engines. Don’t train ops that “public interest” macros override a valid N&R ticket.
- Decision audit pack. Every remove / retain / escalate decision exports: request fields, ledger hit/miss, verification steps attempted, operator/counsel id, timestamps, copy-sweep results.
Sibling engines: Card-network depicted-person consent (LE-60) and § 2257 packages (LE-14) may reuse verification events — they don’t replace the TIDA ledger or the 48-hour router (LE-11 / LE-12).
Review this with counsel and eng on the same call. If Side A matches production, you’re still in the memo-to-coders handoff.
Side A — What loses (“remove everything / ignore the ledger”)
What goes wrong: Intimate uploads unlock on a ToS checkbox. Consent text is free-form and unstored.
Removal requests auto-remove with no ledger lookup. Competitors and ex-partners learn that a one-line form deletes a rival’s catalog.
Or Legal freezes every ticket that mentions “I consented” for seven days while the SLA bleeds. Requester identity is never asked even when the ledger screams conflict.
Decision reasons live in Slack. Identical-copy sweeps skip because “consent might exist somewhere.” Staff treat criminal and N&R paths as the same macro.
Why this matters in court / before a regulator: § 223a still expects a clear process and a clock. Weaponization thrives when removal is frictionless against consented catalogs and when platforms can’t show a reasoned audit. Freezing past 48 hours without a documented legal basis is the other failure. A ledger you never query is a prop.
Lawyer lens — what I’d ask on the call: You need a decision tree counsel owns — not vibe-based “protect creators” or “always trust reporters.”
Engineer lens: If tida_tickets never join consent_ledger_entries, the 48-hour export can’t explain retain-or-remove. If requester verification is hardcoded as “always required,” you may have overclaimed unsettled law.
Any hit means you don’t ship yet.
Non-compliance checklist (red flags)
- Intimate publish without gov-ID/liveness/explicit consent capture where product policy requires it
- Consent only as unchecked free text; no durable ledger object
- TIDA tickets that never surface contrary ledger hits
- Auto-remove with no audit pack
- Multi-day “Legal reviewing consent” without SLA math
- Fake DMCA-style counter-notice marketed as a TIDA right
- Requester verification sold as “required by TIDA” without counsel memo
- Criminal § 223(h) macros answering N&R tickets (or the reverse)
- Soft-hide; no identical-copy sweep log
- Client/vendor brand names or incident folklore in the runbook
Side B — What works better (ledger → surface conflict → decide on the clock)
What works better: Publish path for covered intimate classes: KYC vendor gov-ID + liveness + structured consent → consent_ledger_entry (opaque tokens, method codes, consent_version, timestamps).
TIDA intake (LE-11) remains first-class. On valid request, job joins ledger by media id.
If no hit → standard remove + sweep. If hit → ticket UI shows ledger summary; counsel policy chooses: (a) remove on clock (default safe), (b) optional requester verification step inside SLA budget, (c) escalate to named counsel with kill-clock rules.
Anti-weaponization: velocity caps, duplicate detection, account-linkage signals — logged, not silent. Every terminal state writes tida_decision_audit.
Card-program and § 2257 paths may reference the same verification events (LE-60 / LE-14) without merging schemas.
Fixed user story: Uploader publishes intimate UGC → ledger entry written → later, removal request → clock starts → ledger join → conflict UI → optional requester verify (if policy on) or remove → identical copies swept → audit pack exportable for FTC/tabletop.
Compliance checklist (green flags)
- Covered intimate publish hard-fails without ledger predicates (policy-defined classes)
consent_ledger_entriesqueryable by media id; tokens not raw ID images
- TIDA tickets show ledger hit/miss before decision
sla_deadline_atalways set; freeze paths are counsel-gated and rare
- Requester verification behind
requester_verify_policy_version(default off until counsel enables)
- No fake statutory counter-notice UX
- Anti-weaponization signals logged
- Decision audit pack: request + ledger + steps + actors + sweep
- Parallel LE-12 / LE-60 / LE-14 links without schema collapse
Template: Lawyer / Engineer card
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
| Lawyer | Engineer |
|---|---|
| Which intimate UGC classes require a consent ledger at publish? | Publish API hard-fail without consent_ledger_entry_id for those classes? |
| Is requester verification enabled for ledger-conflict tickets — and under which memo? | Is requester_verify_policy_version pinned; default deny-verify until enabled? |
| What happens if verification cannot finish inside the 48h design? | Clock wins: auto-remove or counsel legal_hold_exception_id only? |
| How do we describe good-faith / apparently-unlawful analysis without overclaiming? | Decision reason codes enumerated; free-text alone insufficient for close? |
| Anti-weaponization vs victim access — where is the line? | Rate limits / dup detection never block a first-time valid request path? |
| Criminal vs N&R routing clear? | Separate routers; training forbids cross-macros? |
| Can we export an FTC-ready audit pack? | One-click join: request, ledger, verify steps, sweep, actors, timestamps? |
| LE-60 / LE-14 reuse of KYC events? | Shared verification events, separate evidence objects? |
Interface / code / data — one-page checklists
Run these as acceptance seeds — not as informal hunches. If you can’t export the Data row, you didn’t finish.
Interface (must-show): Intimate publish consent checklist + KYC vendor status; TIDA report path distinct from DMCA; ticket view with ledger summary + SLA countdown; optional requester verify UX only when policy on; decision reason picker; reporter status without leaking ledger PII.
Interface (must-not): “Counter-notice under TIDA”; publish anyway for top earners; Slack-only decisions; requester verify as always-on friction for every ticket; merging criminal and N&R into one button.
Code: consent_ledger_write on publish; TIDA router join; sla_deadline_at; optional requester_verification_session; anti-abuse velocity; identical-copy sweep; tida_decision_audit writer; kill-switch publish on ledger schema break; no soft-hide.
Data: consent_ledger_entries (media_id, uploader_subject_id, kyc_method_codes, consent_version, vendor_token_refs, created_at); tida_requests; ledger_joins; requester_verify_events; tida_decision_audits; identical_copy_sweep_results; links to LE-60 / LE-14 objects without collapse.
Lost vs fixed (scene card)
| Lost | Fixed | |
|---|---|---|
| Publish consent | Checkbox / free text | Gov-ID + liveness + ledger entry |
| Request arrives | Blind auto-remove or week-long freeze | Join ledger; decide on the clock |
| Conflict | Ignore or invent counter-notice | Counsel policy + optional requester verify |
| Weaponization | One form deletes catalogs | Velocity / dup signals + audit |
| Proof | Slack thread | Decision audit pack |
| Siblings | One “adult blob” | LE-11 clock + LE-61 ledger + LE-60 / LE-14 parallel |
Try this on your product tomorrow
Screenshots and exports beat opinions.
- Pick one intimate UGC class. Can you export a consent ledger entry with method codes and timestamps — without dumping ID images?
- File a test TIDA request against media with a ledger hit. Does the ticket UI show the conflict?
- Confirm
removed_at ≤ valid_at + 48hstill holds when Legal is “looking at consent.”
- Is requester verification off by default until a counsel memo enables it?
- Search the UX for “counter-notice” on intimate-image flows — remove any TIDA-branded fake.
- Export one decision audit pack. Missing ledger join or sweep rows = demo.
- Confirm LE-60 / LE-14 packages reference verification events without owning the TIDA router.
If step 3 fails, you deepened the wrong machine.
Where this goes next
Keep the loop moving — Law → Interface → Code → Data → Counsel sign-off.
- Base AV + TIDA clocks — Chapter 5 (LE-10 / LE-11).
- Content advisories & ratings UX — Chapter 5C (LE-75).
- Adult UGC × card-network consent / KYC themes — Chapter 10B (LE-60).
- State NCII reporting — Chapter 20 (LE-12).
- § 2257 producer recordkeeping — Chapter 21 (LE-14) — sibling evidence, not substitute.
- T&S moderation / decision logs — Chapter 29 (LE-36); AI decision logging Chapter 6F (LE-66).
- Pattern Map LE-61 — Chapter 32.
Field rule — put this on the release checklist: The 48-hour clock still runs. A consent ledger is evidence you weigh on that clock — not a veto, and not an excuse to invent a counter-notice harbor.
This chapter is for education and discussion. It isn’t legal advice. Requester-verification options are unsettled — counsel owns enablement. No client names, incident dates, or employee names appear in this teaching reconstruction.
This chapter is for education and discussion. It is not legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
Chapter 5C — Worked Example: Content Advisories & Ratings UX
Pattern family: Content advisories & ratings UX (LE-75). Sits after TIDA consent ledger (LE-61; Chapter 5B) in the AV / intimate-imagery cluster (LE-10 / LE-11; Chapter 5). Cross-cuts T&S moderation (LE-36; Chapter 29).
Legal anchors (themes): Mature / suggestive platforms — even with a “no nudity” product rule — still need clear advisories and ratings before access; distinct from age-verification gates and from a buried Community Guidelines PDF; evidence that the advisory was shown (not merely published somewhere). Unfair/deceptive practice and youth-protection themes when the landing experience hides intensity.
As of September 2026: Teaching reconstructions — generic Brand. No client stack names.
Why this memo exists
Ratings, warnings, and age overlays are product surfaces. Soft-pedaling them for conversion is how you lose the advisory story.
If the advisory is theater and the media still plays, you didn’t finish. Gate playback; log the ack.
The story in one glance
Picture a “PG-13 social” that markets soft lifestyle content.
Landing is bright and vague. Users enter feeds of suggestive thumbnails with no rating chip, no advisory interstitial, and no record that anyone saw a warning. AV (LE-10) may or may not fire by geo. Community Guidelines live as a PDF in the footer. When parents, app stores, or regulators ask what users were told, Support pastes the PDF link.
Advisories are a product surface — not a policy attachment.
Picture a ratings badge that Marketing wants to soft-pedal. Ask: is the advisory persistent at the moment of access — or a one-time interstitial nobody can prove?
Plain English — advisory ≠ AV ≠ guidelines PDF
| Control | Meaning |
|---|---|
| Advisory / rating | Plain-language intensity label before feed/session access |
| Distinct from AV | Age gate proves age; advisory warns content character |
| Distinct from CG PDF | Guidelines govern conduct; advisory is pre-access notice |
| Shown evidence | Event that advisory UI was displayed + acknowledged if required |
| Re-show rules | Material rating change or new surface → re-advisory |
Field rule — put this on the release checklist: If the only “warning” is a footer PDF, you don’t have ratings UX.
Remember: a Law Engineer is a licensed attorney with software and product expertise.
Review this with counsel and eng on the same call. If Side A matches production, you’re still in the memo-to-coders handoff.
Side A — What loses (“footer PDF”)
What goes wrong: Marketing softens intensity. No interstitial. Ratings exist in a CMS no user sees. AV conflated with advisory (“we age-gated, so we’re done”). Suggestive thumbnails above the fold on the marketing domain. No advisory_shown event. A/B removes the soft warning for conversion.
Any hit means you don’t ship yet.
Non-compliance checklist (red flags)
- No pre-access advisory on mature/suggestive surfaces
- Guidelines PDF treated as the warning
- AV gate reused as content advisory
- No evidence of display/ack
- Experiments can strip advisory UI
- Thumbnail intensity exceeds disclosed rating
Side B — What works better (rate → show → record → gate)
What works better: Surface-level content_rating + advisory copy versioned by counsel. Before first access to rated surfaces, interstitial or equivalent unavoidable notice; optional ack where counsel requires. Store advisory_shown / advisory_ack with rating_version. Feeds and deep links respect rating. Distinct from AV state machine (LE-10) and from TIDA/NCII paths (LE-11 / LE-61). T&S (LE-36) can escalate rating on content class changes. Experiment lint forbids removing advisory components (LE-62).
Compliance checklist (green flags)
- Pre-access advisory on in-scope surfaces
- Rating version on evidence events
- AV and advisory separately logged
- CG PDF not substituted for advisory
- Re-show on material rating change
- Experiment CI protects advisory UI
Template: Lawyer / Engineer card
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
| Lawyer | Engineer |
|---|---|
| Which surfaces need advisory vs AV vs both? | Separate state machines; both events stored? |
| What copy/rating labels are approved? | rating_version + copy pack in CMS? |
| Is ack required or display-only? | Gate encodes counsel choice per geo/surface? |
| How do we prove the user saw it? | advisory_shown (+ ack) exportable? |
| Can growth strip the interstitial? | LE-62 experiment lint blocks removal? |
Interface / code / data
Interface: Pre-access advisory interstitial / modal; persistent rating chip on mature surfaces; settings re-view; no reliance on footer-only PDF.
Code: rating registry; advisory gate middleware; deep-link respect; experiment allowlist; join points with AV without merging machines.
Data: content_ratings; advisory_copy_versions; advisory_shown_events; advisory_ack_events; surface_id links.
Lost vs fixed
| Lost | Fixed | |
|---|---|---|
| Notice | Footer PDF | Pre-access advisory |
| Proof | “It’s in Guidelines” | shown/ack events |
| AV | Conflated | Separate machines |
| Growth | Strip warning | Lint / allowlist |
Try this on your product tomorrow
Screenshots and exports beat opinions.
- Cold session to a suggestive feed — is an advisory unavoidable before content?
- Export last 100 sessions —
advisory_shownpresent where rating requires it?
- Confirm AV pass alone doesn’t skip advisory.
- Attempt experiment hiding advisory — CI fail?
- Change rating version — do returning users re-see?
Where this goes next
Keep the loop moving — Law → Interface → Code → Data → Counsel sign-off.
- Age verification + TAKE IT DOWN — Chapter 5 (LE-10 / LE-11).
- TIDA consent ledger — Chapter 5B (LE-61).
- T&S moderation stack — Chapter 29 (LE-36).
- Legal review triggers (experiment lint) — Chapter 31B (LE-62).
- Pattern Map LE-75 — Chapter 32.
Field rule — put this on the release checklist: Ratings are shown before access — or they are decoration.
This chapter is for education and discussion. It isn’t legal advice. No client names appear in this teaching reconstruction.
This chapter is for education and discussion. It is not legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
Chapter 6 — Worked Example: Agentic Chatbot Guardrails (Lost vs Fixed)
Pattern family: “AI isn’t advice” + human-in-the-loop (LE-30) and character / customer-support chatbot guardrails (LE-38)
Legal anchors: Negligent-misrepresentation and reliance themes (Restatement (Second) of Torts § 552); FTC Act § 5 accuracy / deception themes for AI marketing claims; EU AI Act Art. 50 chatbot transparency where Union-facing interactive AI is in scope (transparency in force as of 2 Aug 2026 for covered systems — confirm matter facts; Art. 50 is not a U.S. HITL statute); COPPA / under-13 overlays (LE-09); state adult AV when sexual character modes are in scope (LE-10). Garcia v. Character Techs. is cited here only for a pleading-stage design-vs-expression distinction — not as a merits rule or a national “AI is a product” holding.
As of September 2026: Confirm EU Art. 50 applicability and U.S. FTC posture for your facts before you ship agentic surfaces.
Why this memo exists
Can the agent click Buy, post, or ‘agree’ without a human gate?
Probabilistic systems may propose. Deterministic Law Engineering gates dispose. Put the gate in the stack — not only in the prompt.
The story in one glance
Illustrative teaching figures. Character apps, “AI companions,” and agentic commerce assistants share one failure: a probabilistic model is asked to carry a deterministic legal duty — assent, age, cancel, payment, professional advice boundaries — without a gate counsel can prove.
Pull up a chat window while you read. Ask: if this bot could spend money, change billing, or “agree” for the user, what would stop it? If the answer is “the system prompt,” keep reading.
Picture the bot with tool-calling enabled. Ask: if it tried to buy, file, or “agree” for the user right now, what server gate would stop it — a confirm id, or a hopeful system prompt?
Why counsel must gate release before agents can bind the company
An agent that can draft is useful. An agent that can click, buy, post, file, or message a counterparty is a company actor with a stochastic keyboard.
Human-in-the-loop (HITL) means a human must confirm before a high-stakes tool runs — and the server must enforce that confirm. A modal the API can skip isn’t HITL.
| Layer | Probabilistic agent (useful) | Deterministic Law Engineering gate (required) |
|---|---|---|
| Notice | May paraphrase a disclaimer | Persistent disclosure impression logged (surface, locale, model_version) |
| Assent / high-stakes act | May say “sure, I’ll send it” | hitl_confirm_id bound to output_hash before tool executes |
| Age / adult modes | May “roleplay carefully” | Hard block / AV before forbidden modes |
| Safety | May refuse in prose | Classifier + refusal template + exportable safety_category |
| Support | May loop empathetically | Max-turn → human_handoff_id |
Field rule — put this on the release checklist: Probabilistic systems may propose. Deterministic Law Engineering gates dispose. Counsel signs the release that turns tools on — not a prompt that hopes they behave.
Rubber-stamp HITL (pre-checked, auto-advanced, or API clients that skip the modal) is weak mitigation. Terms-of-service-only disclaimers do not universally defeat negligence, products, discrimination, or FTC § 5 theories when the surface tells a different story.
Review this with counsel and eng on the same call. If Side A matches production, you’re still in the memo-to-coders handoff.
Side A — What loses
Don’t ship this. If your current build matches Side A, stop the release train and fix it with counsel.
What goes wrong: Marketing calls the bot a “therapist,” “robot lawyer,” or “guaranteed picks.” The only “AI can be wrong” language lives in a footer PDF. Character catalog opens without age assurance. Tool-calling is open: the model can invoke payment, email, or ticketing APIs whenever the conversation vibes that way. Jailbreak tests are a Slack thread, not continuous integration (CI). Support bots apologize forever; no human queue id.
Why this matters in court / before a regulator:
- Reliance risk. Users treat fluent output as professional advice. Buried disclaimers fight prominent overclaims — and lose the narrative.
- Agency without evidence. If the agent “agrees,” purchases, or sends a letter, discovery asks for the confirm event. A chat transcript isn’t a formation or HITL record.
- Minors / sexual modes. Child-directed or unknown-age romantic/sexual paths are a design failure mode, not a content-moderation afterthought (pair LE-09 / LE-10 where facts fit).
- Injection & tool abuse. Prompt injection that exfiltrates tools or secrets is an engineering acceptance-test problem. Soft system-prompt rules aren’t gates.
- Missing transparency. Where EU Art. 50 applies, users must know they interact with AI — persistent UI, not a one-time toast.
Lawyer lens — what I’d ask on the call: You’ll defend design choices (safeguards tested, age gates, crisis scripts, tool allowlists) — not only particular model words. Don’t invent a U.S. statute that “requires HITL”; document why your gates exist under consumer-protection, negligence, contract, and (if applicable) foreign transparency duties.
Engineer lens: If POST /tools/pay succeeds without a server-validated confirm token, the modal was decoration — incomplete, not a gate.
Any hit means you don’t ship yet.
Non-compliance checklist (red flags)
- Professional-title marketing without licenses / substantiation
- Disclosure only in ToS or first-run modal that never returns
- High-stakes tools callable from raw model output
- Pre-checked or sub-second HITL
- No age gate before adult/romantic character modes
- No refusal path for medical dosage / legal filing / self-harm categories (counsel-set scripts)
- Jailbreak corpus absent from CI
- Support bot with no escalate-to-human control
- No export of disclosures, confirms, model versions, safety events
Side B — What works better
Here’s the build worth shipping — gates, records, and an export counsel can defend.
LE-30 — notice + HITL that actually blocks
- Persistent disclosure on every AI surface: AI-generated; not a substitute for legal / medical / financial advice when those domains are in product scope.
- High-stakes category list owned by counsel: send letter, move money, change account legal settings, medical triage claims, etc.
- Confirm modal shows action summary + disclaimer; server requires
hitl_confirm_idmatchingoutput_hash.
- Enterprise mode: named reviewer role enforced server-side — not only in the web client.
- Claim review gate: Content management system (CMS) blocks marketing strings that contradict the approved disclosure set.
- Evidence:
ai_disclosure_impressions,ai_hitl_confirms,ai_model_versions,ai_high_stakes_actions.
LE-38 — chat / character / customer-support specifics
- Badge every turn: “You’re chatting with AI / not a real person / not a lawyer, doctor, or financial advisor.” EU Art. 50 wording where deployment requires it.
- Policy classifier on every turn; log
safety_category; fail closed on unknown high-risk tools.
- Age / AV before sexual or romantic modes policy forbids for minors or unknown age.
- Crisis / self-harm: refusal template + resource links (counsel-approved); optional human escalate — not engagement that prolongs harm.
- Tool allowlist server-side; payment/legal-file APIs never free-floating.
- Eval harness in CI: jailbreak and policy suites must pass on the commit that ships.
- Handoff:
human_handoff_idwith transcript reference; max-turn force handoff for CS loops.
- Retention: minimize intimate chat memory; time-to-live (TTL) + purpose limitation; legal-hold flag when needed.
Compliance checklist (green flags)
- Disclosure visible without scroll on mobile chat
- HITL token required for high-stakes tool endpoints
- Age-fail blocks adult character modes
- Safety refusals exportable by
model_version
- Jailbreak suite red on CI blocks release
- Human escalate always visible when humans exist
- Counsel sign-off checklist completed before agentic tools go live in production
Interface / code / data — one-page checklists
Run these as acceptance seeds — not as informal hunches. If you can’t export the Data row, you didn’t finish.
Interface (must-show): persistent AI disclosure / badge every turn (locale-aware where EU Art. 50 applies); confirm modal with action summary + disclaimer before high-stakes tools; age/AV gate before forbidden character modes; visible human escalate when humans exist; counsel-approved crisis refusal copy.
Interface (must-not): professional-title overclaims; disclosure only in ToS or a one-time toast; pre-checked or sub-second HITL; romantic/sexual modes for age-unknown or under-age profiles; support loops with no handoff control.
Code: Server-side tool allowlist; high-stakes endpoints require hitl_confirm_id matching output_hash; classifier on every turn with fail-closed unknown high-risk tools; age-fail blocks adult modes; CMS/claim review fails contradictory marketing; jailbreak + policy suites in CI gate release; max-turn forces human_handoff_id.
Data: ai_disclosure_impressions (surface, locale, model_version); ai_hitl_confirms; ai_model_versions; ai_high_stakes_actions; ai_safety_events (safety_category); human_handoff_id + transcript reference. Exportable incident pack for counsel.
Template: Lawyer / Engineer card
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
| Lawyer | Engineer |
|---|---|
| Which actions may bind the company (pay, post, file, agree)? | Which tool endpoints are allowlisted — and which require hitl_confirm_id? |
| Is disclosure conspicuous on the chat surface, not only in ToS? | Disclosure component present every turn; impression logged? |
| Are we overclaiming professional status in ads or store listings? | CMS / claim flags fail CI if contradictory copy ships? |
| Minor / sexual / crisis policies approved for this persona set? | Classifier + mode flags + AV/age gates wired before catalog? |
| Where EU Art. 50 applies, is transparency copy approved? | Locale-aware badge; no hide-after-first-message dark pattern? |
| Can we reconstruct an incident six months later? | Export: disclosures, confirms, safety events, model_version, harness run? |
Agentic commerce — the same loop, sharper teeth
Checkout agents and “buy for me” assistants amplify formation, ROSCA cancel, and payment risks from earlier chapters:
- An agent that accepts Terms for a user without a recorded assent event recreates Specht-style proof problems in a new costume.
- An agent that renews or purchases without a deterministic cancel path recreates easy-cancel failures.
- An agent that shares intimate images or deepfakes trips LE-11 / LE-32 overlays — the chat UI is still a covered surface if the product hosts UGC.
Release gate: Counsel doesn’t “review the prompt.” Counsel signs that Interface → Code → Data gates exist for every tool that can create legal consequences — and that probabilistic paths can’t skip them.
For dual-consent gaps, pre-flight bot policy, terms ledgers, payment mandates, and UETA/E-SIGN orientation when an agent binds, continue in Chapter 6B (Agentic Commerce & Automated Legal Decisions) — LE-43…LE-47. This chapter keeps disclosure, classifiers, tool allowlists, and HITL; Chapter 6B owns commerce binds.
Try this on your product tomorrow
Screenshots and exports beat opinions.
- Open character or CS chat on a 390px-wide viewport. Is the AI disclosure visible without scrolling?
- Ask the bot to send money, email counsel letterhead, or change billing. Does the API 403 without a confirm id?
- Create an under-age or age-unknown test profile. Are romantic/sexual modes hard-blocked?
- Run your jailbreak corpus in CI against the build you would ship.
- Force a support loop past max turns — does a
human_handoff_idappear?
- Export one incident pack. Missing marketing/model/confirm rows means a demo — not a release.
Where this goes next
Keep the loop moving — Law → Interface → Code → Data → Counsel sign-off.
Co-pilot skin (draft≠send / PVS) — Chapter 6H (LE-70); AI Terms congruence — Chapter 6G (LE-69).
AI surface inventory / model register — Chapter 6D (LE-64); shadow AI egress — Chapter 6E (LE-65); decision logs / CoT — Chapter 6F (LE-66).
Chapter 6B — agentic commerce / automated legal decisions (LE-43…LE-47) when agents buy, renew, or agree.
Enterprise no-training defaults (LE-31) and synthetic media labels (LE-32).
Broader Trust & Safety patterns (LE-36) when chat sits on UGC platforms.
Revisit formation (LE-01, Chapter 2) and cancel (LE-03, Chapter 3) whenever agents touch checkout.
This chapter is for education and discussion. It isn’t legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
This chapter is for education and discussion. It is not legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
Chapter 6B — Worked Example: Agentic Commerce & Automated Legal Decisions
Pattern family: Agentic commerce / automated legal decisions (LE-43…LE-47; overlaps LE-30 / LE-38)
Legal anchors: Uniform Electronic Transactions Act (UETA) § 14 (automated transactions / electronic agents) and § 10 (change or error; opportunity to prevent or correct); federal E-SIGN orientation that a transaction isn’t denied legal effect solely because an electronic agent was involved (15 U.S.C. § 7001(h) themes); ordinary agency, formation, and consumer-protection overlays when an agent buys, renews, or “agrees.” Soft orientation only — not a national holding that every unsupervised LLM click is (or isn’t) binding.
As of September 2026: Confirm your state’s UETA text, E-SIGN carve-outs, card-network mandate rules for agent spend, and counterparty bot / API policies before shipping unsupervised checkout tools.
Why this memo exists
When an agent proposes a cart, a human still has to confirm the consequential legal acts — or you invent assent out of automation.
If an agent can bind money or terms without a recorded human confirm, counsel hasn’t finished the design.
The story in one glance
Illustrative teaching figure. Chapter 6 covered disclosure, classifiers, tool allowlists, and “can’t silent-agree.” This chapter is the sharper commerce problem.
Picture a “buy for me” assistant. It finds a deal, clicks Agree, pays, and emails a receipt. Who agreed to arbitration? Who authorized that spend ceiling? If those answers are fuzzy, you’re in this chapter.
An agent that binds — purchase, renew, arbitration/IP grant, payment — when neither human principal nor merchant clearly consented to that mode of dealing is the core risk.
Picture an agent with a payment tool and a vague user prompt. Ask: which automated legal decision (ALD) gate requires human confirm before money moves?
The dual consent gap
Classic online formation asks: did this human get conspicuous notice and unambiguous assent? Agentic checkout splits the question:
- Principal side. The human never reviewed the Terms, price, renew cadence, or dispute clause the agent accepted. A chat log saying “sure, buy it” isn’t a formation or HITL record.
- Counterparty side. The site’s ToS, robots rules, or machine-readable policy may prohibit bots / automated checkout. Preferring an authorized API avoids a deal the merchant never offered.
When both fail, neither party clearly consented to the mode of dealing. Close the gap with deterministic gates — not a system prompt that hopes the model behaves.
Field rule (commerce edition): Probabilistic systems may propose carts and clause summaries. Deterministic gates dispose assent, payment, and consequential binds. Full autonomy that deletes checkpoints is a design risk, not a feature.
Soft statute orientation (1999 carts vs 2026 ALD)
Automated legal decisions (ALD) here means agent tool-calls that create legal consequences — buy, renew, accept dispute clauses, grant IP, move money.
UETA § 14 contemplates that a contract may be formed by interacting electronic agents — even if no individual reviewed the agents’ actions or resulting terms — and by an individual interacting with an electronic agent when they know (or have reason to know) their action will complete the deal. E-SIGN similarly orients that legal effect isn’t denied solely because an electronic agent participated.
That architecture assumed 1999-style carts and electronic data interchange (EDI): deterministic scripts under a known mandate. 2026 probabilistic ALD — LLM tool-calling that paraphrases Terms, improvises clicks, and invents “I agreed for you” — is different. Soft reading: § 14 tells designers that agency can bind; it does not excuse missing mandates, spoofed identity, bot-banned surfaces, or deleted error checkpoints.
UETA § 10 turns, in automated transactions involving an individual, in part on whether the electronic agent provided an opportunity to prevent or correct the error — plus related prompt-notice / unwind conditions. Design implication: preserve review and correction surfaces before consequential bind. “Fully autonomous” checkout that removes those checkpoints is a deliberate § 10-facing design risk (and a formation / UDAP narrative gift).
Review this with counsel and eng on the same call. If Side A matches production, you’re still in the memo-to-coders handoff.
Side A — What loses
Don’t ship this. If your current build matches Side A, stop the release train and fix it with counsel.
What goes wrong: A “buy for me” agent scrapes checkout, spoofs a browser user-agent (UA) — the string that identifies the browser to the server — clicks I Agree and Pay, and emails a receipt. The human never saw arbitration, IP license, auto-renew, or total price. The merchant’s ToS bans bots. No terms ledger, no payment mandate from a verified principal, no human confirm on consequential binds. Support can only say “the agent handled it.”
Why this matters in court / before a regulator: (1) Dual consent gap — mode of dealing never bargained. (2) Evidence vacuum — no terms_hash, key-term summary, or hitl_confirm_id. (3) Identity evasion — spoof stacks invite ToS breach and merchant repudiation (detect and refuse; do not build evasion). (4) Spend without mandate — networks/issuers expect principal authorization, not an orphaned agent credential. (5) Governance blank — no pre-flight, materiality breakers, or spend approver to show later.
Lawyer lens — what I’d ask on the call: You defend (or attack) the mode of dealing and the mandate, not only the SKU. “The model meant well” isn’t assent.
Engineer lens: If checkout.complete succeeds without pre-flight allow, honest identity, payment-mandate token, and (for consequential classes) HITL confirm, the agent is a liability keyboard — incomplete paper compliance dressed as automation.
Any hit means you don’t ship yet.
Non-compliance checklist (red flags)
- Agent accepts Terms / buys / renews with no human-reviewed key-term summary
- No pre-flight of ToS, robots, or machine-readable bot policy
- Spoofed UA / “look human” stack; scrape-checkout when an authorized API exists
- No terms ledger; high-risk clauses (arb, IP assignment, auto-renew) never escalate
- Agent spend without verified principal mandate / spend ceiling
- Full autonomy path that removes prevent/correct checkpoints before bind
Side B — What works better (LE-43…LE-47)
Fixed building blocks
- Pre-flight (LE-43). Before act: evaluate ToS bot clauses,
robots.txt, and any published machine-readable agent policy. Surface bot bans; prefer authorized APIs; fail closed when policy is unknown or prohibitive.
- Honest identification. Truthful agent identity/purpose in headers or API client metadata. No evasion stack absent explicit human direction for a counsel-scoped exception — and log that direction. Circumvention is out of scope; refusing it’s in scope.
- Consequential-bind HITL (LE-44). Purchase, renew, arbitration assent, IP grant/license, account-legal changes: human confirm + key-term summary (price, interval, cancel path, dispute clause, unusual IP). Server requires
hitl_confirm_idbound to summary hash.
- Terms ledger + materiality breakers (LE-45). Append-only ledger of URLs/versions/
content_hash/clause flags. Breakers pause + HITL on arb/class waiver, broad IP assignment, auto-renew, unusual liability shifts, or hash drift mid-flow.
- Payment mandate (LE-46). Verified principal authorization: who, instrument token, ceiling, merchant category code (MCC)/merchant class, expiry. Card-network reality at high level: mandate story tied to the cardholder/principal — not an orphaned agent secret.
- Optional machine-readable policy (LE-47). Publish/consume emerging
.well-known/…/ structured agent policies (allowed agents, required identity, bind rules). Emerging pattern — not enacted law. Interoperability aid; not a substitute for ToS review or human gates.
Short governance-evidence box
Boards and officers need evidence of a system — pre-flight logs, mandate registers, HITL confirms, terms ledgers — not a memo that “AI is exciting.” One exportable incident pack is stronger oversight evidence than a slide deck alone. Ordinary oversight hygiene only; this chapter isn’t a fiduciary treatise.
Compliance checklist (green flags)
- Pre-flight allow/deny logged before first consequential tool call
- Honest agent identity; evasion paths absent from default builds
- Consequential classes blocked without HITL + key-term summary hash
- Terms ledger exportable; materiality breaker pauses on arb / IP / renew / hash drift
- Payment mandate token + spend ceiling enforced server-side
- Optional consume/publish of machine-readable agent policy where offered
- Chaos test: bot-banned site → stop and surface reason, not “try harder”
Template: Lawyer / Engineer card
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
| Lawyer | Engineer |
|---|---|
| Did both sides consent to agentic dealing, or only to a human checkout we never showed? | Does pre-flight fail closed on bot ban / unknown policy before tools run? |
| Which acts are consequential binds needing HITL + key-term summary? | Which endpoints require hitl_confirm_id matching summary_hash? |
| Can we prove exact Terms/clauses accepted? | Is a terms ledger writing version + content_hash + clause flags? |
| Is there a principal payment mandate with ceiling and expiry? | Is orphaned agent token use impossible without mandate_id? |
| Are we representing the agent truthfully to counterparties? | Are identity headers honest; are evasion utilities deleted from prod? |
| If UETA § 10 themes apply, did we keep prevent/correct checkpoints? | Can full-autonomy flags remove review UI for bind classes? (Must not.) |
Interface / code / data — one-page checklists
Run these as acceptance seeds — not as informal hunches. If you can’t export the Data row, you didn’t finish.
Interface: Pre-flight status (allowed / banned / unknown) before act; key-term summary + confirm on purchase/renew/arb/IP; honest “acting as agent for [principal]” disclosure; clear stop when policy blocks; optional link to counterparty machine-readable agent policy.
Interface must-not: Silent agree; spoof-as-human chrome; confirm-shaming past materiality breakers; spend without showing ceiling/mandate scope.
Code: Gates: pre-flight allow → identity assert → mandate check → (if consequential) HITL confirm → ledger write → bind tool. Prefer official APIs over HTML checkout automation. Counsel-owned materiality rules; fail closed on unknown high-risk clauses. No production path that strips prevent/correct steps for bind classes.
Data: agent_preflight_events, agent_identity_assertions, terms_ledger (url, version, hash, clause flags), agent_hitl_confirms, payment_mandates, agent_bind_actions (append-only); retain for disputes/chargebacks/CID tabletop.
Try this on your product tomorrow
Screenshots and exports beat opinions.
- Point a staging agent at a site that bans bots. Does it stop and explain — or invent a workaround?
- Attempt a renew or arb-accept without HITL. Expect API 403.
- Complete one allowed purchase. Export terms ledger + mandate id + confirm hash.
- Change Terms mid-flow (hash drift). Does a materiality breaker fire?
- Ask finance: which principal authorized this agent’s spend ceiling? If “the model has the card,” you don’t have LE-46 yet.
Where this goes next
Keep the loop moving — Law → Interface → Code → Data → Counsel sign-off.
- AI surface inventory — Chapter 6D (LE-64); shadow AI — Chapter 6E; decision logs — Chapter 6F.
- Revisit formation (LE-01, Chapter 2), ROSCA/cancel (LE-03, Chapter 3), and payment evidence when agents touch checkout.
- Keep Chapter 6 guardrails (LE-30 / LE-38) for disclosure, classifiers, and tool allowlists — this chapter doesn’t replace them.
- Operating-model release gates later in this guide: counsel signs Interface → Code → Data for every tool that can create legal consequences.
This chapter is for education and discussion. It isn’t legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
This chapter is for education and discussion. It is not legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
Chapter 6D — Worked Example: AI Surface Inventory & Model Register
Pattern family: AI surface inventory / model–vendor register (LE-64). Sits after agentic chatbot guardrails (LE-30 / LE-38; Chapter 6) and agentic commerce / ALD (LE-43…LE-47; Chapter 6B). Feeds shadow-AI egress (LE-65; Chapter 6E) and AI decision logging (LE-66; Chapter 6F).
Legal anchors (themes — checklist against inventory, not treatise): EU AI Act risk-class / transparency themes; DSA systemic-risk / recommender themes for very large platforms; Colorado AI Act (and peer state AI laws) high-risk system duties; GDPR Art. 22 automated decision-making / profiling themes; US sector and FTC unfairness themes when AI claims overreach. Orientation only — counsel maps which regimes actually attach.
As of September 2026: Re-check AI Act applicability dates, Colorado rulemaking, and your Art. 22 DPIA posture before anyone claims “we inventoried, therefore compliant.”
Why this memo exists
Before you argue about guardrails, inventory every model, tool call, and place output can leave the building.
You can’t gate what you haven’t named. Inventory first; then attach counsel-owned gates.
The story in one glance
Picture a product counsel asking a simple question in a release meeting: Where does generative AI touch the user?
Engineering answers with three branded chat widgets. Growth mentions a “smart reply” that shipped last quarter. Support uses a summarizer nobody filed. A vendor SDK silently embeds embeddings for “personalization.” The privacy notice still says the company doesn’t use automated decision-making.
Legal can’t govern what Legal can’t see.
Walk the release meeting with a blank inventory open. Ask: if an AG letter named every AI surface that touched a user’s data last quarter, could you export the list tonight — or would you be inventing it from Slack?
This chapter builds the missing artifact: every generative and review surface → model → endpoint → vendor/DPA (data processing agreement) → data classes. The inventory is the gate. Regimes (AI Act / DSA / Colorado AI / Art. 22) are then checked against the map — not waved as a slogan. Teaching reconstructions only; generic Brand / analytics SDK / KYC vendor language.
Plain English — if it isn’t on the register, it isn’t governed
| Row | Must answer |
|---|---|
| Surface | User-facing chat, silent rewrite, ranking assist, T&S classifier, support summarizer, code-assist on prod data, agent tool… |
| Mode | Generative (writes) vs review/score (classifies) vs both |
| Model | Name / version / host (self / vendor) |
| Endpoint | URL or internal service id; auth path |
| Vendor / DPA | Contract id; subprocessors; training-on-inputs default |
| Data classes | What prompts/context may include (PII, contents, payments, biometrics…) |
| Human role | HITL required? Advisory only? |
| Owner | Eng + counsel named pair |
Field rule — put this on the release checklist: An unlisted AI surface is an ungoverned legal act waiting for a CID.
Remember: a Law Engineer is a licensed attorney with software and product expertise. Engineers maintain the register under that counsel’s oversight.
What the law is asking the product to do (themes)
- Inventory first. You can’t apply AI Act risk tiers, Colorado high-risk duties, DSA recommender transparency, or Art. 22 notices to ghosts.
- Separate generative vs review. Different disclosure and logging needs (LE-66).
- Vendor honesty. Personal SaaS keys and “free tier” models aren’t enterprise DPAs (LE-65).
- Data-class tags. Same model with support tickets vs public FAQ isn’t the same row.
- Checklist, not treatise. Map each in-scope row to: transparency / labeling, risk management, logging, human oversight, user rights — as counsel directs.
- Release gate. New surface or model bump without register update = blocked merge.
- Congruence. Privacy notice and marketing claims must match the register (LE-41 adjacency).
Review this with counsel and eng on the same call. If Side A matches production, you’re still in the memo-to-coders handoff.
Side A — What loses (“we have a chatbot policy”)
What goes wrong: One PDF covers “AI use.” Shadow features ship behind flags. Vendor list is a spreadsheet from 2024.
Art. 22 notice says “we don’t do ADM” while a credit-like scorer ranks creators. EU pages lack labels the AI Act themes expect for generative outputs.
Nobody can list endpoints that receive user contents. When a regulator asks for the model inventory, Legal opens Slack.
Why this matters in court / before a regulator: Regimes attach to systems and uses, not to brand slogans. An incomplete register makes every downstream control (HITL, logging, no-training, shadow-AI bans) unenforceable.
Any hit means you don’t ship yet.
Non-compliance checklist (red flags)
- AI features live that are absent from the register
- Generative and review collapsed into one row
- Vendor “DPA” is a clickwrap free tier
- Data classes blank or “misc user data”
- Privacy notice contradicts register
- Model version unpinned (“latest”) in production
- No counsel owner on high-risk rows
- Checklist regimes never mapped to rows
Side B — What works better (register → classify → gate)
What works better: Living ai_surface_register in the same discipline as the data map (Chapter 7). CI fails if a new inference client ships without a register id.
Counsel reviews high-risk / ADM-shaped rows before enable. Generative outputs route labeling/disclosure policies; review models route decision-log policies (LE-66).
Vendor rows require enterprise account + DPA id. Quarterly diff: runtime telemetry of model endpoints vs register.
Fixed user story: Squad proposes “smart compose” → opens register PR → data classes + vendor + HITL → counsel classifies risk / Art. 22 posture → enable flag only with register_version → runtime emits surface_id on every call.
Compliance checklist (green flags)
- Every generative/review surface has a register id in prod telemetry
- Model version pinned; endpoint allowlisted
- Vendor/DPA id required for external calls
- Data-class tags drive redaction / no-training defaults (LE-31)
- Regime checklist completed for in-scope rows
- Privacy/marketing congruence scan includes AI claims (LE-41)
- Named counsel + eng owners
Template: Lawyer / Engineer card
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
| Lawyer | Engineer |
|---|---|
| Which surfaces are generative vs review vs ADM-shaped? | Register enums enforced; telemetry requires surface_id? |
| Which regimes arguably attach to each row? | Checklist fields stored per row; CI warns on blank high-risk? |
| Are vendor training defaults acceptable? | Enterprise endpoint only; free-tier hosts blocked? |
| Do notices match the inventory? | Congruence job diffs notice ↔︎ register? |
| Who may add a row? | Register PR + counsel approve for high-risk classes? |
Interface / code / data — one-page checklists
Run these as acceptance seeds — not as informal hunches. If you can’t export the Data row, you didn’t finish.
Interface (must-show): Admin register UI (or reviewed markdown-as-code); user-facing AI disclosures tied to surface_id; vendor/status for ops.
Interface (must-not): Undocumented “smart” features; “AI-powered” marketing for unlisted surfaces.
Code: ai_surface_register version; allowlisted endpoints; client SDK requires surface_id; CI grep for raw vendor hosts; kill switch by surface.
Data: surfaces, models, endpoints, vendor_dpa_ids, data_class_tags, risk_class_counsel, hitl_required, owners, changelog.
Lost vs fixed (scene card)
| Lost | Fixed | |
|---|---|---|
| Ask “where is AI?” | Three widgets + shrugs | Living register |
| New model | Ship behind flag | Register PR + counsel |
| Vendor | Free-tier key in env | Enterprise + DPA id |
| Regulator ask | Slack archaeology | Export register version |
Try this on your product tomorrow
Screenshots and exports beat opinions.
- List every feature that calls an LLM or classifier in prod — compare to the register. Diff is your backlog.
- Pick one generative surface: can you name model version, endpoint, vendor DPA, and data classes in one screen?
- Block a staging deploy that calls a host not on the allowlist — did CI catch it?
- Diff privacy notice “automated decision” language against register ADM-shaped rows.
- Confirm Chapter 6 / 6B features appear as rows — not “covered by vibe.”
Where this goes next
Keep the loop moving — Law → Interface → Code → Data → Counsel sign-off.
AI Terms congruence — Chapter 6G (LE-69); co-pilot skin — Chapter 6H (LE-70).
Chatbot guardrails — Chapter 6; agentic commerce — Chapter 6B.
Shadow AI / personal LLM egress — Chapter 6E (LE-65).
Decision logs / CoT containment — Chapter 6F (LE-66).
Enterprise no-training — Chapter 26 (LE-31).
Living data map — Chapter 7; privacy threshold inventory — Chapter 7C (LE-67).
Pattern Map LE-64 — Chapter 32.
Field rule — put this on the release checklist: Regimes attach to systems you can name. Name them first — then apply the checklist.
This chapter is for education and discussion. It isn’t legal advice. AI Act / DSA / Colorado AI / Art. 22 citations are orientation checklists against your inventory — not a compliance certificate.
This chapter is for education and discussion. It is not legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
Chapter 6E — Worked Example: Shadow AI & Personal LLM Egress
Pattern family: Shadow AI / personal LLM accounts / data egress (LE-65). Follows AI surface inventory (LE-64; Chapter 6D). Sits with enterprise no-training (LE-31; Chapter 26) and privacy congruence (LE-41; Chapter 4).
Legal anchors (themes): Confidentiality / trade-secret and employment-policy themes; privacy-notice accuracy when staff paste user data into consumer AI tools; vendor retention/training defaults on consumer tiers; security / breach themes when regulated data leaves the perimeter; GDPR / state privacy “processor instructions” themes when staff become an accidental disclosure path.
As of September 2026: Consumer-tier training and retention defaults change — verify current enterprise vs consumer terms before policy copy ships.
Why this memo exists
Where did that paste into a personal LLM go?
Shadow AI isn’t a training footnote — it’s an egress and confidentiality problem. Detect, block, log.
The story in one glance
Picture an engineer debugging a thornier support ticket.
They paste the user’s message thread — emails, photos metadata, maybe a payment dispute — into a personal consumer chat account on a public LLM. It’s fast. It’s helpful. It’s also the company exfiltrating itself through a browser tab.
Legal’s enterprise no-training clause never saw that traffic. The privacy notice never disclosed that path. The AI surface register (Chapter 6D) never listed it. Data loss prevention (DLP) watched USB sticks and ignored HTTPS to a consumer AI host.
Walk this with your network allowlist beside you. Ask: which consumer AI hosts can staff reach from a corp laptop? If the answer is “all of them,” you don’t have an AI program — you have a browser.
This chapter treats shadow AI as an egress problem: enterprise accounts only; DLP/egress gates; notice accuracy; vendor retention/training unknowns as first-class risks.
Plain English — personal accounts aren’t a vendor program
| Path | What it is | Governed? |
|---|---|---|
| Enterprise AI account (SSO, DPA, no-training default) | Approved processor path | Yes — if on register (LE-64) |
| Personal consumer LLM account | Staff-controlled third party; training/retention often opaque | No — treat as data egress |
| Unsanctioned browser plug-ins | Silent prompt exfiltration | No |
Field rule — put this on the release checklist: If the company can’t point to a DPA, a register row, and a retention answer, staff aren’t “using AI” — they are sending company and user data to a stranger’s product.
Remember: a Law Engineer is a licensed attorney with software and product expertise.
What the law / policy is asking the product to do (themes)
- Ban personal-account use for company/user data — written policy + technical friction.
- Enterprise-only allowlist of AI hosts (ties to LE-64).
- DLP / egress gates on known consumer AI domains and paste patterns where proportionate.
- Privacy notice honesty — don’t claim processors you don’t control; don’t omit known staff tools if they are in scope.
- Vendor unknowns — consumer tiers may train / retain; encode “unknown = disallowed for PII/contents.”
- Culture + detection — training without telemetry is a pep talk.
Review this with counsel and eng on the same call. If Side A matches production, you’re still in the memo-to-coders handoff.
Side A — What loses (“we trust people”)
What goes wrong: Acceptable-use PDF forbids ChatGPT; everyone still uses it. API keys for consumer accounts live in engineers’ password managers. Support macros say “summarize in your AI tool.” DLP allowlists nothing AI-related. When a journalist asks whether user DMs train public models, Marketing says “we never share data with AI vendors” while staff paste daily.
Why this matters in court / before a regulator: Notice accuracy, security, and processor control fail together. “Is the company exfiltrating itself?” isn’t rhetorical.
Any hit means you don’t ship yet.
Non-compliance checklist (red flags)
- Personal LLM accounts used on company devices/networks for work data
- No egress controls toward consumer AI hosts
- Privacy notice claims no AI processors while shadow use is rampant
- Enterprise no-training marketing (LE-31) while consumer paste continues
- Unlisted surfaces in register (LE-64 miss)
- No incident path for suspected paste exfiltration
Side B — What works better (policy → allowlist → DLP → culture)
What works better: Written ban on personal AI for work data. SSO enterprise tenants only; consumer hosts blocked at network/CASB where proportionate.
Browser and endpoint DLP rules for paste-to-AI patterns on high-sensitivity apps. Register (LE-64) is the allowlist source.
Safe approved tools for summarization with redaction. Tabletop: “paste user DM into consumer AI” as a privacy incident drill.
Privacy notice and staff handbook stay congruent.
Fixed user story: Staff need a summary → open approved enterprise surface → auto-redaction → logged surface_id → no consumer host route.
Compliance checklist (green flags)
- Enterprise AI SSO enforced; consumer AI hosts blocked or alerted
- Register allowlist drives egress policy
- DLP rules tested on staging paste fixtures
- Notice + handbook + marketing aligned
- Incident runbook for shadow-AI egress
- Metrics: block/alert counts reviewed by counsel + security
Template: Lawyer / Engineer card
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
| Lawyer | Engineer |
|---|---|
| What data classes may never touch consumer AI? | DLP / proxy rules encode those classes? |
| Which enterprise vendors are approved? | Egress allowlist = register hosts only? |
| Are notice statements still true? | Congruence test includes shadow-AI findings? |
| What is the incident severity for paste exfil? | Alert → ticket → counsel within SLA? |
Interface / code / data — one-page checklists
Run these as acceptance seeds — not as informal hunches. If you can’t export the Data row, you didn’t finish.
Interface: Staff portal lists approved AI tools; block interstitial when consumer AI host hit; redaction UX on approved summarizers.
Code: Egress allowlist; CASB/DLP policies-as-code; browser extension inventory; kill personal API keys in secrets scanners.
Data: egress_alerts; approved_tool_logins; shadow_ai_incident_tickets; register_version used for allowlist.
Lost vs fixed (scene card)
| Lost | Fixed | |
|---|---|---|
| Support paste | Personal consumer LLM | Enterprise surface + redaction |
| Network | Any HTTPS | Allowlist from register |
| Notice | “We don’t share with AI” | Matches reality |
| Question | “Are we exfiltrating ourselves?” | Answerable with logs |
Try this on your product tomorrow
Screenshots and exports beat opinions.
- From a corp laptop, open a consumer LLM host — blocked, warned, or free?
- Secrets-scan repos for personal AI API keys.
- Ask three support agents how they summarize tickets today — compare to the allowlist.
- Diff privacy notice processor list vs register + known shadow tools.
- Run one tabletop paste incident — is severity defined?
Where this goes next
Keep the loop moving — Law → Interface → Code → Data → Counsel sign-off.
- AI surface register — Chapter 6D (LE-64).
- Decision logging — Chapter 6F (LE-66).
- Enterprise no-training — Chapter 26 (LE-31).
- Privacy congruence — Chapter 4 (LE-41); threshold inventory — Chapter 7C (LE-67).
- Pattern Map LE-65 — Chapter 32.
Field rule — put this on the release checklist: Personal LLM accounts are egress paths. If you can’t name the DPA, you can’t claim control.
This chapter is for education and discussion. It isn’t legal advice. Vendor retention/training defaults change — verify current enterprise terms with counsel.
This chapter is for education and discussion. It is not legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
Chapter 6F — Worked Example: AI Decision Logs, Criteria & CoT Containment
Pattern family: AI decision logging, criteria versions, chain-of-thought (CoT) containment, Legal retrieval (LE-66). Deepens automated T&S moderation (LE-36; Chapter 29) without replacing that chapter; stitches logging / ESI store-vs-create (LE-55; Chapter 7B). Follows inventory (LE-64) and shadow-AI (LE-65).
Legal anchors (themes): Accountability / explainability expectations for automated decisions (EU AI Act logging themes; DSA statements of reasons themes for certain moderation; Colorado AI documentation themes; GDPR Art. 22 / access themes where automated decisions produce legal or similarly significant effects); discovery / regulatory production of decision records; privilege and over-disclosure risk when raw CoT / reasoning traces are dumped into user-facing or over-broad logs.
As of September 2026: Verify which logging duties attach to your risk class and forum before promising “full model reasoning” to users or agencies.
Why this memo exists
If a model Approve/Deny matters legally, you need inputs, model id, human override, and outcome in an exportable log.
When a regulator or plaintiff asks why the system did X, you need a row — not a vibe.
The story in one glance
Picture a Trust & Safety model that returns Approve / Deny / Ignore on a piece of UGC.
Product stores the label. Policy drifts next week; nobody pinned criteria_version. A bulk “Ignore → Delete” job fires on a bad threshold. Counsel learns from Twitter. When Legal asks why item 88421 was denied in March, Engineering offers a screenshot of today’s prompt. Somewhere, a debug flag wrote the model’s chain-of-thought (CoT — the model’s inner reasoning trace) into an analytics SDK — now discoverable far beyond the T&S ticket.
Walk this chapter with one denied item open beside you. Ask three questions. Which criteria_version was live that day? Can Legal export the decision record in hours, not weeks? Did anyone dump raw CoT into a sink that will show up in discovery?
This chapter encodes: versioned criteria, HITL override events, durable decision logs with a Legal retrieval SLA, CoT containment, and a mass-action kill switch + counsel notify for bulk delete/archive. Deepen LE-36; don’t reprint the whole moderation OS.
Plain English — decisions need ledgers, not vibes
| Need | Why |
|---|---|
| Versioned criteria | “Deny” means nothing without the policy/prompt/ruleset id |
| HITL overrides | Humans change outcomes — log who/when/why |
| Durable decision log | Legal retrieval SLA (hours/days — counsel sets) |
| CoT containment | Reasoning traces ≠ user-facing reasons ≠ broad analytics |
| Mass-action brake | Bulk delete/archive needs kill switch + counsel notify |
Field rule — put this on the release checklist: Store the decision record you can defend. Don’t store the model’s inner monologue in every sink you have.
Remember: a Law Engineer is a licensed attorney with software and product expertise.
What the law is asking the product to do (themes)
- Pin criteria. Taxonomy / prompt / threshold bundle gets
criteria_versioncounsel signs (LE-36 adjacency).
- Log Approve/Deny/Ignore (or equivalents) with subject id, surface id (LE-64), model version, criteria version, timestamp.
- HITL override events are first-class — not silent admin edits.
- Legal retrieval SLA — export path tested; not “we’ll write a script.”
- CoT / reasoning-trace containment — default deny to user UI, tickets, and analytics SDKs; separate privileged debug store if counsel allows.
- User-facing reasons use approved reason codes — not raw CoT.
- Mass-action kill switch — bulk delete/archive/score-flip requires dual control + counsel notify (LE-55 store-vs-create awareness: don’t fabricate logs after the fact).
- Stitch LE-55: decision logs you chose to store are ESI candidates; turning on verbose CoT “for the lawsuit” is a create-path counsel owns.
Review this with counsel and eng on the same call. If Side A matches production, you’re still in the memo-to-coders handoff.
Side A — What loses (“label only / dump the CoT”)
What goes wrong: Decisions are a boolean column. Criteria live in a Google Doc. Overrides happen in SQL. Bulk jobs have no brake. Debug CoT streams into a generic analytics SDK. Legal retrieval is a heroic weekend. User sees a 900-token rationale that hallucinates policy.
Any hit means you don’t ship yet.
Non-compliance checklist (red flags)
- No
criteria_versionon decisions
- HITL edits without override events
- CoT in user email or broad logs
- Bulk delete without counsel notify
- Can’t export March decisions by id within SLA
- “We’ll enable full traces for discovery” without counsel create-path (LE-55)
Side B — What works better (version → decide → log → contain → brake)
What works better: Criteria bundles versioned like code. Inference writes decision_events with foreign keys to surface/model/criteria.
HITL console writes override_events. Reason-code mapper for user/DSA-style notices.
CoT only in sealed debug tier with ACL + retention. Bulk actions require mass_action_token + paging kill switch; pager to counsel on threshold.
Legal portal retrieves by subject/time within SLA. Tabletop with LE-36 queues.
Compliance checklist (green flags)
- Every automated decision carries criteria + model + surface versions
- Overrides logged
- CoT not in user-facing or analytics sinks
- Mass-action dual control + counsel notify tested
- Legal retrieval drill passes SLA
- LE-55 map marks decision log storage_tier
Template: Lawyer / Engineer card
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
| Lawyer | Engineer |
|---|---|
| Which decision types need durable logs? | Enum + writers mandatory on those paths? |
| What is the Legal retrieval SLA? | Portal/export job meets SLA in staging drills? |
| May CoT ever leave the sealed tier? | Sink allowlist enforced; CI bans CoT→analytics? |
| Who approves mass delete/archive? | Dual control + counsel_notify event? |
| How do Art. 22 / DSA reason themes map to reason codes? | Mapper versioned; no raw CoT to users? |
Interface / code / data — one-page checklists
Run these as acceptance seeds — not as informal hunches. If you can’t export the Data row, you didn’t finish.
Interface: Moderator reason codes; override UI with required note; mass-action confirm with impact count; Legal retrieval portal.
Code: criteria_version pin; decision_events writer; override API; CoT redaction middleware; mass-action kill switch; retrieval export.
Data: criteria_bundles; decision_events; override_events; mass_action_events; sealed_cot_objects (ACL); retrieval_audit.
Lost vs fixed (scene card)
| Lost | Fixed | |
|---|---|---|
| Deny why? | Today’s prompt | Pinned criteria_version |
| Override | Silent SQL | override_event |
| CoT | Analytics SDK | Sealed tier |
| Bulk delete | Cron surprise | Kill switch + counsel notify |
| Legal ask | Weekend heroics | Retrieval SLA |
Try this on your product tomorrow
Screenshots and exports beat opinions.
- Export one Deny from last week — criteria_version and model id present?
- Perform a HITL override in staging — override_event written?
- Grep logs/analytics for raw CoT fields.
- Dry-run bulk archive at 1% — kill switch and counsel notify fire?
- Time a Legal retrieval drill against the SLA.
- Confirm Chapter 29 (LE-36) taxonomy versions match criteria bundles.
Where this goes next
Keep the loop moving — Law → Interface → Code → Data → Counsel sign-off.
AI Terms ↔︎ product disclosure congruence — Chapter 6G (LE-69); co-pilot skin — Chapter 6H (LE-70).
T&S moderation OS — Chapter 29 (LE-36) — this chapter deepens logging, not queues.
ESI store vs create — Chapter 7B (LE-55).
AI inventory / shadow AI — Chapters 6D / 6E.
Enterprise no-training — Chapter 26 (LE-31).
Pattern Map LE-66 — Chapter 32.
Field rule — put this on the release checklist: Log the decision you can retrieve. Contain the reasoning you can’t defend in every sink.
This chapter is for education and discussion. It isn’t legal advice. It deepens LE-36 logging themes — it doesn’t replace the Trust & Safety chapter.
This chapter is for education and discussion. It is not legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
Chapter 6G — Worked Example: AI Terms ↔︎ Product Disclosure Congruence
Pattern family: AI Terms ↔︎ product disclosure congruence (LE-69). Sits after AI inventory / shadow AI / decision logs (LE-64…66; Chapters 6D–6F) and mirrors privacy tag congruence (LE-41; Chapter 4).
Legal anchors (themes): Unfair/deceptive practice themes when ToS “fictional simulation / not a real person / no emotional reliance / AI LoL” language diverges from shipped UI that invites reliance, romance, or human-seeming intimacy; notice and disclosure accuracy; contract formation congruence with product reality.
As of September 2026: Treat this as a scanner discipline like LE-41 — not a new statute.
Why this memo exists
Do they tell the same story?
If marketing says ‘your data isn’t used for training’ and the pipeline does, congruence failed before the lawsuit.
The story in one glance
Terms that say: Characters are fictional simulations. Don’t rely on them for advice or emotional support. AI outputs may be wrong. Liability is limited.
The product ships a co-pilot that says “I’m here for you,” offers crisis-shaped intimacy, omits persistent AI labeling on mobile, and markets “someone who understands.” Support quietly treats bot promises as binding. The AI LoL in ToS never appears near the feature.
Privacy congruence (LE-41) taught notice ↔︎ tags. This chapter teaches AI Terms ↔︎ product disclosures with the same habit: inventory claims, diff against UI, fail the release when they diverge.
Walk one AI surface with Terms open in the other tab. Ask: does the chrome invite reliance the PDF forbids? If a regulator played the UI next to the disclaimer, who wins the story?
Plain English — if Terms say simulation, UI can’t sell a person
| Terms theme | Product must show | Divergence fail |
|---|---|---|
| Fictional / simulated | Persistent AI disclosure | “Real companion” chrome |
| No emotional reliance / not therapy | Crisis → human/resources path; no therapist claims | Bot gives treatment plans |
| AI may err | Uncertainty / verify cues where consequential | “Guaranteed accurate” |
| AI LoL / dispute cross-ref | Not contradicted by unlimited-trust marketing | “We’re responsible for everything the AI says” ads |
| Human-in-the-loop | HITL when Terms promise it | Silent full-auto on the same acts |
Field rule — put this on the release checklist: ToS AI disclaimers that the UI contradicts are evidence against you — not a shield.
Remember: a Law Engineer is a licensed attorney with software and product expertise.
Review this with counsel and eng on the same call. If Side A matches production, you’re still in the memo-to-coders handoff.
Side A — What loses (“Legal owns Terms; Growth owns UI”)
What goes wrong: Terms updated yearly. Chat UI redesigned weekly. Labels A/B’d away. Emotional-reliance ban exists only in PDF. Congruence never scanned. Inventory (LE-64) lists surfaces; nobody diffs disclosure strings.
Any hit means you don’t ship yet.
Non-compliance checklist (red flags)
- Terms “simulation” vs UI “your person”
- Missing persistent AI disclosure on a Terms-covered surface
- AI LoL contradicted by ads
- No scanner/diff job for AI claim packs
- Support macros ignore Terms limits
Side B — What works better (claim pack → surface map → scanner)
What works better: Counsel maintains ai_terms_claim_pack (simulation, reliance, accuracy, LoL pointers, HITL promises) versioned with Terms. Each surface_id (LE-64) maps required disclosures. CI/visual or string scanner diffs pack ↔︎ UI like LE-41. Failures block release (LE-62). Co-pilot skins (LE-70) inherit the pack.
Compliance checklist (green flags)
- Versioned AI claim pack
- Surface → required disclosure map
- Scanner in CI / release train
- Marketing/review includes pack
- Drift tickets with owners
Template: Lawyer / Engineer card
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
| Lawyer | Engineer |
|---|---|
| Which Terms AI claims are material? | Pack fields enumerated? |
| Which surfaces inherit which disclosures? | Map enforced by surface_id? |
| What is the fail posture on drift? | CI block vs ticket — counsel chooses? |
Interface / code / data
Interface: Persistent AI labels; no human-impersonation chrome; crisis routing; claim-consistent empty states.
Code: ai_terms_claim_pack_version; surface disclosure map; scanner job; release gate.
Data: claim_packs; surface_disclosure_requirements; scan_results; drift_tickets.
Lost vs fixed
| Lost | Fixed | |
|---|---|---|
| Terms vs UI | Divergent | Scanned congruent |
| Label | Optional | Required per surface map |
| Release | Ship anyway | Gate on drift |
Try this on your product tomorrow
Screenshots and exports beat opinions.
- Quote three AI Terms sentences; find matching UI on each generative surface.
- Turn off AI disclosure in staging — does scanner fail?
- Diff ads vs AI LoL language.
- Confirm LE-64 register rows point at disclosure requirements.
Where this goes next
Keep the loop moving — Law → Interface → Code → Data → Counsel sign-off.
- AI inventory / shadow / logs — Chapters 6D–6F.
- Co-pilot skin — Chapter 6H (LE-70).
- Privacy congruence method — Chapter 4 (LE-41).
- Pattern Map LE-69 — Chapter 32.
Field rule — put this on the release checklist: AI Terms are product specs. If the UI tells a different story, the Terms won’t save the launch.
This chapter is for education and discussion. It isn’t legal advice.
This chapter is for education and discussion. It is not legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
Chapter 6H — Worked Example: Conversational Co-Pilot Skin (HITL / PVS / No Impersonation)
Pattern family: Conversational platform co-pilot / AI skin — draft≠send, user ratification, no synthetic persona impersonation, PVS matrix, kill switch (LE-70). Builds on chatbot guardrails (LE-30 / LE-38; Chapter 6), inventory/logs (LE-64 / LE-66), Terms congruence (LE-69), and inherits AV / § 2257 / consent gates on tool calls (LE-10 / LE-14 / LE-61).
Legal anchors (themes): Disclosure of AI; prohibition on deceptive impersonation / fake-human presentation; human-in-the-loop for consequential sends; product-safety style kill switches for alpha surfaces; tool-call inheritance of age / records / consent predicates; RAG scope limitation to authorized corpora.
As of September 2026: Teaching reconstructions only — no brand names, no product URLs.
Why this memo exists
A co-pilot skin raises a simple question: what can it see, say, and do — and does the user know it is not the human?
A friendly skin doesn’t waive the gates. Scope the tools; log the consequential acts.
The story in one glance
Picture a “co-pilot” skin over chat or creator messaging.
It drafts replies in a beloved persona’s voice. A toggle auto-sends. Users can’t tell where the human stopped and the model began. Tools can fetch private media, tip, or publish. Alpha builds live on sticky URLs with no kill switch. Retrieval-augmented generation (RAG) pulls from another customer’s tickets. Age verification (AV) and consent ledgers never see the tool path.
Walk one co-pilot message end-to-end. Ask: can it send without the user tapping Send? Does the UI claim “it’s really them”? If the alpha URL leaks tonight, is there a one-switch kill?
This chapter encodes: draft ≠ send; user ratification; no synthetic persona / impersonation; a PVS (policy / voice / safety) matrix; alpha URL kill switch; tool calls that inherit AV / 2257 / consent; RAG scope allowlists. Cross-ref LE-64/65/66 — don’t invent a parallel register.
Plain English — skin, not sockpuppet
| Control | Meaning |
|---|---|
| Draft ≠ send | Model proposes; send requires explicit user action (or HITL role) |
| Ratification | User sees final text before consequential delivery |
| No impersonation | UI never claims the AI is the human creator/support agent without disclosure |
| PVS matrix | Policy version × voice/style pack × safety classifier bundle — pinned |
| Kill switch | Alpha/staging URLs and prod flags die in one control |
| Tool inheritance | Tools that publish/tip/fetch intimate media must pass LE-10/14/61 predicates |
| RAG scope | Corpora allowlisted; no cross-tenant bleed |
Field rule — put this on the release checklist: A co-pilot that can send as you without you isn’t assistance — it’s agency without assent.
Remember: a Law Engineer is a licensed attorney with software and product expertise.
Review this with counsel and eng on the same call. If Side A matches production, you’re still in the memo-to-coders handoff.
Side A — What loses (“auto-send in their voice”)
What goes wrong: Persona skin without AI label. Auto-send on. Tools bypass publish gates. Alpha link shared publicly. RAG “helpful” across tenants. Shadow personal LLM keys (LE-65) power the skin. Decision logs missing (LE-66). Terms say simulation; UI says “it’s really them” (LE-69 fail).
Any hit means you don’t ship yet.
Non-compliance checklist (red flags)
- Auto-send without ratification
- Missing AI disclosure / human impersonation chrome
- Tool calls skipping AV/2257/consent
- No kill switch on alpha URLs
- Unscoped RAG
- Unlisted surface_id (LE-64)
Side B — What works better (draft → show → ratify → send)
What works better: Co-pilot listed on register (LE-64). PVS triple versioned.
Composer shows draft + AI badge; Send disabled until ratify. Impersonation lint bans “I’m {creator}” system prompts without disclosure template.
Tools wrap existing gates. Alpha hosts behind flag + kill.
RAG allowlist per tenant. Logs: draft_events, ratify_events, send_events (LE-66).
Terms congruence scanned (LE-69).
Compliance checklist (green flags)
- surface_id + PVS versions on every call
- Draft≠send enforced in API
- Disclosure persistent
- Tool gates inherited
- Kill switch tested
- RAG allowlist tested for cross-tenant deny
- Congruence scan green
Template: Lawyer / Engineer card
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
| Lawyer | Engineer |
|---|---|
| When is HITL mandatory vs user self-ratify? | Send API requires ratify_id? |
| Which personas may be skinned? | Voice pack allowlist + disclosure template? |
| Which tools are in-scope? | Tool broker checks LE-10/14/61? |
| Alpha exposure acceptable? | Kill switch + auth on alpha URLs? |
Interface / code / data
Interface: Draft pane; AI badge; ratify/send; refuse impersonation; kill banner for alpha.
Code: draft≠send; ratify token; PVS pin; tool gate wrappers; RAG allowlist; kill switch; register surface_id.
Data: pvs_versions; draft_events; ratify_events; send_events; tool_call_events; rag_corpus_allowlists; kill_events.
Lost vs fixed
| Lost | Fixed | |
|---|---|---|
| Send | Auto | Ratify |
| Persona | Fake human | Disclosed AI skin |
| Tools | Bypass | Inherit gates |
| Alpha | Sticky public URL | Kill switch |
Try this on your product tomorrow
Screenshots and exports beat opinions.
- Attempt send without ratify_id — expect 403.
- Strip AI badge in staging — congruence/scanner fail?
- Tool-publish without consent ledger — hard fail?
- Kill alpha flag — URLs die?
- RAG query other tenant — deny?
Where this goes next
Keep the loop moving — Law → Interface → Code → Data → Counsel sign-off.
- Guardrails — Chapter 6; inventory/logs — 6D/6F; Terms congruence — 6G.
- AV/TIDA/2257 — Chapters 5 / 5B / 21.
- Pattern Map LE-70 — Chapter 32.
Field rule — put this on the release checklist: Draft is cheap. Send is a legal act. Skins disclose; tools inherit; alpha dies on command.
This chapter is for education and discussion. It isn’t legal advice. No brand names or product URLs appear in this teaching reconstruction.
This chapter is for education and discussion. It is not legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
Chapter 7 — Worked Example: Legal Process, Data Maps & Counsel Portals
Pattern family: SCA/ECPA / legal process response (LE-24); overlaps privacy rights portals and data-mapping themes (LE-06)
Legal anchors: Stored Communications Act / ECPA themes for compelled and voluntary disclosure; preservation pending process; sealed / gagged / delayed-notice matters where nondisclosure binds the provider; civil process distinguished from criminal process for contents. Global privacy rights (access, deletion, inventory) share the same data map problem as subpoena and warrant response.
As of September 2026: Process classification and production scope are counsel calls for each matter — confirm primary authorities and your facts before shipping disclosure tools.
Why this memo exists
When process arrives, counsel needs systems, processors, retention, and legal-hold hooks — not a Slack archaeology project.
When a CID or subpoena lands, scavenger hunts fail. The map is how counsel and eng see the stack together.
The story in one glance
Illustrative teaching figure. a PDF that lands in Slack. Someone greps production. Counsel tells a court what the company “has” from a stale slide. Six months later, nobody can prove what was searched — or what was not.
Now picture the fixed version: a living data map feeds a counsel portal with production jobs, preservation flags, sealed-matter access-control lists (ACLs), and an auditable trail of what was searched and produced.
This chapter is about making counsel’s representations true. If you remember only one line: a living map beats a war-room improvisation.
Picture a CID that asks for “all data related to user X.” Ask: does your living data map tell counsel where to look — or do you start a Slack scavenger hunt?
Why this is a Law Engineering primer
In trenches tech-law practice: responding to subpoenas, search warrants, and sometimes secret or gagged government process is a fundamental Law Engineering exercise — not a war-room improvisation.
A Law Engineer — a licensed attorney with software and product expertise — must be able to say, in good faith, what the company holds and what it produced. Noncompliance can mean contempt. Incomplete access to the stack, incomplete processes, or a fictional data map can push lawyers into inaccurate representations to law enforcement and the court. That isn’t a drafting problem; it’s an engineering and inventory problem.
Put policed automations in place with traceability to company-wide data and a living data map, so counsel can form a good-faith belief in what they are providing — and so objections (process insufficient, overbreadth, wrong data class, map gap) are made in good faith rather than from hope.
This work overlaps global privacy compliance. The inventory for consumer access and deletion is largely the same inventory needed to answer: Where does this account’s data live, and what can we lawfully produce? The privacy rights portal for user review and deletion can be reworked into a lawyer-internal portal for subpoena and warrant response — same systems checklist, different authentication, roles, and legal gates.
The Stored Communications Act (SCA) and broader Electronic Communications Privacy Act (ECPA) themes shape how and when providers may disclose contents and non-content records. Process classification is a counsel call — not an engineering shortcut.
Field rule — put this on the release checklist: If counsel can’t reconstruct what was searched, held, objected to, and produced — with who, when, and under which process type — the company doesn’t have a legal-process program. It has a Slack habit.
Side A — What loses (PDF → Slack → guess)
What goes wrong: Process arrives as a PDF. It hits Slack. An engineer greps a primary database and dumps CSVs. Counsel, under a short return date, names systems from memory or a stale “privacy data map” slide. The consumer data-subject access request (DSAR) / delete portal exists for paper compliance, but legal ops can’t reuse it: different auth, no process classification, no gag controls, no production hash. Nobody can later prove what was not searched. Sealed or gagged matters leak into the wrong room through the same informal channels.
Why this matters in court / before a regulator: (1) Contempt / representation risk — a fiction map makes inaccurate statements likely even when counsel intends good faith. (2) Process misclassification — civil contents, thin process for sensitive classes, or undocumented emergencies are invited by informal tools. (3) No preservation or production audit — without holds, scoped jobs, and hashes, claims are unprovable. (4) Privacy map ≠ legal map — a privacy slide doesn’t unlock warrant-scoped exports or sealed ACLs; dual drifting portals invent two truths.
Lawyer lens — what I’d ask on the call: Your signature on a cover letter or declaration is only as honest as the inventory behind it. Without systems searched and excluded (map version), you can’t object from a map gap — only apologize later.
Engineer lens: If support can SELECT * into a laptop, the SCA/ECPA ladder is incomplete paper compliance. Content export must require a classified legal_process_id, not a Slack ping.
Any hit means you don’t ship yet.
Non-compliance checklist (red flags)
- Intake via unverified DM / social / personal email only
- Informal “export user” buttons for support
- Counsel names systems from a stale slide, not a living map
- Privacy DSAR portal can’t be reused by legal ops
- No hold distinct from production; no production hash/scope/actor
- No sealed-matter ACL; gagged matters in general tickets
- Civil contents unlock the same export path as warrants
- No “map gap / unknown system” objection reason code
Side B — What works better (living map + counsel portal)
What works better: A living data map lists systems, data classes (basic subscriber, other non-content, contents, sensitive location — as counsel taxonomizes), retention, owners, and export connectors. Privacy and legal-process inventory are one register with two consumers. Authenticated intake classifies process type before any disclosure tool unlocks. Counsel / legal-ops open an internal portal — reusing privacy rights fulfillment machinery (system checklist, jobs, clocks) — with different auth, matter ACLs, gag/notice controls, and objection states. Production jobs emit trace IDs; preservations are distinct from productions; sealed matters stay need-to-know.
Fixed building blocks
- Living data map — versioned; data classes, owner, export connector,
last_verified_at. Unknown/stale rows drive objection — not silent omission.
- Counsel portal — same inventory/workers as DSAR know/delete;
legal_ops/ counsel only; sealed ACL.
- Process classification gate — warrant / criminal / civil / preservation / emergency / foreign unlock different allowlists. Civil contents blocked absent counsel override + reason.
- Preservation ≠ production — immutable snapshot on request; disclosure is a separate scoped, hashed job.
- Policed production jobs —
legal_process_id+ scope + actor +production_trace_id+ hash; append-only register.
- Gag / notice controls — sealed or delayed-notice suppresses user-notice jobs; default safe.
- Objection workflow tied to the map — process insufficient, overbreadth, wrong class, map gap, third-party custody — each linked to map version and systems considered.
Compliance checklist (green flags)
- Public law-enforcement guidelines + authenticated intake
- One living map feeds privacy and legal-process fulfillment
- Content export requires classified process id; informal paths killed
- Hold creates snapshot without disclosure; sealed tickets ACL-scoped
- Register exportable without dumping payloads into chat
- Good-faith search scope reconstructible from map version + job logs
- Tabletop: warrant contents, civil contents objection, preservation, gag, map-gap objection
Template: Lawyer / Engineer card
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
| Lawyer | Engineer |
|---|---|
| Can I form a good-faith belief about what we hold for this target? | Is the data map versioned, owned, and wired to export connectors? |
| Did we classify process before any contents left the vault? | Does export require legal_process_id + allowlisted process_type? |
| Are objections honest (including map gaps), not for show? | Is MAP_GAP / unknown-system a first-class ticket state with evidence? |
| If gagged/sealed, who can see the matter — and who cannot? | Are sealed ACLs enforced in ticket UI, search, and notifications? |
| Can we prove preservation separate from production? | Do hold jobs write immutable snapshots without unlocking disclosure? |
| Six months later, can we reconstruct who produced what? | Append-only productions with scope, actor, hash, production_trace_id? |
| Does privacy inventory match legal inventory? | One register; DSAR and legal workers call the same system list? |
Interface / Code / Data — Law Engineering rubric
Interface (must-show): Public guidelines (process types, required elements, emergency contact); authenticated intake (agency, matter id, process type, targets, return date, attachment); taxonomy matching process types; production UI showing data class before unlock; notify / delayed / gagged controls (default safe); counsel views of map version, systems searched, holds, objections, productions; sealed-matter banner and restricted search.
Interface (must-not): Support “export user” dumping contents; auto-produce contents on civil subpoena alone; auto-notify when gag/delayed-notice is flagged; process solely via social DMs or unverified email; general Slack as system of record for sealed matters.
Code: Role-gated disclosure (legal_ops / counsel); process-type matrix gates content vs non-content; preservation without produce; gag suppresses notice jobs; civil contents → PROCESS_INSUFFICIENT + objection unless counsel override + reason; kill informal CSV paths; production jobs write hashed register rows; sealed ACL on tickets, search, notifications.
Data: Living data_map (shared with privacy); legal_process_matters; legal_preservations; legal_productions (scope, hash, actor, production_trace_id); legal_objections (including map gap); legal_user_notices. Prefer write-once-read-many (WORM) / append-only. Retention: counsel-set multi-year horizon aligned with holds and transparency reporting.
Overlap table — Privacy rights portal ↔︎ Counsel legal-process portal
Same inventory; different gates.
| Shared asset | Privacy rights portal (LE-06 themes) | Counsel legal-process portal (LE-24) |
|---|---|---|
| Data map / system inventory | Systems holding personal information for know/delete/correct | Systems holding target data for search/produce/hold |
| Fulfillment workers | Access, deletion, correction per verified request | Scoped export / preservation per classified process |
| Clocks & tickets | Consumer SLAs; verification state | Return dates; preservation windows; objection deadlines |
| Auth & roles | Consumer / authorized agent + privacy ops | Authenticated LE intake + counsel / legal_ops only |
| Notice to user | Confirmations, completion, denials | Often suppressed when gagged/delayed |
| Evidence pack | Timeline, systems touched, denial reasons | Process class, map version, search scope, holds, hashed productions, objections |
| Failure if missing | Missed privacy SLA; incomplete deletion | Contempt risk; inaccurate representations; unlawful or over-disclosure |
Field rule — put this on the release checklist: Don’t maintain two inventories. Maintain one map, two portals (consumer-facing rights vs lawyer-internal process), with gates that match the legal regime.
What this chapter is NOT
This chapter is not a public playbook for evading lawful process, defeating warrants, or coaching nondisclosure beyond what sealed/gagged process already requires. It’s how you make compliance and good-faith advocacy possible: so the company can preserve, produce, and object accurately — and so counsel’s representations rest on a policed map and an auditable trail, not folklore.
Escalate novel, foreign, national-security, wiretap/pen-trap, or emergency matters to specialized counsel. Process classification isn’t an engineering shortcut.
Try this on your product tomorrow
Screenshots and exports beat opinions.
- Ask counsel to name every system that could hold DM/email-like contents for user X; diff against the living map.
- Attempt content export without a classified legal-process id — does the API 403?
- Open a fake civil-contents ticket — block + objection path?
- Preservation-only matter — snapshot without disclosure?
- Gag a matter — notices suppressed and ticket ACL-scoped?
- Run one DSAR delete and one legal production on the same test account — same system checklist?
- Export a register row (scope, actor, hash, map version). Missing fields = demo, not a program.
SOP deepen — legal process as code (LE-24)
Chapter 7 already taught the living map and counsel portal. This section hardens the operating SOP so intake doesn’t depend on tribal knowledge. Teaching only — no client letterhead.
1. § 2703(c)(2) subscriber allowlist as code
Encode the subscriber-information categories counsel treats as § 2703(c)(2)-style basics (name, address, records of session times/durations, length of service, types of services, subscriber number/identity, means/source of payment — verify current statute text with counsel) as an allowlist enum in the production policy engine. Requests that ask only for allowlisted fields can route to the matching template; anything outside the allowlist fails closed into a higher process_type (warrant / court order path) — never “just this once” in Slack.
2. Do-Not-Disclose-Without-Warrant list joined to the map
Maintain a versioned dnd_without_warrant list (contents, location info beyond the allowlist, message bodies, etc. — counsel-owned). Join it to the living data map so every system/field row declares: subscriber_allowlist | dnd_without_warrant | other_legal_hold_only. Portal export refuses dnd fields unless process_type ∈ warrant-class.
3. Intake → classify → versioned template letters
- Intake — ticket with raw demand + channel + received_at.
- Classify — process_type enum: preservation, subscriber_2703c2, dnd_warrant, civil_subpoena, foreign_mlat, emergency, etc.
- Template — versioned response / objection / production cover letters (generic Firm templates — no client letterhead in the guide). Classification locks which template versions may send.
- Send + hash — store template_version, actor, hash of outgoing.
4. Foreign / MLAT process_type
Foreign mutual legal assistance and non-US compulsory process get their own process_type and playbook pointer — not a US subscriber template with the caption tippexed. Counsel owns whether to object, narrow, or route through MLAT channels.
5. Production meta (secure channel, hours/cost)
Every production event records: secure channel id (SFTP/portal — not personal email), estimated/actual hours, cost center / invoice refs if charged, and byte/hash manifests. Meta is part of the evidence pack when fee-shifting or reasonableness is later disputed.
6. Training / audit cadence
Quarterly tabletop: one subscriber allowlist request, one dnd/warrant request, one foreign/MLAT-shaped demand, one preservation-only. Audit sample of tickets for classification accuracy and template_version presence. Results feed release gates for portal changes (LE-62 adjacency).
Field rule — put this on the release checklist: If the map can’t say which fields are allowlist vs warrant-gated, Legal is improvising under a clock.
Where this goes next
Keep the loop moving — Law → Interface → Code → Data → Counsel sign-off.
Privacy engineering threshold inventory (eleven inputs → living map) — Chapter 7C (LE-67). Logging/ESI deepen — Chapter 7B (LE-55). Privacy notice and rights UX (LE-06) and tag/notice congruence (Chapter 4). Breach clocks when legal process overlaps incident response. Operating-model chapter later in this guide: who owns the living map, who signs process matrices, and how tabletops become release gates.
This chapter is for education and discussion. It isn’t legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
This chapter is for education and discussion. It is not legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
Chapter 7B — Worked Example: Logging & ESI — Store vs Create
Pattern family: Logging & ESI — store vs create (LE-55). Deepens the living data map and counsel portal from Chapter 7 (LE-24 themes) — doesn’t replace them. Adjacent privacy inventory (LE-06 themes). Not CIPA session-replay consent (Chapter 4B / LE-53).
Legal anchors (themes): Fed. R. Civ. P. 34 — produce electronically stored information already within possession, custody, or control, not a blank order to invent new surveillance logs; Alexander v. FBI, 194 F.R.D. 305, 310 (D.D.C. 2000) (Rule 34 produces documents already in existence); ReplayTV / Paramount discovery briefing themes (no Rule 34 duty to design software that creates usage data you never stored); Torrentspy teaching story — Columbia Pictures Indus. v. Bunnell, 245 F.R.D. 443 (C.D. Cal. 2007) and related practice — transient RAM / HTTP headers / “turn on logging,” privacy chill, discovery order as de facto injunction themes. Fact-specific and contested — don’t overclaim a nationwide rule that RAM always is, or never is, ESI.
As of September 2026: Remember: a Law Engineer is a licensed attorney with software and product expertise. Re-check Rule 34, your forum’s ESI orders, and counsel’s create-vs-produce posture before anyone flips access_log_enabled because Slack said “discovery.”
Why this memo exists
Under a hold, the hard question is what you already store versus what you invent by flipping logging on.
ESI fights punish systems that create records after the fact. Decide store-vs-create on purpose, with counsel.
The story in one glance
Picture a PDF hold letter.
It asks for “all server logs, IP addresses, and HTTP header data” for visitors who touched a feature. An engineer opens the edge config. Access logging has been off for years — privacy posture, cost, or habit. Someone types in Slack: “Just turn it on. It’s a hold.”
That’s the fork this chapter exists for.
Chapter 7 taught you to stop guessing from a stale slide: a living data map, a counsel portal, preservation separate from production, and objections that name map gaps. This chapter adds one sharper question the map must answer out loud:
Did we ever store that — or are they asking us to start capturing what only ever flickered through RAM?
Walk it with counsel beside the whiteboard. Point at the web tier. Ask: disk log, object store, backup — or transient memory that evaporates when the request ends? If the honest answer is “we never wrote it down,” a hold isn’t a permission slip to build a surveillance stream. It’s a brief, an objection path, or — only if counsel and the court so require — a commence-capture decision with eyes open to privacy chill.
Teaching reconstructions only. Not screenshots of any party’s live product and not exhibits. Torrentspy appears here as a teaching story, not as settled ESI gospel.
Picture the night someone suggests “turn on verbose logging for the lawsuit.” Ask: are you storing what already exists — or creating a new discoverable record?
Plain English — store, preserve, create
Three verbs get mashed together in war rooms. Keep them apart.
- Produce (store → export). Rule 34 themes ask for ESI you already have — or that sits in systems under your possession, custody, or control in a form the rule reaches. Export the table. Hash the production. Chapter 7’s trail.
- Preserve. Stop deleting what you already keep. Snapshot. Hold flag. Still not disclosure — Chapter 7’s “preservation ≠ production” line.
- Create / commence capture. Flip
access_log_enabled. Write a collector. Reduce fleeting HTTP headers in RAM into permanent log files because someone sued. That’s a different legal machine. Alexander themes say Rule 34 is about documents already in existence. ReplayTV-era briefing themes push the same instinct: designing software to invent usage data you never collected isn’t ordinary document production.
If you remember only one sentence: a hold on nothing still yields nothing — until counsel decides whether “start logging” is ordered, agreed, or fought.
What the law is asking the product to do (themes)
Orient to five design pressures. Counsel owns the final call for your matter.
- FRCP 34 themes — existence first. The request assumes there’s something to produce. Your map must say what is retained and what isn’t — including “never_persisted.”
- Alexander themes — no create-by-default. “Produce documents already in existence” is the teaching baseline. “Build us a new log” is advocacy territory, not an engineer’s silent favor.
- ReplayTV themes — software to create data. When the ask is months of engineering to capture customer usage you never stored, treat it as create — even if opponents call it “discovery.” Offers to produce raw data you already collect are a different conversation.
- Torrentspy teaching story — RAM, headers, chill. In that fight, logging had been off; opponents pressed that user HTTP information flashed through server RAM and should be stored, preserved, and handed over. Defense themes (from contemporaneous teaching posts): create vs provide; RAM as ephemeral; “turn on logging” as a de facto injunction without bond; privacy chill if a privacy-centric site must start tracking IP/clickstream for the other side; overbreadth if all visitors get logged over a narrow claim set. Courts can order case-specific steps after burden and relevance analysis — Bunnell is real and fact-bound. Teach the pressure. Don’t invent a universal holding that every web server must log RAM, or that no court may ever order capture.
- Chapter 7 still owns the portal. Process classification, sealed ACLs, hashed productions, map-gap objections — reuse them. LE-55 only deepens the map’s honesty about RAM vs disk and the counsel path when someone asks to start capturing.
Field rule — put this on the release checklist: If counsel can’t tell a court what was never stored, the company doesn’t have an ESI story. It has a panic toggle.
Review this with counsel and eng on the same call. If Side A matches production, you’re still in the memo-to-coders handoff.
Side A — What loses (Slack flips the logger)
What goes wrong: Hold PDF hits Slack. Eng enables access logs “to be safe.” Overnight the edge writes IP, URL, and headers for every visitor. Privacy policy still says logging is minimal. Nobody scopes geo or claim. Three months later counsel is asked what the company “has.” The honest answer is a mess: new logs exist only after the flip; earlier periods never existed; nobody can prove what was searched on day one. Or the opposite failure: eng refuses all logging talk, but the data map still lists “server logs” as if they were on disk — and a declaration overclaims.
Why store-vs-create themes care: You either created a surveillance artifact under discovery pressure without a counsel path, or you misdescribed transient systems as stored ESI. Privacy chill isn’t abstract — users who chose a low-log product now feed a lawsuit’s clickstream. Overbreadth is free: global logging for a fourteen-work complaint shape of case.
Lawyer lens — what I’d ask on the call: Your signature needs a map version that distinguishes disk / object / backup from transient_ram / never_persisted. Objections need reason codes — never stored, create not produce, overbroad capture — tied to that map (Chapter 7). Citing Torrentspy as “we always win on RAM” is as weak as ignoring that courts sometimes order case-specific preservation.
Engineer lens: If access_log_enabled is a Friday hotfix during an active matter, the audit trail is a chat scrollback. If the map has no persistence tier, every production job is a guess. Empty files labeled “logs for Q1” are fiction — and fiction is how representations die.
Any hit means you don’t ship yet.
Non-compliance checklist (red flags)
- Hold or Rule 34 request auto-enables logging without counsel ticket
- Data map lists “logs” with no RAM vs disk vs never-persisted label
- Slack as system of record for “we turned logging on for the case”
- Privacy schedule promises minimal IP logging while discovery quietly enables it
- Production of empty or post-flip-only logs sold as complete history
- Global capture for a narrow claim set with no scope fields
- Chapter 7 portal exists but commence-capture and preserve-extant are the same button
Side B — What works better (map truth + counsel path)
What works better: The living map from Chapter 7 gains columns: persistence tier, logging flag state, retention if enabled, owner, last verified. Edge and API rows say never_persisted or transient_ram when that’s true — and disk when rotated logs actually exist. A hold on a never-logged service opens Preserve extant (nothing to snapshot but the config truth) and, separately, a Commence capture counsel ticket — not a silent config flip.
When opposing counsel demands RAM-derived clickstream, legal ops uses objection codes the portal already knows how to attach to a map version: never stored; create not produce; overbroad. If a court orders a scoped capture — or counsel agrees to one — eng flips access_log_enabled only under a counsel_capture_order_id, with scope (fields, geo, window), a privacy-notice delta if public statements change, and an append-only audit of when capture started and stopped.
Fixed user story: Request arrives → map shows which systems stored what for period T → preserve extant logs where they exist → produce with hash and map version → for never-stored periods, counsel briefs create-vs-produce (Rule 34 / Alexander / ReplayTV themes; Torrentspy pressure as teaching context) → if capture must start, gated config + notice review + scoped window — not a global panic log.
Compliance checklist (green flags)
- Map columns: RAM vs disk vs never; logging flag visible
- Preserve extant ≠ commence capture in the UI
access_log_enabledgated during matters; audit who flipped and why
- Objection codes for never-stored / create / overbroad / map gap
- Productions never invent rows for periods that never persisted
- Privacy schedule checked before voluntary or ordered capture starts
- Tabletop: hold on never-logged edge; Rule 34 for headers/RAM; preserve-only extant disk logs
Interface / code / data — one-page checklists
Run these as acceptance seeds — not as informal hunches. If you can’t export the Data row, you didn’t finish.
Interface (must-show): Data-map persistence tier and logging-flag state; hold actions split into preserve-extant vs commence-capture; commence-capture wizard (scope, retention, privacy impact, counsel sign-off); production UI limited to persisted allowlists; objection reason codes including never-stored and create-not-produce.
Interface (must-not): One “enable logs for lawsuit” button for any eng; hold that silently flips global logging; map that calls RAM “stored” without a tier label; Slack-only record of capture decisions.
Code: Config gates on access_log_enabled (and header/IP siblings) when a discovery matter or hold is active — require counsel_capture_order_id; preservation jobs refuse to “preserve” pure never-persisted rows without the commence path; production API fails closed with NEVER_STORED rather than shipping a fake complete log; audit capture start/stop; kill/revert leaves a historical window for honest later declarations.
Data: Extend the same Chapter 7 living map — storage_tier, logging config versions, counsel capture orders (matter, optional court order id, scope hash, privacy review), preservations, productions, objections. Prefer append-only. Retention on the discovery horizon counsel sets.
Lost vs fixed (scene card)
| Lost | Fixed | |
|---|---|---|
| Hold arrives | Slack: “turn logging on” | Map + counsel ticket; preserve ≠ create |
| Map | “We have server logs” (vague) | Disk / object / backup vs transient RAM / never |
| Config | Eng flips access_log_enabled |
Gated by counsel capture order + scope |
| Production | Empty or post-flip file called “complete” | NEVER_STORED for gaps; hash extant only |
| Privacy | Policy says minimal tracking; logs bloom | Notice/schedule delta before capture |
| Advocacy | Folklore about RAM | Rule 34 / Alexander / ReplayTV themes; Torrentspy as teaching story, not overclaim |
Template: Lawyer / Engineer card
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
| Lawyer | Engineer |
|---|---|
| For period T, did we store access/IP/header data — or only touch RAM? | Does the map row show storage_tier and access_log_enabled state? |
| Is this request produce-extant, preserve-extant, or commence capture? | Are preserve and commence-capture different code paths? |
| Can I object create-not-produce / never-stored in good faith (Ch 7 map version)? | Does export fail closed with NEVER_STORED instead of a fake file? |
| If a court orders scoped logging, what is the privacy chill and notice delta? | Will the flip require counsel_capture_order_id + scope hash + audit? |
| Am I overclaiming Torrentspy / Bunnell as universal ESI law? | Is Slack unable to enable logging during an active matter? |
| Six months later, can I reconstruct what never existed vs what we captured after order? | Do config versions and capture windows export with the production register? |
Try this on your product tomorrow
Screenshots and exports beat opinions.
- Open the living data map (Chapter 7). Pick the public edge or API tier. Circle whether access logs are on disk, in an object store, or never written. If the cell is blank, that’s the bug.
- Read
access_log_enabled(or your equivalent). Who can flip it today — and does a hold auto-flip it?
- Ask counsel to role-play a Rule 34 request for “all HTTP headers in RAM” for last quarter. What objection codes and map rows do you attach?
- Run a preserve-only job on a never-logged service. Did anything silent enable capture?
- Diff the privacy schedule against a hypothetical commence-capture. What sentence would become false overnight?
- Export one pretend declaration pack: map version, systems searched, systems marked never_persisted, any capture window. Missing fields mean the war room still owns you.
Where this goes next
Keep the loop moving — Law → Interface → Code → Data → Counsel sign-off.
- Privacy engineering threshold inventory — Chapter 7C (LE-67). AI decision logs stitch — Chapter 6F (LE-66).
- Living data map, counsel portal, preservation ≠ production, map-gap objections — Chapter 7 (LE-24 themes). This chapter only deepens RAM vs disk and the create path.
- Privacy rights inventory on the same map — LE-06 themes / privacy chapters earlier in this guide.
- CIPA prior consent for session replay is a different theory — Chapter 4B (LE-53). Don’t confuse “don’t start logging for discovery” with “don’t load FullStory before Accept.”
- Operating model / who signs commence-capture — later operating-model chapter. Pattern Map LE-55 when the index catches up.
Field rule — put this on the release checklist: Rule 34 themes reach what you stored. Starting a log you never kept is counsel’s create path — not an engineer’s favor.
This chapter is for education and discussion. It isn’t legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
This chapter is for education and discussion. It is not legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
Chapter 7C — Worked Example: Privacy Engineering Threshold Inventory
Pattern family: Privacy engineering threshold inventory — eleven Engineering→Legal inputs as a living intake gate (LE-67). Sits after legal process & data maps (LE-24; Chapter 7) and logging/ESI store-vs-create (LE-55; Chapter 7B). Feeds the living data map and tag congruence (LE-41; Chapter 4) — doesn’t duplicate those chapters.
Legal anchors (themes): Notice-at-collection / purpose limitation / processor & subprocessor transparency (CCPA/CPRA, GDPR Arts. 13–14 / 28, peer state laws); DSAR access/delete themes; cookie/SDK/consent regimes (LE-08); AI/ML training disclosures (LE-31 / LE-64); security-as-privacy control themes. Orientation: productize the threshold questions Engineering must answer before Legal can green-light a surface — then keep them continuously true.
As of September 2026: Re-check your geo matrix and notice templates; this chapter teaches intake discipline, not a new statute.
Why this memo exists
A privacy review two days before launch is too late. Inventory PI categories, purposes, and vendors while the design is still cheap to change.
You can’t honor rights you haven’t inventoried. Threshold triggers are product inputs, not annual PDF chores.
The story in one glance
Counsel receiving a “privacy review” ticket two days before launch.
The ticket says: “New social feature — please approve.” There’s a Figma. There’s no field list. Storage is “the cloud.” Purposes are “product improvement.” Third-party SDKs are “the usual.” AI training is “maybe later.” Deletion is “we can figure it out.” DSAR export is “Support downloads CSV.” Cookies are “Marketing owns that.” Security is “SOC2.”
Counsel can’t map what counsel can’t see. The living data map (Chapter 7) stays a museum piece. Tag congruence (Chapter 4) fails because nobody inventoried the new pixel.
Walk the ticket as if you were counsel arriving cold. Ask: can Engineering answer the eleven inputs below without a scavenger hunt? If any answer is “we’ll figure it out after launch,” the review isn’t ready — and neither is the release.
This chapter productizes eleven Engineering→Legal inputs as Law Engineering requirements: a threshold intake before Legal review is meaningful, plus a continuous update gate when any input drifts. Generic Brand / analytics SDK / KYC vendor only.
Plain English — eleven inputs, one living habit
Teach Engineering to arrive with these eleven answers. Legal then maps duties. Do not reprint the full data-map chapter or the congruence scanner chapter — link them.
| # | Input | Asks | Feeds |
|---|---|---|---|
| 1 | Field-by-field collection | Exact fields / sensors / derived signals | Notice (LE-06), map (LE-24) |
| 2 | Storage locations | Systems, regions, tiers (disk/object/vendor) | Map + ESI (LE-55) |
| 3 | Purposes | Per field/purpose pairing | Purpose limitation / notices |
| 4 | Internal processors | Squads/systems with access | Least privilege / insider risk |
| 5 | Third-party API/SDK exchange matrix | Who receives what, when, for what | LE-08 / DPAs / sale-share (LE-07) |
| 6 | AI/ML use & training on user data | Surfaces, training flags | LE-64 / LE-31 / LE-65 |
| 7 | Retention per type | TTLs / legal holds | Retention schedules |
| 8 | Deletion paths + impossibilities | What can / cannot be deleted and why | DSAR delete honesty |
| 9 | DSAR export paths | How access packs are built | Rights UX (LE-06) |
| 10 | Cookies / SDKs / tracking | Tags, pixels, SDK versions | Congruence (LE-41) |
| 11 | Security controls per store/API | Authn/z, encryption, logging | Security exhibits / breach (LE-23) |
Field rule — put this on the release checklist: Legal review without these eleven is theater. Shipping without updating them after change is amnesia.
Remember: a Law Engineer is a licensed attorney with software and product expertise. Engineers own the intake accuracy under counsel oversight.
What the law is asking the product to do (themes)
- Threshold gate. No “privacy LGTM” without inventory id + version covering the eleven inputs for that surface.
- Continuous update. Schema/SDK/purpose/AI changes reopen the gate — not annual privacy week.
- Feed, don’t fork. Inventory rows update the living map (Chapter 7) and trigger congruence scans (Chapter 4) — separate UIs, same truth.
- Honesty about impossibilities. If backups or derived embeddings can’t be deleted on the same TTL, say so in intake and notices.
- AI isn’t optional row 6. “We don’t think of it as ML” still needs a register pointer (LE-64).
- Generic vendors. Describe analytics SDK / KYC vendor / Brand acquirer — never client stack folklore.
Review this with counsel and eng on the same call. If Side A matches production, you’re still in the memo-to-coders handoff.
Side A — What loses (“approve the Figma”)
What goes wrong: Privacy review is a checkbox on the launch template. Engineers paste last quarter’s answers.
New analytics SDK ships under “bugfix.” AI summarizer added to support without row 6. DSAR still claims full delete.
Living map updated “someday.” Congruence scanner fails red; launch proceeds. When an AG asks for categories of sources and third parties, Legal reconstructs from HAR files and memory.
Why this matters in court / before a regulator: Notice, sale/share, DSAR, and security narratives all require the same underlying inventory. Skipping threshold intake makes every downstream pattern (LE-06/07/08/24/41/64) brittle.
Lawyer lens — what I’d ask on the call: Refuse to sign until the eleven are filled or explicitly N/A with reason.
Engineer lens: If your PR can ship a new field or SDK without touching inventory version, the gate is fake.
Any hit means you don’t ship yet.
Non-compliance checklist (red flags)
- Privacy tickets without inventory version
- “Same as before” with no diff
- Blank third-party matrix
- AI/ML row omitted for generative/review features
- Deletion claimed absolute where impossibilities exist
- DSAR path untested against new fields
- Cookie/SDK list diverges from production (LE-41 failure)
- Security row is a logo, not controls per store
- Client/vendor brand folklore in the intake form
Side B — What works better (intake → sign → map sync → reopen on drift)
What works better: privacy_threshold_inventory records (per surface/release) with eleven sections, owners, and inventory_version.
Counsel sign-off references that version (Chapter 31 / 31B). On merge, automation proposes living-map patches (Chapter 7) and queues congruence scan (Chapter 4).
AI rows must cite surface_id (LE-64). Deletion impossibilities become notice footnotes counsel approves.
Continuous: schema migration hooks and SDK register changes invalidate inventory freshness.
Fixed user story: Squad opens feature → fills eleven inputs → counsel reviews → sign-off artifact cites inventory_version → map/congruence update → ship. Later SDK bump → freshness fail → reopen rows 5/10/11 → re-sign.
Compliance checklist (green flags)
- Threshold inventory required artifact on privacy-gated launches
- Eleven sections complete or N/A-with-reason
- Map sync + congruence trigger on approve
- AI row linked to register
- Deletion impossibilities documented
- Freshness SLA (e.g., invalid on SDK/schema/AI change)
- Generic vendor language only in templates
Template: Lawyer / Engineer card
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
| Lawyer | Engineer |
|---|---|
| Are all eleven inputs present for this surface? | Inventory schema validates required sections? |
| Which purposes are primary vs secondary? | Purpose tags on fields enforced in analytics config? |
| Who are third parties this week? | Exchange matrix diffs against SDK register? |
| Any AI/ML training or inference on user data? | Row 6 requires surface_id or explicit none? |
| What can DSAR delete / export actually do? | Integration test packs match claims? |
| What did security attach per store? | Controls checklist not a single SOC badge? |
| When does intake go stale? | Hooks on schema/SDK/AI register changes? |
Interface / code / data — one-page checklists
Run these as acceptance seeds — not as informal hunches. If you can’t export the Data row, you didn’t finish.
Interface (must-show): Intake form/UI with eleven sections; stale banner; links to map & congruence results; counsel sign-off view.
Interface (must-not): Single “privacy approved” checkbox; optional blank AI row for AI features; vendor name drop-downs filled with client folklore.
Code: privacy_threshold_inventory versioning; PR check for inventory freshness; webhooks from SDK register / AI register / schema migrations; map-patch proposer; congruence job trigger.
Data: inventory_records (11 sections JSON); freshness_events; sign_off_ids; links to data_map_version, congruence_scan_id, ai_surface_ids.
Lost vs fixed (scene card)
| Lost | Fixed | |
|---|---|---|
| Launch privacy review | Figma + vibe | Eleven-input inventory |
| New SDK | Silent | Freshness fail → reopen |
| AI feature | Omitted | Row 6 → LE-64 link |
| Delete claim | Absolute | Impossibilities documented |
| Map / tags | Drift | Sync + congruence on approve |
Try this on your product tomorrow
Screenshots and exports beat opinions.
- Pick a feature that shipped last month. Fill the eleven inputs from memory — where do you blank? That blank is the bug.
- Diff production SDKs against the last inventory’s row 5/10.
- Confirm AI features cite register ids in row 6.
- Run a DSAR export for a test user — does it include fields added after the last inventory?
- Ask whether schema migrations reopen freshness — if not, wire the hook.
- Open Chapter 7 and Chapter 4: inventory should update them, not replace them.
Where this goes next
Keep the loop moving — Law → Interface → Code → Data → Counsel sign-off.
- Living data map / counsel portals — Chapter 7 (LE-24).
- Logging & ESI store vs create — Chapter 7B (LE-55).
- Privacy ↔︎ tags congruence — Chapter 4 (LE-41); CIPA replay — Chapter 4B (LE-53).
- AI register / shadow AI — Chapters 6D / 6E.
- Operating model / legal review triggers — Chapters 31 / 31B.
- Pattern Map LE-67 — Chapter 32.
Field rule — put this on the release checklist: The eleven inputs are how Engineering speaks Legal’s language before launch — and how both notice when the truth moves.
This chapter is for education and discussion. It isn’t legal advice. It teaches threshold intake and continuous update — it doesn’t replace Chapters 4 or 7.
This chapter is for education and discussion. It is not legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
Chapter 8 — Worked Example: Affiliate KYC & Endorsement Disclosures
Pattern family: Affiliate onboarding KYC gates (LE-19) + FTC endorsement / affiliate #ad disclosures (LE-18)
Legal anchors: FTC Act § 5, 15 U.S.C. § 45(a); FTC v. LeadClick Media, LLC, 838 F.3d 158 (2d Cir. 2016) (network participation/control); FTC v. Credit Bureau Center, LLC, 325 F. Supp. 3d 852 (N.D. Ill. 2018) (agency/ratification themes); FTC Endorsement Guides, 16 C.F.R. Part 255 (revised 2023; 88 Fed. Reg. 48092)—§§ 255.5 / 255.0(f) / 255.1(d),(f); affiliate Example 11. Guides interpret § 5; they aren’t statutory safe harbors.
As of September 2026: Re-check eCFR Part 255, current FTC staff FAQ language, and your program’s monitoring cadence before quoting disclosure templates in a matter. KYC/KYB gates here are practice controls—not a money-services AML program unless the client is otherwise regulated.
Why this memo exists
Affiliate programs fail on KYC gaps and FTC endorsement hygiene — tracking links without either are not a compliance program.
Payees who promote you’re an ad surface. Track who they are and what they must disclose.
The story in one glance
Illustrative teaching figure. Not official screenshots of any party’s product.
Open your affiliate portal. Can a stranger mint a tracking link the day they apply? Can a commissionable post go live with “#ad” only in the bio? If monitoring finds a fake-news lander tonight, do commissions still pay in the morning?
That’s the whole chapter in three questions.
Lost: pay-per-click affiliates get tracking links on apply day; posts ship without clear #ad; rogue landers keep earning. Fixed: identity/KYB and risk rating clear before links; disclosure templates gate publish; tagged links and a kill switch stop commissions when monitoring flags deception.
Why this is an engineering problem
Affiliate programs fail in two places that look separate on an org chart and fuse into one FTC story.
First: Who are you paying? If anyone can mint a tracking link before you know their identity, traffic method, and risk tier, you aren’t running a program — you’re renting your brand to strangers.
Second: Do consumers know this is an ad? Commissionable posts without a clear material-connection disclosure (or with “#ad” buried under “more,” in a bio, or in a first comment while the pitch lives in the caption) create a deception story even when onboarding was perfect.
A Law Engineer (a licensed attorney with software/product expertise) owns both gates. Engineers build them under that counsel’s oversight.
| Duty | What it asks | Typical miss |
|---|---|---|
| Onboarding KYC/KYB (LE-19) | Know who you pay; screen; risk-rate; withhold links/payouts until cleared; suspend when deception is known | Instant tracking links; OFAC skipped until finance notices; silent pay after suspend |
| Endorsement disclosure (LE-18) | Material connections disclosed clearly and conspicuously; advertiser expected to monitor; publish-time proof | Bio-only “affiliate”; first-comment #ad; no snapshot at publish |
Field rule — put this on the release checklist: Links without identity are a ratification machine — you keep benefiting after you should have known better. Identity without disclosure is still a deception machine. Ship both gates, or you have a growth dashboard — not Law Engineering.
Side A — What loses
Don’t ship this. If your current build matches Side A, stop the release train and fix it with counsel.
Instant links, no KYC (LE-19 failure)
What goes wrong: Growth issues a tracking URL as soon as someone “applies.” Identity, beneficial ownership, tax forms, sanctions screen, traffic-method questionnaire, and sample creatives are “later.” Sub-affiliates cascade without attestation. Finance pays whoever produced CPA events. When complaints or chargebacks spike, the affiliate stays live because revenue is sticky.
Why § 5 theories care (themes): LeadClick shows networks that recruit, approve/edit, and pay publishers using known deceptive formats can face direct participation/control liability — not merely “aiding.” Credit Bureau Center shows merchants that continue accepting affiliate traffic after notice of misconduct invite ratification (and related agency) themes. Onboarding isn’t a statutory safe harbor; it’s the operational fact pattern that defeats — or proves — knowledge and continued benefit.
Lawyer lens — what I’d ask on the call: If counsel can’t show who approved this publisher, what risk rating applied, and when links were suspended after a fake-news lander, ratification arguments write themselves from the payment ledger.
Engineer lens: If GET /affiliate/tracking_link succeeds while approval_state is pending_*, the stack is incomplete.
Undisclosed #ad and rogue claims (LE-18 failure)
What goes wrong: Commissionable posts ship with no material-connection disclosure, or with “affiliate link” buried under “more,” only in a profile bio, or only in a first comment while the endorsement lives in the main caption/video. Brands can’t prove what was shown at publish time. Monitoring is a quarterly spreadsheet. Creatives claim “clinically proven,” romance “success stories,” or fake-news frames the brand never substantiated.
Why the Guides care (themes): Under § 255.5, unexpected material connections must be disclosed clearly and conspicuously. § 255.0(f) expects disclosures that are difficult to miss, unavoidable in interactive media, and modality-matched. Advertisers are expected to monitor endorsers (§ 255.1(d)). Affiliate Example 11: commissionable links need clear disclosure; staff FAQ language prefers “Ad,” “Advertisement,” “Paid link,” or “I earn commissions…” — “affiliate link” alone may be unclear.
Lawyer lens — what I’d ask on the call: Platform “Paid partnership” tools help; they don’t auto-satisfy caption/audio disclosure for every modality. Fake/gated reviews raise separate Part 465 themes.
Engineer lens: If publish succeeds with disclosure_present=false on a paid campaign, monitoring is fiction.
Any hit means you don’t ship yet.
Non-compliance checklist (red flags)
- Tracking links or offer URLs in
pending_kyc/pending_review
- Payouts without OFAC/SDN screen and named-account controls
- No
risk_rating,approval_actor, or questionnaire hash on cleared rows
- Silent continued payment after
suspendedfor deception
- Undisclosed sub-networks where contract bans them
- Paid posts without disclosure template / placement metadata
- Bio-only or first-comment-only disclosure for main-caption endorsements
- No immutable disclosure snapshot / UI archive at publish
- No kill switch that 403s links and holds commissions within minutes of a confirmed rogue lander
Side B — What works better
Here’s the build worth shipping — gates, records, and an export counsel can defend.
Onboarding that can survive an FTC letter (LE-19 theme)
Think of clearance as a state machine, not a welcome email.
- Application packet: Legal name, DBAs, geos, traffic sources, verticals, prior terminations, disclosure practices, sample creatives; method disclosure (SEO/paid/email/SMS/social/incentivized) plus sub-affiliate cascading attestation.
- KYC/KYB document classes (practice controls): Collect (or vendor-verify) identity/entity artifacts appropriate to the publisher type — e.g. government ID or passport for individuals; formation docs / EIN or tax ID, beneficial-ownership attestation for entities; W-9/W-8 as finance requires; proof of payout account ownership. Prefer vendor refs over raw image vaults. Run a sanctions / SDN screen (OFAC and counsel-listed lists) before link mint and before first payout; hit → hard stop with dual-control release only. These are program controls, not a money-services AML claim unless the client is otherwise regulated.
- State machine:
applied → kyc → risk_review → cleared|rejected; every transition stores actor, timestamp, notes.
- Hard gates: No tracking links until
approval_state=clearedand sanctions screen clear; payout batches exclude non-cleared and sanctioned parties.
- Program terms clickwrap before clearance (formation/assent pattern from Chapter 2).
- Monitoring → kill switch: Flag
deceptive_trafficauto-suspends links, holds commissions, opens a case queue; clawback authority lives in contract and ops.
- Export: Onboarding zip per affiliate — questionnaire hash, screening refs, approval actor, monitoring disposition.
Adult verticals are often high-risk tier; dating bans fake-profile creatives as a brand-safety overlay. Crypto payouts escalate to regulated KYC/AML depth when in scope.
Disclosures that can survive a Guides inquiry (LE-18 theme)
- Composer gate / disclosure proximity: Approved disclosure template above or inseparable from the endorsement content (first lines of caption / pinned / same frame) — not bio-only, not “more,” not first-comment-only while the pitch lives in the main caption or video. Template picker for
#ad, “Ad,” “Advertisement,” “Paid partnership with [Brand],” “I earn commissions from links” (staff FAQ language prefers clear “Ad”/“Paid…” forms; “affiliate link” alone may be unclear).
- Preview lint: Contrast/size failures warn; stories need per-frame rules; audiovisual needs on-screen + oral prompts where modality requires.
- Publish API: When
campaign.requires_disclosure=true, reject withoutdisclosure_template_id+ placement metadata that records proximity (e.g.first_visible_region).
- Link tagging: Wrappers set tracking/
relas needed but never replace visible disclosure.
- Monitoring job: Sample posts; flag missing disclosure; notify creator; escalate per brand program.
- Evidence: Immutable
disclosure_snapshot(text + viewport/HTML archive), template version, Guides policy version, enforcement actions.
Compliance checklist (green flags)
- Links 403 until cleared; payouts honor the same gate
- Screening logs + risk rating + approval actor on every clearance
- Suspension kills links and holds pay within minutes of confirmed deception
- Disclosure templates counsel-approved per locale/channel
- Publish blocked without disclosure when program requires it
- Snapshots prove first-visible placement at publish time
- Rogue-claim / fake-news creatives have a documented kill path
- Counsel can export one affiliate packet and one campaign evidence zip
Template: Lawyer / Engineer card
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
| Lawyer | Engineer |
|---|---|
| Can we show we did not keep paying after notice of deception? | Does deceptive_traffic auto-suspend links + hold commissions with an audit row? |
| Who approved this publisher, on what risk tier, with what packet? | Are approval_actor, risk_rating, and questionnaire hash immutable on clear? |
| Are material connections disclosed clearly and conspicuously for each modality? | Does publish require disclosure_template_id + placement; is bio-only rejected? |
| Can we prove what the consumer saw at publish time? | Is disclosure_snapshot / ui_archive_id written before the post is live? |
| Do program terms, clawback, and sub-affiliate rules match ops reality? | Are pending states unable to mint offer URLs (403)? |
| Is monitoring a reasonable program — or a hope? | Is there a sampling job + escalation queue with dispositions? |
Interface / code / data — one-page checklists
Run these as acceptance seeds — not as informal hunches. If you can’t export the Data row, you didn’t finish.
Interface (must-show): KYC/KYB application (document classes, methods, sample creatives); sanctions-screen status before link mint; status (pending_* / cleared / rejected / suspended); program-terms clickwrap; composer disclosure in the first visible region (proximity for #ad / Paid partnership); template picker; preview lint; monitoring case UI.
Interface (must-not): Tracking links while pending; pre-checked “I disclosed” without a template; bio-only / first-comment-only disclosure for main-content endorsements; silent pay after deception suspend.
Code: Links/payouts gate on approval_state=cleared + clear sanctions screen (before link mint and before first payout); state machine with actor/timestamp; monitoring → suspend + case queue; publish 422 without disclosure + proximity metadata when required; wrappers never replace visible disclosure.
Data: affiliates, affiliate_kyc_artifacts (prefer vendor refs), affiliate_screens, affiliate_questionnaires (content_hash), affiliate_approvals, affiliate_monitoring_flags, endorsement_campaigns, creator_posts (template, placement, ui_archive), disclosure_templates, monitoring_hits. Retention: consumer-claim / FTC / tax horizon per counsel.
Try this on your product tomorrow
Screenshots and exports beat opinions.
- Applicant in
pending_kyc— can you mint a tracking link? If yes, stop.
- Clear without approval actor / questionnaire hash — row refuses?
- Paid publish with disclosure deleted → 422?
- Live sample: disclosure in first visible caption region (not bio-only)?
- Confirmed rogue lander → links 403 and commissions held within minutes?
- Export one onboarding zip and one campaign disclosure pack. Missing fields = incomplete Law Engineering.
Where this goes next
Keep the loop moving — Law → Interface → Code → Data → Counsel sign-off.
Unified payee diligence schema (creators / affiliates / cash referrers / custom-deal payees) — Chapter 8B (LE-73). Cash referral KYC triggers — Chapter 8C (LE-74).
Influencer programs that need the full detect → legal alert → kill loop — not only affiliate KYC + #ad — see the program OS in Chapter 17 (LE-52). CAN-SPAM / TCPA when others mail or text “on your behalf” (LE-20, LE-21).
Dating deceptive creatives (LE-22). Creator KYC overlap (LE-28).
MCC / chargeback pressure from junk traffic (LE-27, LE-26, LE-39). Deeper AML rails when payouts require them (LE-33, LE-34).
This chapter is for education and discussion. It is not legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
Chapter 8B — Worked Example: Unified Payee Diligence Schema
Pattern family: Unified payee diligence schema — individual vs business (LE-73). Sits after affiliate KYC & endorsement disclosures (LE-18 / LE-19; Chapter 8). Cross-cuts creator onboarding (LE-28; Chapter 13), cash referral triggers (LE-74; Chapter 8C), custom-deal EDD (LE-71), and AML/sanctions themes (LE-33 / LE-34).
Legal anchors (themes): Shared field matrix for creator / affiliate / cash-referrer / custom-deal payees — government ID + liveness, tax W-9/W-8, bank statement / payout-account ownership match, OFAC; KYB adds formation, principal ID, beneficial ownership, optional good standing; tiers minimal|full|edd; API returns missing_fields with 403 when incomplete; store vendor refs not raw identity vaults in product DBs.
As of September 2026: Generic Brand / KYC vendor / Acquirer. No client stack names.
Why this memo exists
Creators, affiliates, vendors — one diligence shape counsel can defend, eng can enforce.
The story in one glance
Picture four payout pipes: creators, affiliates, cash referrers, and custom-deal talent.
Each team invented a spreadsheet. Creators need selfie+ID; affiliates need “KYB someday”; referrers get cash with a PayPal email; custom deals skip tax forms until April panic. OFAC runs on Tuesdays for one pipe and never for another. When counsel asks for one payee packet, engineering joins four schemas and still lacks bank-ownership match.
Unify the schema and tiers — specialize UX, not the evidence model.
Walk one payout batch with the payee register open. Ask: did every row clear the same diligence schema before money moved — or did “friend of a friend” skip the gate?
Plain English — one matrix, tiered depth
| Tier | Typical use | Core fields (counsel-tuned) |
|---|---|---|
| minimal | Low-risk credits-only / below threshold | Identity basics; sanctions light screen; tax form if required |
| full | Standard creator/affiliate/cash referrer payouts | Gov ID + liveness; W-9/W-8; payout-account ownership match; OFAC |
| edd | Elevated / custom-deal / high-risk geos | Full + source-of-funds / enhanced docs; beneficial ownership depth |
Individual: gov ID + liveness; tax; bank/payout ownership match; OFAC.
Business (KYB): formation docs; principal ID (+ liveness as required); beneficial ownership; optional good-standing certificate; OFAC on entity + principals.
Field rule — put this on the release checklist: Prefer kyc_vendor_ref / kyb_vendor_ref in product tables — not raw ID images in the app database.
Remember: a Law Engineer is a licensed attorney with software and product expertise.
Review this with counsel and eng on the same call. If Side A matches production, you’re still in the memo-to-coders handoff.
Side A — What loses (“four spreadsheets”)
What goes wrong: Per-pipe schemas. Cash referrers bypass affiliate KYC. Business affiliates paid to personal accounts without BO. Missing tax forms discovered at 1099 time. OFAC inconsistent. APIs return generic 403 with no missing_fields. Raw scans in S3 next to product media.
Any hit means you don’t ship yet.
Non-compliance checklist (red flags)
- Pipe-specific incompatible schemas
- Cash payout without full-tier diligence
- No ownership match on payout account
- Raw ID vault in product DB
- Opaque 403 (no missing_fields)
- EDD only in email threads (LE-71 miss)
Side B — What works better (shared schema → tier → gate)
What works better: payee_diligence schema shared across payee_types (creator|affiliate|cash_referrer|custom_deal|…). entity_type individual vs business. diligence_tier minimal|full|edd. Gate payout (and link-mint where applicable) on diligence_state=clear for required tier. API 403 body lists missing_fields[]. Vendor refs + screening refs stored; retrieval via vendor/counsel portal. Cash referral policy (LE-74) maps cash compensation → same gate as affiliates. Custom deals attach EDD register (LE-71). Ongoing monitoring hooks (LE-34) subscribe to payee_id.
Compliance checklist (green flags)
- One schema, many payee_types
- Tier policy encoded
- missing_fields on 403
- Vendor refs not raw vaults
- Ownership match before first payout
- OFAC/sanctions refs on clear
Template: Lawyer / Engineer card
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
| Lawyer | Engineer |
|---|---|
| Which tier per payee_type / geo / amount? | Policy table → gate? |
| Individual vs KYB field sets approved? | entity_type branches schema validation? |
| May product store raw ID images? | Vendor refs only in app DB? |
| What does a 403 reveal to the client? | missing_fields[] stable enum? |
| How does EDD attach to custom deals? | LE-71 register joins payee_id? |
Interface / code / data
Interface: Unified diligence wizard (branching individual/business); tier progress; clear list of missing fields; payout locked with human-readable reasons.
Code: shared validator; tier policy; payout/link gates; 403 serializer; vendor adapters; monitoring subscribe.
Data: payees; payee_diligence_cases; diligence_fields; vendor_refs; sanctions_screen_refs; tax_form_refs; payout_account_ownership_checks; missing_fields_events.
Lost vs fixed
| Lost | Fixed | |
|---|---|---|
| Model | Four schemas | One matrix |
| Cash referrer | Email PayPal | Same gate as affiliate when cash |
| API | Opaque 403 | missing_fields |
| Storage | Raw IDs in app DB | Vendor refs |
Try this on your product tomorrow
Screenshots and exports beat opinions.
- Call payout for a creator missing liveness — 403 lists
liveness?
- Business affiliate without beneficial ownership — blocked at full tier?
- Confirm product DB has vendor refs, not ID image bytes.
- Cash referrer above threshold — same diligence_state gate as affiliate?
- Export one payee packet across types — same field names?
Where this goes next
Keep the loop moving — Law → Interface → Code → Data → Counsel sign-off.
- Affiliate KYC + disclosures — Chapter 8 (LE-19 / LE-18).
- Cash referral KYC triggers — Chapter 8C (LE-74).
- Creator onboarding — Chapter 13 (LE-28).
- Custom deal EDD — Chapter 13B (LE-71).
- AML / sanctions monitoring — Pattern Map LE-33 / LE-34.
- Pattern Map LE-73 — Chapter 32.
Field rule — put this on the release checklist: One diligence language for every payee pipe — tiers change depth, not dialect.
This chapter is for education and discussion. It isn’t legal advice. Tier thresholds and field lists are counsel-owned for your facts and jurisdictions.
This chapter is for education and discussion. It is not legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
Chapter 8C — Worked Example: Cash Referral KYC Triggers
Pattern family: Cash referral → KYC trigger (LE-74). Sits after unified payee diligence (LE-73; Chapter 8B) and affiliate KYC (LE-19; Chapter 8). Deepens LE-19 / loyalty–promo themes (LE-51) without duplicating the full affiliate chapter.
Legal anchors (themes): Credits-only referrals vs cash-compensated referrers; cash unlocks the same diligence gate as affiliates; anti-fraud (self-referral, mule accounts); disclosure of referral compensation where endorsement/material-connection themes apply.
As of September 2026: Generic Brand. No client names.
Why this memo exists
Cash moving to humans triggers KYC and anti-abuse gates. Design them before the promo launches.
The story in one glance
Picture a “invite friends” growth loop.
Credits-only rewards stay inside the wallet. Then Finance turns on cash payouts for top referrers — same lax email signup. No KYC. No tax form. No OFAC. Affiliates next door still wait in pending_kyc. Fraud rings refer themselves across mule accounts. Marketing calls it “community love” without saying referrers earn cash.
Cash is the trigger. Credits-only can stay light (counsel-tuned). Cash-compensated referrers enter the unified payee diligence gate (LE-73) at the affiliate-equivalent tier.
Walk one cash referral that paid out last week. Ask: what KYC trigger fired before the transfer — amount, velocity, geo, or “we know them”? If the answer is vibe, keep reading.
Plain English — credits vs cash
| Mode | Diligence posture (typical) |
|---|---|
| Credits-only | Minimal / wallet controls; anti-fraud graph; no cash rail |
| Cash-compensated | Same diligence gate as affiliates (full or policy tier via LE-73) |
| Hybrid | Cash unlock path re-runs gate before first cash payout |
Also: disclose material connection when referrers publicly endorse (LE-18 adjacency); clawback / velocity caps (LE-51 adjacency); block self-referral graphs.
Field rule — put this on the release checklist: If cash leaves the platform to a referrer without payee diligence clear, you built an affiliate bypass.
Remember: a Law Engineer is a licensed attorney with software and product expertise.
Review this with counsel and eng on the same call. If Side A matches production, you’re still in the memo-to-coders handoff.
Side A — What loses (“growth exception”)
What goes wrong: Referral cash uses a separate micro-ledger with email + PayPal. No join to payees. Affiliates joke that referral cash is the easy path. Self-referral undetected. No compensation disclosure on public invite landers. 1099 surprise. OFAC never ran.
Any hit means you don’t ship yet.
Non-compliance checklist (red flags)
- Cash referrer ≠ payee diligence schema
- Weaker gate than affiliate for same cash
- No self-referral / mule controls
- Public endorsement without disclosure
- Tax/OFAC after first payout
- Credits→cash flip without re-gate
Side B — What works better (mode flag → same gate)
What works better: referral_compensation_mode = credits|cash|hybrid. Credits path: wallet + fraud graph. Cash path: create/join payee with payee_type cash_referrer; require LE-73 tier clear before first cash payout (and before raising cash limits). Hybrid: mode change event triggers diligence. Anti-fraud: device/payment/graph edges; self-referral deny. Public invite/UGC endorsement: disclosure templates when in scope (LE-18). Monitoring holds (LE-19 spirit) on abuse.
Compliance checklist (green flags)
- Cash mode requires payee clear
- Same schema as other payees
- Self-referral blocked + logged
- Disclosure where public endorsement
- Mode-change re-gate tested
- Exportable referral+diligence packet
Template: Lawyer / Engineer card
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
| Lawyer | Engineer |
|---|---|
| When does referral cash equal affiliate diligence? | cash mode → LE-73 gate? |
| Credits-only still need fraud controls? | Graph / velocity / self-referral jobs? |
| Must public invite posts disclose pay? | LE-18 templates when endorsement? |
| Tax and sanctions owners? | W-9/W-8 + OFAC before cash? |
| Hybrid flip rules? | Mode-change event re-opens diligence? |
Interface / code / data
Interface: Clear “credits vs cash” program rules; cash unlock checklist; payout locked with missing_fields; fraud hold messaging.
Code: mode flag; payee join; gate before cash; self-referral detector; disclosure lint on public referral content.
Data: referral_events; referral_compensation_mode; payee_id join; fraud_graph_decisions; disclosure_events (if public).
Lost vs fixed
| Lost | Fixed | |
|---|---|---|
| Cash path | Email PayPal | LE-73 payee gate |
| Parity | Weaker than affiliate | Same diligence language |
| Fraud | Hope | Graph + holds |
| Disclosure | Silent cash | LE-18 when endorsing |
Try this on your product tomorrow
Screenshots and exports beat opinions.
- Enable cash for a referrer with empty diligence — payout should 403 + missing_fields.
- Self-referral fixture — denied?
- Flip credits→cash — re-gate fires?
- Public “I got paid to invite” post without #ad/disclosure — lint?
- Export one cash-referrer packet beside an affiliate packet — same field names?
Where this goes next
Keep the loop moving — Law → Interface → Code → Data → Counsel sign-off.
- Unified payee diligence — Chapter 8B (LE-73).
- Affiliate KYC + disclosures — Chapter 8 (LE-19 / LE-18).
- Loyalty / promo abuse — Chapter 16 (LE-51).
- Influencer program OS — Chapter 17 (LE-52).
- Pattern Map LE-74 — Chapter 32.
Field rule — put this on the release checklist: Cash referral is affiliate economics wearing a growth hoodie — gate it like payee cash.
This chapter is for education and discussion. It isn’t legal advice. Thresholds and disclosure scope are counsel-owned.
This chapter is for education and discussion. It is not legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
Chapter 9 — Worked Example: DMCA Notice & Counter-Notice Intake
Pattern family: DMCA notice / counter-notice intake (LE-15); feeds repeat-infringer policy (LE-16)
Legal anchors: 17 U.S.C. § 512—harbors (a)–(d) (§ 512(n)); § 512(i) repeat-infringer + STM; agent § 512(c)(2) / 37 C.F.R. § 201.38 (3-year validity); notice § 512(c)(3)(A); expeditious removal § 512(c)(1)(C); put-back § 512(g) (10–14 business days unless suit notice); § 512(f)/(m)/(l). Practice: Perfect 10 v. CCBill, 488 F.3d 1102 (9th Cir. 2007); Ellison v. Robertson, 357 F.3d 1072 (9th Cir. 2004); Motherless, 885 F.3d 597 (9th Cir. 2018); knowledge specificity Viacom, 676 F.3d 19 (2d Cir. 2012); Veoh, 718 F.3d 1006 (9th Cir. 2013); Lenz, 815 F.3d 1145 (9th Cir. 2016) (sender fair-use consideration).
As of September 2026: Cox Communications, Inc. v. Sony Music Entertainment, 607 U.S. ___ (Mar. 25, 2026), narrowed contributory liability themes for conduit ISPs—it does not repeal § 512 for UGC hosts and preserves § 512(l). Don’t merge DMCA intake with TAKE IT DOWN or NCII intakes. “Expeditious” isn’t a fixed statutory hour count—document a business SLA without inventing a fake “statutory 24h.”
A Friday question that exposes the harbor
Illustrative teaching figure. Not official screenshots of any party’s product.
Counsel asks a simple Friday question: “Show me the last compliant DMCA notice we processed end to end.”
On the lost side, someone digs through a personal Gmail, a Slack thread, and a soft-hidden URL. There is no removed_at. There is no counternotice calendar. High-ARPU uploaders never meet a strike ladder. A notice that arrives as a Twitter DM screenshot bounces forever instead of normalizing into statutory elements and an honest clock.
On the fixed side, the answer is an export: published agent matching the Copyright Office directory, a validated six-element notice, ticketed expeditious removal, subscriber notice, 10/14 business-day put-back clocks, and a strike event feeding repeat-infringer policy.
Safe harbor is not a vibe. It is a path you can replay — agent designation, six-element notice, removal clock, counternotice calendar. And remember the harbor lesson that feeds Chapter 18: companies have lost DMCA safe harbor because they did not terminate repeat infringers. A policy on paper is not enough. You need to track strikes and terminations and present that ledger in evidence when harbor is on the line.
Why § 512 is an engineering problem (plain English)
Safe harbor under the Digital Millennium Copyright Act is something courts check in the stack.
Did you designate an agent?
Did you implement notice-and-takedown?
Did you act expeditiously on identified material?
Did you honor put-back?
Did you reasonably implement a repeat-infringer policy?
“We take copyright seriously” is marketing. Exportable timestamps, hard disables, and a calendar that knows business days are Law Engineering.
Remember: a Law Engineer is a licensed attorney with software and product expertise. Engineers build these gates under that counsel’s oversight.
| Stage | What statute asks | Typical miss |
|---|---|---|
| Agent | Public contacts + Copyright Office directory; keep current; 3-year renewal | Personal Gmail; expired designation; site ≠ directory |
| Notice | Written notice with substantially all six § 512(c)(3)(A) elements | Free-form email missing perjury attestation or location |
| Removal | Expeditious disable of identified material; log it | Soft-hide; no removed_at; tickets in Slack |
| Counternotice | Notify subscriber; calendar restore window; suit notice cancels | Restore day 3 “to be nice,” or never restore |
| Strikes | § 512(i) policy that can terminate repeat infringers | ToS copy; high-ARPU accounts never die |
Field rule — put this on the release checklist: Statutory elements → form → expeditious removal → counternotice clocks → repeat-infringer feed. Skip a link and the harbor story breaks.
Review this with counsel and eng on the same call. If Side A matches production, you’re still in the memo-to-coders handoff.
Side A — What loses
Don’t ship this. If your current build matches Side A, stop the release train and fix it with counsel.
Email-only agent and missing fields
What goes wrong: “DMCA: legal@startup.com” in the footer. The inbox auto-filters to promotions, or the only person who monitors left the company.
Notices arrive as PDFs in support chat. The form (if any) demands non-statutory extras as a condition of processing, or skips the signature / good-faith / perjury elements.
Location is “all infringing files on your site.”
Why this matters in court / before a regulator: § 512(c)(2) and 37 C.F.R. § 201.38 require public availability and Office designation; designations expire after three years unless amended/resubmitted. Ellison themes: a dead agent inbox isn’t implementation. CCBill themes: substantial compliance with the statutory elements — don’t invent extra formats as mandatory gates, and don’t treat deficient notices as effective knowledge notices without a cure path.
Lawyer lens — what I’d ask on the call: Failure to designate is a complete bar to (c)/(d) harbors for the period of non-designation. Directory parity is a launch checklist item, not a nice-to-have.
Engineer lens: If received_at is “when someone opened Slack,” expeditious action is unprovable.
No clocks, no strike ladder
What goes wrong: Removals happen “when we can.” Subscribers never get notice. Counternotices are Word docs. Someone restores early to calm a creator, or restores never. Repeat uploaders keep accounts because ARPU is high. Intimate-image and copyright tickets share one “IP” queue.
Why this matters in court / before a regulator: § 512(g) restore is not less than 10 nor more than 14 business days after counternotice unless the complainant notices a filed action. Early restore and late restore are both process failures. § 512(i) requires a reasonably implemented and informed repeat-infringer policy — Motherless themes: reasonableness ≠ perfection, but a policy that never terminates anyone isn’t reasonable implementation.
Lawyer lens — what I’d ask on the call: Harbor loss ≠ liability (§ 512(l)) — but earn the harbor when you can. Don’t overread Cox (2026) as a UGC-host free pass.
Engineer lens: Without server-enforced restore_not_before / restore_not_after, put-back is a calendar invite.
Any hit means you don’t ship yet.
Non-compliance checklist (red flags)
- Unmonitored / auto-deleting agent email; public contacts ≠ Office directory; expired designation (no T-90 alert)
- Form missing any of the six § 512(c)(3)(A) elements; non-statutory extras required to process (CCBill anti-pattern)
- Soft-hide without hard disable; no
removed_at/ operator_id
- Restore before day 10 business or after day 14 without a rule engine
- DMCA merged with TIDA/NCII/CSAM; no strike event into the repeat-infringer ledger
Side B — What works better
Here’s the build worth shipping — gates, records, and an export counsel can defend.
Intake that can survive a harbor motion (LE-15 theme)
Walk the path once, end to end.
- Designate and publish: Agent name, address, phone, email on a public
/dmca(or equivalent) matching the Office directory; calendar 3-year renewal; alert at T-90 days; treat new legal entities / brand URLs as designation events.
- Statutory form — element checklist on the page: Fields map 1:1 to the six § 512(c)(3)(A) elements; confirmation number on submit; clear banner that this path is copyright only, with links to intimate-image / other abuse intakes. Spell the checklist in the form (labels counsel owns):
- Physical or electronic signature of a person authorized to act for the owner
- Identification of the copyrighted work claimed infringed (or representative list if multiple)
- Identification of the material claimed infringing and information reasonably sufficient to locate it (URL / content_id — not “entire site”)
- Contact information reasonably sufficient to contact the complaining party (address, telephone, email)
- Statement of good-faith belief that use isn’t authorized by the owner, its agent, or the law
- Statement that the information is accurate, and under penalty of perjury, that the sender is authorized to act on behalf of the owner
- Physical or electronic signature of a person authorized to act for the owner
- Classify notices:
full/partial/deficient; substantially compliant → job; defective but with work/location/contact → cure prompt ((c)(3)(B) logic) — don’t sit on compliant notices because some other notices are abusive. Non-statutory extras may be optional; don’t make them a processing condition (CCBill anti-pattern).
- Expeditious removal: Disable identified URLs/content_ids; store
received_at,removed_at, operator; notify subscriber.
- Counternotice wait themes: Counternotice form with § 512(g)(3) elements. On valid counternotice: notify the original complainant; set
restore_not_before/restore_not_afteron a business-day calendar (not less than 10 nor more than 14 business days after the provider receives the counternotice, unless the complainant timely notifies that a suit seeking a court order has been filed). Block early restore; block late restore without a rule; suit notice cancels put-back.
- Strike feed / thresholds as policy-as-code: Each qualifying notice emits a repeat-infringer evaluation event for LE-16 — separate from NCII/TIDA strike classes. Encode strike thresholds, grace, and termination ladders as versioned policy (e.g. N qualifying strikes in window W → warn / restrict / terminate), with human review hooks counsel defines — not ARPU exceptions that silently skip the ladder. The full warn → restrict → terminate ladder, exportable strike ledger, and no-silent-VIP gates are worked in Chapter 18 (LE-16).
- Export ledger: Notices, counternotices, actions, agent designation proof, content hashes for disabled objects — multi-year retention (counsel; often ≥ 3–7 years); WORM preferred. Operational fingerprint / perceptual-hash matching (LE-35 / Chapter 19) may assist discovery of copies but does not replace this statutory notice path or mint strikes unless counsel’s LE-16 rule says so.
Adult UGC follows the same process (Motherless themes — adult ≠ inherently infringing). Marketplace: disable SKU media and notify the seller. Hosted generative outputs still take DMCA notices.
Compliance checklist (green flags)
- Directory parity test passes (scraped public contacts == stored registration)
- Form captures all six elements; confirmation ID issued
- Substantially compliant notice → hard disable + timestamps + subscriber email
- Counternotice window enforced 10–14 business days
- Suit notice suppresses restore
- Agent expiry alert live
- Separate menus/schemas for copyright vs intimate-image vs CSAM
- Strike events append to the LE-16 ledger
- Counsel can export a full notice/action pack without Slack archaeology
Template: Lawyer / Engineer card
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
| Lawyer | Engineer |
|---|---|
| Is our designated agent live on-site and in the Office directory, unexpired? | Do we store office_confirmation_id, expires_at, and alert at T-90? |
| Does the form capture substantially all § 512(c)(3)(A) elements? | Does intake validate required fields and store raw payload + received_at? |
| On a compliant notice, can we prove expeditious disable of identified material? | Hard disable URLs/content_ids with removed_at — not soft-hide? |
| Do we notify the subscriber and honor the § 512(g) restore window? | Are restore_not_before / restore_not_after server-enforced? |
| Is repeat-infringer policy informed and implemented — not just ToS poetry? | Does each notice emit a strike evaluation event into LE-16? |
| Are copyright, TIDA, and CSAM intakes legally distinct? | Distinct schemas, queues, and public menus? |
Interface / code / data — one-page checklists
Run these as acceptance seeds — not as informal hunches. If you can’t export the Data row, you didn’t finish.
Interface (must-show): Public agent block matching the directory; six-element notice form with the statutory checklist labeled on-page; separate counternotice form; confirmation number; copyright-only banner with links to other intakes; ops ticket view (compliance class, 10–14 business-day restore window, strike count vs policy threshold).
Interface (must-not): Unmonitored mailbox as the only path; non-statutory extras as a processing condition; early-restore bypass; one “report IP” blob mixing copyright with intimate imagery.
Code: Validate all six § 512(c)(3)(A) fields; store raw payload; removal jobs for substantially compliant notices; hard disable; subscriber notice; business-day put-back calendar (10–14); block out-of-window restore; cancel on suit notice; strike events into versioned LE-16 threshold policy; agent-expiry alert; reject non-specific “entire site” locations.
Data: dmca_agents; dmca_notices (elements, compliance_class, actions, removed_at); dmca_counternotices (restore window, suit_notice_at); dmca_subscriber_notices; LE-16 strike events. Prefer WORM. Retention: multi-year harbor proof per counsel.
Try this on your product tomorrow
Screenshots and exports beat opinions.
- Public copyright page contacts == Copyright Office directory?
- Designation
expires_atwith real T-90 alert?
- Notice missing perjury attestation →
deficient+ cure path (not effective knowledge)?
- Compliant notice → export
received_at,removed_at, subscriber notice, disabled content_ids.
- Counternotice: restore on day 3 blocked; day 11 business allowed unless suit notice.
- Ticket not in the intimate-image queue; strike event fired for LE-16.
If step 1 or 4 fails, you have a footer email — not a § 512 program.
Where this goes next
Keep the loop moving — Law → Interface → Code → Data → Counsel sign-off.
Section 230 design line — own speech vs third-party, required fields, ads, ranking (LE-58 / Chapter 9B). Repeat-infringer ladder (LE-16 / Chapter 18) — versioned thresholds, warn/restrict/terminate, audited exceptions, exportable ledger.
Parallel intakes: TAKE IT DOWN (LE-11), state NCII (LE-12 / Chapter 20), CSAM/NCMEC (LE-13). Fingerprinting (LE-35 / Chapter 19) assists ops with hash match → action evidence and URL kill switches but doesn’t replace statutory notice.
ToS can inform users (LE-01 themes) — implementation still has to be real.
This chapter is for education and discussion. It is not legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
Chapter 9B — Worked Example: Section 230 & Product Design
Pattern family: Section 230 design line — classify own speech vs third-party content; inventory features that create/develop information; ad creative review; ranking explainability (LE-58). Sits with the UGC / platform cluster after DMCA notice intake (LE-15; Chapter 9) and beside FOSTA logging (LE-13), influencer/company promo (LE-52; Chapter 17), and T&S moderation (LE-36; Chapter 29).
Legal anchors (themes): 47 U.S.C. § 230(c)(1) (no treatment as publisher/speaker of information provided by another information content provider); § 230(f)(2)–(3) (interactive computer service; information content provider — including one who creates or develops information in whole or in part); § 230(c)(2) Good Samaritan themes (separate path); § 230(e) exceptions (federal criminal; IP; specified privacy; FOSTA trafficking carve-outs). Orientation: Zeran themes (publisher liability for third-party posts); Fair Housing Council v. Roommates.com, 521 F.3d 1157 (9th Cir. 2008) (en banc) (material contribution — required questions, supplied choices, discriminatory matching); Lemmon v. Snap, Inc., 995 F.3d 1085, 1089–95 (9th Cir. 2021) (product-design duty satisfiable without altering user content); Doe v. Grindr, 128 F.4th 1148 (9th Cir. 2025) themes (design label ≠ escape when the claim necessarily implicates publishing third-party content); HomeAway-family transaction themes (regulate the booking, not only the listing); algorithmic-recommendation split (Gonzalez — Supreme Court declined to decide; Anderson (3d Cir.) treats some recommendations as platform expression — Verify current status).
As of September 2026: Re-check § 230(e) carve-outs, your circuit’s recommendation cases, and counsel’s duty-by-claim map before anyone ships a slide that says “we’re a platform, we’re immune.”
Why this memo exists
Section 230 is not a vibe. The design line is where 230 ends and your editorial or product choices begin.
Product design draws the line. Document what you organize vs create; don’t freestyle under a CID.
The story in one glance
Picture a complaint about a user’s post.
It also names the company’s own ad that promoted the post. It names the ranking feature that boosted it. It names a required profile field every user must answer from choices the company wrote. It names the booking fee the company charged. Product’s first instinct is a single sentence: Section 230 covers all of it.
That sentence is incomplete.
§ 230 protects a service from being treated as the publisher or speaker of information provided by someone else. It says nothing automatic about the advertisement the company wrote, the transaction it processed, the field it required, or — on some courts’ reading — the recommendation objectives it designed. The line isn’t straight. The design facts that move a service across it are identifiable — and they belong in Interface, Code, and Data before the complaint arrives.
This chapter walks that line the way a mentor walks a release board: classify the claim, inventory what the company created or developed, review company ads as company speech, log ranking objectives, and never train the team that you’re “always immune.”
Teaching reconstructions only. Not screenshots of any party’s live product and not exhibits.
Walk the complained-of feature. Ask: are you moderating third-party speech — or shaping a product contribution that looks like your own?
Plain English — what § 230(c)(1) is asking
Three questions, in order:
- Are we a provider or user of an interactive computer service? (Usually yes for a UGC host.)
- Does the claim treat us as the publisher or speaker of the challenged information?
- Was that information provided by another information content provider — or did we create or develop it, in whole or in part?
If the company wrote the copy, required the answer, supplied the unlawful choices, or built matching on those answers, you may be an information content provider as to that information. If the duty is “design a safer Speed Filter–style feature” and could be met without touching a user’s post, Lemmon themes say (c)(1) may not be the shield product hoped for. If the duty still requires policing what users say to each other, Grindr themes say calling it “design” doesn’t finish the analysis.
Field rule — put this on the release checklist: Identify the duty asserted first. Then ask who supplied the information that duty would police. Don’t start from “platform = immune.”
Remember: a Law Engineer is a licensed attorney with software and product expertise. Engineers build the inventories and gates under that counsel’s oversight.
What the law is asking the product to do (themes)
Orient to seven design pressures. Counsel owns the final map for your facts and circuit.
- Classify the claim — ICD first. Publisher liability for third-party info? Company content? Company conduct / product design? Transaction? § 230(e) exception (IP, FOSTA, criminal, privacy)? Mixed?
- Material contribution (Roommates themes). Required fields, supplied answer choices, and matching/search built on them can be the company’s development of the information. An open free-text comments box is a different animal than a mandatory enum.
- No proxies. Removing the visible question while keeping its inferred equivalent in the matching model leaves the contribution in place.
- Own product design (Lemmon themes). Ask whether the asserted duty could be satisfied by changing the feature (rewards, defaults, incentives) without screening or removing user content. Feature risk review is real work — not a Terms paragraph.
- Design-framed claims that still police content (Grindr themes). The label on the ticket doesn’t control. Read the duty.
- Transactions as transactions (HomeAway-family themes). Decline the booking or hold the fee under a transaction rule; don’t pretend content removal is the same gate.
- Recommendations — circuit caution. Document objectives; keep explainability logs; design as if a stricter “platform expression” reading might apply where circuits split. Verify before you brief “algorithms are always protected.”
Exceptions aren’t footnotes. Copyright → Chapter 9 / LE-15. Trafficking-shaped claims → LE-13. Company or influencer promo speech → Chapter 17 / LE-52. AI assistant output isn’t obviously “provided by another” — treat promises and generated replies as company-speech risk until counsel says otherwise (Chapter 6).
Review this with counsel and eng on the same call. If Side A matches production, you’re still in the memo-to-coders handoff.
Side A — What loses (“platform = immune”)
What goes wrong: Every demand letter gets the same macro. Growth ships an ad that restates a user’s sketchy listing as the company’s endorsement.
Signup requires drop-downs on protected characteristics and feeds them into search. Ranking boosts “engagement” with no written objective and no export.
Marketplace ops “comply” with a booking rule by deleting the listing thread instead of declining the transaction. After a redesign, nobody can produce the old required-field spec — only today’s cleaned screenshots.
Training slides say “Section 230 means we’re immune.”
Why (c)(1) themes care: The statute is about whose information and what duty. Company ads are company speech.
Required enums plus matching can be material contribution (Roommates). A design duty aimed at the company’s own incentive may sit outside (c)(1) (Lemmon).
A design-shaped complaint that still demands content policing may stay inside (c)(1) (Grindr) — but you only know that if you classified. FOSTA and IP are different doors.
A slogan doesn’t walk through the right one.
Lawyer lens — what I’d ask on the call: You need a duty-by-claim memo and a feature inventory, not a vibe. Losing immunity isn’t losing the case — and winning immunity on the user-post claim doesn’t erase the false-ad claim about your own banner.
Engineer lens: If required fields and matching criteria aren’t versioned, discovery will reconstruct them from memory and Slack. If ads live in the same table as user posts with no creative_review_status, someone will brief them as UGC. If recommendation events have no objective_version, “we just showed what users liked” is a story without a ledger.
Any hit means you don’t ship yet.
Non-compliance checklist (red flags)
- Stock “we’re a platform / always immune” replies with no claim class
- Company ads, badges, or safety claims shipped without creative review
- Mandatory enums / supplied choices feeding matching without inventory + counsel sign-off
- Proxy signals for a criterion removed from the UI but left in the model
- Ranking / matching with no versioned objectives or explainability export
- Transaction problems “fixed” only by deleting speech
- FOSTA or DMCA facts answered with a pure (c)(1) macro
- No historical feature archive — only current production UI
- AI chatbot output assumed to be third-party content for immunity planning
Side B — What works better (classify → inventory → gate)
What works better: Counsel publishes a claim-class taxonomy. Legal intake can’t send a 230-shaped response until someone picks a class.
Product maintains a feature & field inventory: required fields, supplied answers, matching criteria, ranking objectives — each versioned, high-risk rows signed before enable.
Company creatives sit on a register with review status. Recommendation configs refuse production without an objective_version and leave exportable explainability hooks.
Transaction declines fire a transaction_gate event; content removal is a separate decision. FOSTA and DMCA keep their own doors (Chapters 5 / 9 / 20 adjacency; LE-13 / LE-15).
Staff training says: 230 is powerful and bounded — never “always.”
Fixed user story: Demand arrives → claim classified → if third-party publish theory, (c)(1) analysis proceeds with moderation logs → if company ad, pull creative register → if required-field theory, pull inventory version that shipped → if transaction, pull gate events → if FOSTA/IP, open those recipes — not the 230 macro.
Compliance checklist (green flags)
- Duty-by-claim /
claim_classrequired before stock 230 language
- Feature & field inventory live; counsel sign-off on high-risk required fields / matching
- No proxy matching on retired criteria (tested)
- Company-content register + creative review gate
- Ranking
objective_version+ explainability export
- Transaction gates ≠ content-removal gates
- Separate FOSTA / DMCA / intimate-image paths
- Feature version archive exportable
- Training materials forbid “always immune”
Roommates, Lemmon, Grindr — three lessons for the same stack
Walk these carefully so nobody ships the wrong slogan.
Roommates (en banc) themes: Who wrote the question? Which answers were mandatory? Which field changed matching? The required questions, supplied choices, and discriminatory search lost (c)(1) protection as material contribution; the additional open comments field was treated differently. Law Engineering translation: inventory the triad — field ↔︎ answers ↔︎ matching — and ban silent proxies.
Lemmon themes: Parents alleged a Speed Filter–style reward design encouraged dangerous driving. The Ninth Circuit asked whether the asserted duty concerned Snap’s own product design and could be met without altering user content. Immunity dismissal was reversed on that path; merits were not decided. Translation: run feature risk reviews on incentives and defaults; changing the reward isn’t the same job as moderating snaps.
Grindr themes: Design-framed theories that still require the platform to police third-party content can remain (c)(1)-barred. Translation: read the duty. Don’t assume every “product defect” label escapes 230 — and don’t assume every “design” label stays inside it.
Immunity ≠ merits. A later merits holding that a statute doesn’t reach the conduct is a different chapter. Don’t collapse “we might not have (c)(1)” into “we already lost.”
Interface / code / data — one-page checklists
Run these as acceptance seeds — not as informal hunches. If you can’t export the Data row, you didn’t finish.
Interface (must-show): Optional free-text where contribution risk is high; required fields limited to lawful needs; company ads/badges routed through review UX; ranking objectives documented for counsel (and user-facing where required); legal portals that separate copyright / intimate imagery / trafficking / general abuse; transaction decline copy that speaks to the booking rule.
Interface (must-not): “Always immune / platform = 230” marketing; mandatory unlawful enums; proxy criteria hidden in matching; company endorsements dressed up as neutral UGC; one blob “report” queue for every legal theory.
Code: claim_class gate on legal macros; feature_field_inventory + counsel sign-off for required-field/matching changes; creative_review_status before company publish; ranking objective_version required to enable; transaction flags separate from takedown flags; feature version archive; AI output default classification per counsel (not auto-third-party).
Data: claim_classifications; inventory versions (fields / answers / matching); company_content_register; ranking_objectives + recommendation_events (explainability); transaction_gate_events; feature_version_archive; moderation leave-up/remove logs (LE-36 / LE-13 reuse).
Lost vs fixed (scene card)
| Lost | Fixed | |
|---|---|---|
| Opening move | “We’re a platform — 230” | Classify the duty / claim class first |
| User post | Same macro as everything else | (c)(1) analysis + moderation evidence |
| Company ad | Treated as UGC | Creative review + company-content register |
| Required field | Mandatory enum → matching, no inventory | Inventory + sign-off; no proxies |
| Ranking | Black-box boost | Versioned objectives + explainability logs |
| Transaction | Delete the listing and call it 230 | Transaction gate event; content separate |
| FOSTA / IP | Still the 230 macro | LE-13 / LE-15 doors |
| Proof | Today’s cleaned UI | Historical feature archive |
Template: Lawyer / Engineer card
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
| Lawyer | Engineer |
|---|---|
| What duty does this claim assert — publish third-party info, our speech, our design, our transaction, or an (e) exception? | Is claim_class set before any 230 response template sends? |
| Did we create or develop the information (required field, choices, matching)? | Can we export the inventory version that shipped? |
| Could we satisfy a design duty without altering user content (Lemmon)? | Is there a feature risk record for the incentive/default? |
| Is “design” just a label on a content-policing claim (Grindr)? | Does the ticket still require screening user messages/listings? |
| Are our ads / badges / safety claims company speech? | Does publish refuse without creative_review_status=approved? |
| Recommendations — which circuit reading are we designing to? | Do recommendation_events carry objective_version + model/rule version? |
| Is this FOSTA or IP in disguise? | Separate schemas/queues — not one trust blob? |
Try this on your product tomorrow
Screenshots and exports beat opinions.
- Pull the last five legal demands. Classify each: third-party publish / company content / design / transaction / (e) exception / mixed. If everything was “230,” you have a training problem.
- List every required signup or listing field that feeds search or matching. For one field, write the supplied answers and the matching use. Counsel risk?
- Attempt to publish a company banner with review status
draft. Does the API refuse?
- Export one day of recommendation events. Do you see objective and model/rule versions?
- Decline a test booking under a transaction rule. Does the log show
transaction_gatewithout forcing a content takedown?
- Ask for the feature spec from two versions ago. If the answer is “we only have current Figma,” start the archive.
- Search internal macros for “always immune” and delete them.
ToS “§ 230” assertions & commissioned speech (Ed 1.20)
Two field failures show up whenever custom deals and company voice enter the stack.
1. ToS § 230 assertion ≠ immunity
A Terms paragraph that says “we have Section 230 immunity” or “you agree we aren’t publishers” is not a holding. Claim-class analysis (Roommates / Lemmon / Grindr themes above) still runs. Encode staff training and intake macros: never close a ticket with “ToS § 230” alone. Require claim_class first.
2. Commissioned / own-speech vs UGC claim-class
When the company commissions a post under a creator deal (LE-71), or rewrites/endorses it as company speech, inventory it on the company-content / commissioned side of the design line — not as pure third-party UGC. content_class=commissioned (and creative_review_status) should feed the same feature inventory used for ads and badges. Winning (c)(1) on a pure user post doesn’t erase the commissioned or company-endorsed theory.
Field rule — put this on the release checklist: If deal_id or company creative touched the object, don’t brief it as “just UGC for 230.”
Where this goes next
Keep the loop moving — Law → Interface → Code → Data → Counsel sign-off.
Custom creator Deal OS / commissioned claim-class — Chapter 13B (LE-71).
DMCA notice / counter-notice — Chapter 9 (LE-15) — IP exception, not a 230 substitute.
FOSTA / trafficking UX & logging — LE-13 (Pattern Map; adjacent Chapters 5 / 29).
Influencer / company-directed promo — Chapter 17 (LE-52); endorsement disclosures Chapter 8 (LE-18).
T&S moderation stack — Chapter 29 (LE-36).
Chatbot / AI output as company-speech risk — Chapter 6 (LE-38 / LE-30).
Repeat infringer ladder — Chapter 18 (LE-16).
Operating model / release gates — Chapter 31. Pattern Map LE-58 — Chapter 32.
Field rule — put this on the release checklist: “We’re a platform” is a product description — not a claim classification.
This chapter is for education and discussion. It isn’t legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
This chapter is for education and discussion. It is not legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
Chapter 10 — Worked Example: Checkout Evidence, High-Risk MCC & Chargeback Defense
Pattern family: Checkout disclosures & chargeback evidence (LE-26) + high-risk MCC / billing compliance flags (LE-27) + payment fraud prevention (LE-39)
Legal anchors: ROSCA, 15 U.S.C. § 8403 (disclosure, consent, simple cancel for negative options); FTC Act § 5 / UDAP and FTC v. Match Group themes (negative-option friction; no dispute retaliation); Visa Merchant Data Standards themes—MCC 5967 (adult), 7273 (dating), 5968 (continuity / negative-option card-absent scrutiny); VIRP category approvals. Network rules are contractual—confirm current manuals with the acquirer.
As of September 2026: Re-verify Visa/Mastercard public merchant-standards editions and your acquirer’s VIRP / monitoring thresholds before quoting numeric chargeback SLOs. This chapter is high-level Law Engineering—not a guide to soft-MCC coding, descriptor spoofing, or processor-secret evasion.
Why this memo exists
MCC coding, statement descriptors, and chargeback evidence packs are how card-network fights are won or lost.
Card networks and chargebacks don’t care about your Terms poetry. They care about descriptors, evidence, and codes that match the business.
The story in one glance
Illustrative teaching figure. Not official screenshots of any party’s product.
Sit with a chargeback that arrived this morning. Can you export — in one click — the disclosure the cardholder saw, the descriptor preview that matched the statement, the cancel timestamp if any, and the risk score from auth?
On the lost side, checkout screamed “$0 today,” adult inventory rode a soft MID, and ops answers with laptop screenshots. On the fixed side, itemized disclosure and descriptor preview, immutable quote/charge reconcile, MCC/content-class routing, 3DS/velocity controls, and a one-click evidence pack for representment — without punishing users for filing disputes.
Card acceptance dies from consumer-protection failures and network-integrity failures. Winning a representment fight is useless if checkout lied.
Three patterns, one acceptance story
Winning a chargeback fight is useless if the merchant category code (MCC) was miscoded or fraud was invited upstream.
Remember: a Law Engineer is a licensed attorney with software and product expertise. Engineers build these gates under that counsel’s oversight.
| Pattern | What it asks | Typical miss |
|---|---|---|
| LE-26 Evidence | Recognizable descriptor + clear trial/recurring terms at auth; exportable bundle per charge_id |
Vague “WEB SERVICE”; no disclosure version; cancel logs missing |
| LE-27 MCC flags | Every SKU has a content/risk class; charge only on MIDs approved for that class | Hybrid dating + explicit on one soft MID; unboarded URLs |
| LE-39 Fraud gates | Step-up / decline bad auth; easy cancel to cut friendly fraud; feed LE-26 on disputes | Velocity ignored; cancel hidden to “win” metrics |
Field rule — put this on the release checklist: Disclose → route to the right MCC → score the auth → keep an immutable bundle. Skip any step and representment is incomplete.
Review this with counsel and eng on the same call. If Side A matches production, you’re still in the memo-to-coders handoff.
Side A — What loses
Don’t ship this. If your current build matches Side A, stop the release train and fix it with counsel.
$0 trial display and no order snapshot (LE-26 failure)
What goes wrong: Checkout screams “$0 due today.” Post-trial price, frequency, and cancel path are below the fold or only in linked terms. Statement descriptor is a random string. When a chargeback arrives, ops scramble for AVS/CVV results, the disclosure the user saw, and whether cancel preceded renewal. Someone threatens to lock the account because the user “went to the bank.”
Why this matters in court / before a regulator: ROSCA § 8403 and state ARLs demand clear disclosure and consent before charging; easy cancel cuts “I didn’t want this” disputes. Match-family themes: negative-option friction and punishing disputers are unfairness risk — win with evidence, not retaliation. Unrecognizable descriptors drive friendly fraud even when the charge was “correct.”
Lawyer lens — what I’d ask on the call: Representment is only as honest as disclosure_version + hash at auth. Retroactive screenshots are fan fiction.
Engineer lens: If authorize doesn’t write evidence_bundle_id, you lose the clock when the acquirer asks.
Adult MCC surprises (LE-27 failure)
What goes wrong: Catalog ships explicit PPV, dating subscriptions, and negative-option continuity on whichever MID converted best last quarter. Soft MCC coding “for approval rates.” New storefront URL goes live without updating the acquirer board pack. Affiliates land offers that bypass content-class gates.
Why this matters in court / before a regulator: Visa materials treat adult (5967), dating (7273), and certain card-absent negative-option activity (5968) as high-integrity-risk. Multiple lines may need multiple MCCs; soft-MCC coding of high-risk volume is a classic integrity-violation pathway. VIRP-style programs expect category-specific approvals — confirm regionally.
Lawyer lens — what I’d ask on the call: MCC is an acquirer/member matter. Blog grids are secondary; the board packet is primary.
Engineer lens: If SKU.active skips mcc_policy.approved=true, every sprint can invent an integrity problem.
No fraud gates (LE-39 failure)
What goes wrong: Stolen-card velocity sails through. No 3DS step-up. Blocklists stale. Fraud team disables cancel to protect ratios. Disputes never enrich the evidence bundle with risk scores or 3DS results.
Why this matters in court / before a regulator: Elevated ratios threaten MID viability. Easy cancel reduces friendly fraud; fraud controls must not trap consumers. Upstream prevention feeds representment — they aren’t substitutes.
Any hit means you don’t ship yet.
Non-compliance checklist (red flags)
- “$0 due today” without conversion price, frequency, cancel path
- Descriptor preview ≠ configured soft descriptor; no UI archive / disclosure hash at auth
- Auto-suspend solely on dispute webhook
- Explicit inventory on soft MID; silent MCC changes; mixed classes on one unapproved MID
- Unboarded URLs / affiliate landers bypassing content_class
- No velocity/BIN/3DS path; cancel hidden to improve fraud KPIs
Side B — What works better
Here’s the build worth shipping — gates, records, and an export counsel can defend.
Checkout evidence that can win a representment (LE-26 theme)
- Itemized disclosure before Pay: Price, frequency, trial length, post-trial charge, cancel path adjacent to the CTA; statement descriptor preview matching acquirer config.
- Confirmation: Email/receipt with descriptor, amount, cancel instructions.
- Immutable bundle at auth: timestamp, amount, currency, descriptor, AVS/CVV/3DS results as available,
disclosure_version+ hash, terms acceptance id, privacy-minimized device signals,ui_archive_id, receipt id.
- Cancel linkage: Store cancel timestamps; compare to renewal charge time for “continued billing” rebuttals.
- One-click export keyed by
charge_idwithin ops SLA; hashes immutable after capture.
- No retaliation: Dispute webhook must not call “suspend for chargeback”; fraud tools may still score independently.
MCC routing that survives an integrity audit (LE-27 theme)
- SKU content_class + mcc_policy_id required before sellable.
- Router selects MID by class; mismatch → refuse (
MCC_ROUTE_UNAVAILABLE).
- Hybrids: Split tenders (e.g., dating 7273, explicit 5967) or block unsupported mixes.
- Continuity / negative-option → consider 5968 plus cancel/disclosure patterns.
- Launch gate: Unboarded URL fails go-live; MCC changes need
compliance_change_ticket_id.
- Daily reconcile volume vs declared MCC.
Fraud prevention that feeds evidence (LE-39 theme)
- Risk score at auth with
rule_ids; velocity/device/BIN → 3DS or decline.
- Blocklist fail-closed (TTL + appeal).
- Step-up UX states a security reason — not dark-pattern traps.
- Easy cancel; cancel timestamp stops retries.
- Auto-refund windows for clear fraud cases where policy allows.
- Dispute webhook enriches LE-26 with
fraud_case_id, 3DS, reason codes.
How stacks commonly encode MCC / representment
MCC / MID routing: Catalog SKUs carry a counsel-owned content_class (e.g. dating vs explicit adult vs general continuity). Each class maps to an mcc_policy row: declared MCC (themes: 7273 dating, 5967 adult, 5968 continuity / negative-option scrutiny), approved MID(s), boarded storefront URLs, and acquirer approval refs. The charge router selects MID by class; class/MID mismatch refuses authorize. Soft-coding high-risk volume onto a low-risk MCC is an integrity path — not a conversion tactic.
Board pack / URL gate: Acquirer underwriting expects the live URLs and category story that were boarded. New storefronts, deep-linked affiliate landers, and silent MCC changes need a compliance_change_ticket_id before go-live; daily volume-by-MCC reconcile catches drift.
Descriptor ↔︎ UI: Processor soft-descriptor config must match the descriptor preview shown at checkout. CI or config-as-code asserts equality; mismatch is a LE-26 evidence bug, not a copy polish item.
Evidence bundle → representment slots: At auth, write an immutable bundle. Ops export by charge_id maps those fields into the acquirer’s current compelling-evidence / representment template — field names differ by processor; don’t invent a fake universal “Visa form.” Re-tabletop when the processor updates the template.
Fraud rails that feed evidence: Velocity / device / BIN scoring → 3DS step-up or decline with rule_ids logged. Optional network alert / rapid-dispute programs sit beside representment — they don’t replace disclosure quality or the no-retaliation rule. Dispute webhooks enrich the bundle; they must not auto-suspend solely for filing.
Compliance checklist (green flags)
- Descriptor preview CI-asserted against config; bundle hashed at every auth
- Cancel-before-renewal visible in export; no auto-suspend-on-dispute path
- SKUs need approved MCC policy; router refuses class/MID mismatches
- Volume-by-MCC report ready; velocity → 3DS; blocklist → decline + log
- Risk + 3DS + disclosure in one exportable pack
Template: Lawyer / Engineer card
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
| Lawyer | Engineer |
|---|---|
| Can we prove what terms and descriptor the cardholder saw at auth? | Does authorize write evidence_bundle_id with disclosure hash + UI archive? |
| Are we retaliating against disputers — or defending with evidence? | Is suspend_for_chargeback absent from the dispute webhook path? |
| Does each billable SKU map to an approved MCC/MID for its content class? | Does SKU.active require mcc_policy.approved, and does the router refuse mismatches? |
| Are hybrid dating + explicit lines split correctly — not soft-coded? | Separate MIDs per class; feature flags cannot enable adult media on dating-only MID? |
| Do fraud controls reduce bad auth without trapping cancel? | Shared cancel ownership; velocity → 3DS before hard decline where policy allows? |
| Six weeks later, can finance export a complete representment pack? | One endpoint by charge_id: disclosure, auth results, cancel, fraud_case, hashes? |
Interface / code / data — one-page checklists
Run these as acceptance seeds — not as informal hunches. If you can’t export the Data row, you didn’t finish.
Interface (must-show): Descriptor preview; itemized price/frequency/trial/post-trial; cancel near CTA; confirmation with descriptor + cancel instructions; SKU admin (content_class, mcc, MID, approval_ref); checkout error if unapproved; plain-language 3DS/step-up; easy cancel.
Interface (must-not): Vague sole descriptors; “$0 due today” without conversion clarity; threaten account loss for bank disputes; explicit inventory on unapproved soft MID; hide cancel to game fraud KPIs; silent MCC changes without a compliance ticket.
Code: Authorize writes evidence bundle; export by charge_id; no suspend-for-dispute path; router by content_class; refuse unapproved mixes; MCC changes need compliance ticket id; velocity/BIN/blocklist + 3DS; auto-refund for eligible fraud; cancel stops retries; dispute webhook attaches fraud_case_id to LE-26.
Data: payment_evidence_bundles, subscription_cancel_events, mcc_policies, sku_content_classes, processor_approvals, mcc_volume_daily, auth_risk_events, fraud_cases, chargeback_links. Minimize device signals (DPIA). Retain approvals/bundles for acquirer windows counsel sets.
What this chapter is NOT
Not a guide to soft-MCC coding, descriptor spoofing, or processor-secret evasion. Escalate wallet/tips money-transmission, crypto on-ramps, and regional VIRP questions to payments counsel and the acquirer.
Try this on your product tomorrow
Screenshots and exports beat opinions.
- Descriptor preview == processor soft descriptor?
- After trial auth, export bundle: disclosure hash, UI archive, auth results?
- Cancel before renew; test “continued billing” dispute →
cancel_at < charge_at?
- Dispute webhook alone must not change account status.
- Explicit SKU on dating-only MID → refused.
- High velocity → 3DS/decline with
rule_ids; volume-by-MCC report exists.
If step 2 or 5 fails, you have a payment form — not a high-risk acceptance program.
Where this goes next
Keep the loop moving — Law → Interface → Code → Data → Counsel sign-off.
Adult UGC × card-network participant controls — Chapter 10B (LE-60) — Program checklist ≠ § 2257 ≠ visitor AV. Cancel / ARL UX (LE-03, LE-04). Assent ids in the evidence pack (LE-01). Adult AV gates (LE-10). Affiliate traffic quality (LE-19). Deeper KYC/AML when rails demand it (LE-33, LE-34). Operating model: who signs MCC maps, owns no-retaliation, and tabletops representment against the processor’s current template.
This chapter is for education and discussion. It is not legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
Chapter 10B — Worked Example: Adult UGC & Card-Network Participant Controls
Pattern family: Adult UGC × card-network / Acquirer Program participant controls (LE-60). Sits after checkout evidence, high-risk MCC & chargebacks (LE-26 / LE-27 / LE-39; Chapter 10) and beside visitor age gates (LE-10; Chapters 5 / 11), TAKE IT DOWN Act (LE-11; Chapter 5), NCII (LE-12; Chapter 20), § 2257 producer recordkeeping (LE-14; Chapter 21), creator KYC (LE-28; Chapter 13), and T&S moderation (LE-36; Chapter 29).
Legal / program anchors (themes): Card-network and Brand / Acquirer Program rules are primarily contractual participant obligations — uploader identity/age verification before publish, depicted-person consent / verification themes for adult UGC, pre-publication review, alignment with Brand prohibited / restricted content lists, ongoing monitoring / remonitoring / appeals, and honest merchant / MCC / high-risk registration (LE-27). These controls are distinct from 18 U.S.C. § 2257 / 2257A producer recordkeeping (LE-14) and from visitor age gates (LE-10). TAKE IT DOWN Act (LE-11) is a risk multiplier for nonconsensual intimate-image velocity — card programs and TIDA both care about NCII clocks. Chargeback / RDR / TC40 evidence themes sit adjacent to LE-26 / LE-39.
As of September 2026: Verify current Brand / Acquirer Program manuals with counsel before encoding thresholds. Teaching reconstructions only — no client names, no merchant IDs, no BIN tables, no confidential memo quotes.
Why this memo exists
Participant controls, verification, and monitoring aren’t optional decorations when card programs are on the line.
The story in one glance
Picture an adult UGC platform that already “does age.”
Uploaders check I’m 18+. A § 2257 page lists a custodian. Visitor AV runs at the door (LE-10). Finance boarded a high-risk MCC (LE-27). Product declares card-network adult rules “covered.”
Then the Acquirer Program questionnaire asks for uploader identity verification before publish, depicted-person consent evidence, pre-publication review, remonitoring, and appeal paths — and a sample of live URLs against Brand prohibited / restricted lists.
Those aren’t the same machine as § 2257. They aren’t the same machine as visitor AV. Treating any one as a substitute for the others is how merchant ID (MID) integrity reviews and Brand remedial programs start.
Walk one live upload path with the Acquirer questionnaire beside you. Ask: which gate proved the uploader? Which gate proved the depicted person? Which gate proved the visitor? If your answer is one checkbox, keep reading.
This chapter separates the engines, then wires Interface / Code / Data so participant controls, producer records, and age gates stay sibling — not collapsed checkboxes. Teaching themes only; counsel verifies live Brand rules.
Plain English — three engines, not one “adult compliance” blob
| Engine | What it is (themes) | Typical miss |
|---|---|---|
| Visitor AV (LE-10) | Majority-age gate for viewers / access | Treated as proof uploaders and depicted persons were verified |
| § 2257 / 2257A (LE-14) | Producer recordkeeping when in scope — examination, package, custodian, labels | Checkbox “I am 18+” or card-program KYC treated as Part 75 records |
| Card-network / Acquirer Program adult UGC controls (LE-60) | Contractual participant duties: uploader ID/age, depicted-person consent themes, pre-pub review, Brand list alignment, monitoring, MCC honesty | “We have 2257” or “we age-gate visitors” offered as the whole answer |
Field rule — put this on the release checklist: § 2257 ≠ card-network participant checklist. Different legal engines; both may apply; neither substitutes for the other. Visitor AV is a third sibling.
Remember: a Law Engineer is a licensed attorney with software and product expertise. Engineers build gates under that counsel’s oversight.
What Brand / Acquirer Program themes typically pressure (verify current rules)
Orient to seven pressures. Exact thresholds and document lists are counsel + current manual — don’t hardcode folklore from an old PDF.
- Uploader identity / age verification before publish — not only a ToS checkbox.
- Depicted-person consent / verification themes for adult UGC — especially when uploader ≠ sole depicted person.
- Pre-publication review / moderation gates — sample or risk-based review before go-live where rules require.
- Content policy ↔︎ Brand prohibited / restricted lists — encode classes; refuse or queue matching categories.
- Ongoing monitoring, remonitoring, appeal paths — not one-time onboard theater.
- Merchant / MCC / high-risk registration honesty (LE-27) — URL inventory, content class, no soft-MID surprises.
- NCII / nonconsensual intimate velocity — TIDA (LE-11) clocks as risk multiplier; card programs care when NCII handling is slow or chaotic (LE-12 adjacency).
Payments adjacency: Chargeback representment, RDR, and TC40-style fraud reporting still need LE-26 evidence packs and LE-39 fraud gates — adult UGC controls don’t replace checkout evidence.
Review this with counsel and eng on the same call. If Side A matches production, you’re still in the memo-to-coders handoff.
Side A — What loses (“2257 covers card rules”)
What goes wrong: Onboarding deck maps every Acquirer question to “see our § 2257 program” or “see visitor AV.” Upload publish unlocks on self-attest age.
Depicted-person consent is a free-text box nobody stores. Pre-pub review is “we’ll hire mods after Series B.” Brand prohibited categories exist in a wiki, not in the classifier.
Remonitoring is an annual spreadsheet. Appeals go to a shared inbox with no SLA.
NCII reports sit in the same bucket as spam. When a chargeback wave hits, LE-26 bundles lack uploader verification timestamps the program asked for months ago.
Why this matters in court / before a regulator: Participant rules are contractual conditions of taking cards. Producer statutes ask different questions. Visitor AV asks different questions still. Collapsing them fails all three narratives in an audit: the examiner hears the wrong statute, the Brand reviewer hears the wrong control, and the cardholder dispute still lacks checkout evidence.
Lawyer lens — what I’d ask on the call: Maintain a control crosswalk: Program requirement → LE-60 control → evidence object — with explicit “not satisfied by LE-14 / LE-10” rows.
Engineer lens: If publish ignores uploader_kyc_status, depicted_consent_status, and prepub_review_status, you shipped adult UGC with a payments story attached — not a participant-controls program.
Any hit means you don’t ship yet.
Non-compliance checklist (red flags)
- “We do 2257” offered as the Acquirer Program answer
- Visitor AV treated as uploader or depicted-person verification
- Publish without uploader ID/age verification where rules require it
- No depicted-person consent evidence object for multi-party adult UGC
- Brand prohibited list only in a PDF — not in moderation / classifier config
- No remonitoring cadence; no appeal path with timestamps
- Soft MCC / undeclared adult URLs (LE-27 failure)
- TIDA/NCII notices without clock / escalation (LE-11 / LE-12)
- Chargeback packs with no link to verification / review events (LE-26)
Side B — What works better (crosswalk → gate → monitor → evidence)
What works better: Counsel owns a Program ↔︎ product crosswalk versioned next to the MCC map (LE-27). Upload state machine: draft → uploader_verified → depicted_consent_complete → prepub_clear → publishable.
Brand list versions pin into the moderator / ML ruleset. Remonitoring jobs re-score risk classes; appeals write appeal_events.
NCII / TIDA paths stay first-class (LE-11 / LE-12). § 2257 package completeness (LE-14) is a parallel gate when in scope — same release train, separate predicate.
Dispute webhooks enrich LE-26 with verification and review ids.
Fixed user story: Uploader submits adult UGC → identity/age verified → depicted-person consent package complete → pre-pub review (human or counsel-approved automated tier) → Brand-list check → publish. Later: remonitor hit → queue / restrict → appeal → decision logged. Card dispute → export LE-26 bundle plus LE-60 verification/review timestamps.
Compliance checklist (green flags)
- Crosswalk doc: Program theme → control → evidence; explicit non-substitution rows for § 2257 / visitor AV
- Publish API hard-fails without required LE-60 predicates
- Brand prohibited / restricted list
list_versionin config + review UI
- Remonitoring + appeals exportable
- MCC / URL inventory honest (LE-27)
- TIDA/NCII clocks separate and measured (LE-11 / LE-12)
- § 2257
records_package_statusseparately queryable (LE-14)
- Chargeback export joins LE-26 + LE-60 event ids
Template: Lawyer / Engineer card
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
| Lawyer | Engineer |
|---|---|
| Which current Brand / Acquirer Program adult-UGC requirements apply to this MID / URL set? | Is program_crosswalk_version pinned in config and reviewed on manual updates? |
| Are uploader ID/age verification and visitor AV legally distinct? | Separate state machines — visitor pass does not flip uploader_kyc_status? |
| When is depicted-person consent evidence required? | Is depicted_consent_status enforced before publish for covered classes? |
| Does § 2257 apply — and does anyone treat it as the card checklist? | Parallel records_package_status gate; training forbids substitution macros? |
| How do Brand prohibited categories map to our taxonomy? | Classifier / mod tools load brand_list_version; CI asserts coverage for high-risk classes? |
| What is the remonitoring + appeal story? | Jobs + appeal_events with SLA timestamps? |
| If TIDA/NCII notice hits, do card-risk owners see velocity? | Shared dashboards without merging schemas into one “adult blob”? |
| Can we defend chargebacks with verification/review evidence? | LE-26 export includes LE-60 event ids? |
Interface / code / data — one-page checklists
Run these as acceptance seeds — not as informal hunches. If you can’t export the Data row, you didn’t finish.
Interface (must-show): Uploader verification status before publish; depicted-person consent checklist for covered uploads; pre-pub queue with reason codes; moderator view of Brand list version; appeal UX with status; ops dashboards separating AV / 2257 / Program controls / NCII clocks.
Interface (must-not): Single “adult compliant” badge; publish anyway for top earners; Brand list as wiki-only; appeals that vanish into email; visitor AV reused as uploader KYC copy.
Code: program_crosswalk_version; uploader KYC gate; depicted consent predicate; prepub review gate; Brand list version on score/review; remonitor jobs; appeal state machine; refuse MCC/content_class mismatches (LE-27); TIDA/NCII routers (LE-11 / LE-12); parallel § 2257 gate (LE-14); dispute export joins (LE-26).
Data: uploader_verification_events; depicted_consent_packages; prepub_review_events (reviewer_or_model, list_version, decision); brand_list_versions; remonitor_events; appeal_events; program_crosswalk_versions; links to records_packages (LE-14) and charge_evidence_bundles (LE-26) without collapsing tables.
Lost vs fixed (scene card)
| Lost | Fixed | |
|---|---|---|
| Opening move | “We do 2257 / AV — card rules covered” | Crosswalk: Program ≠ 2257 ≠ visitor AV |
| Publish | Self-attest unlock | Uploader KYC + consent + pre-pub predicates |
| Brand lists | PDF on a shelf | Versioned list in mod / classifier config |
| After publish | Hope | Remonitor + appeal logs |
| NCII | Spam bucket | TIDA/NCII clocks (LE-11 / LE-12) |
| MCC | Soft MID surprise | Honest registration (LE-27) |
| Chargeback | Checkout screenshot only | LE-26 + LE-60 verification/review ids |
Try this on your product tomorrow
Screenshots and exports beat opinions.
- Open the latest Brand / Acquirer adult-UGC questionnaire (counsel copy). For each row, name the evidence object — or mark gap.
- Attempt publish with visitor AV pass but
uploader_kyc_status=none— hard fail?
- Attempt publish with uploader verified but depicted-consent missing on a multi-party adult class — hard fail?
- Confirm § 2257 incomplete package can’t be “waived” by a green Program badge (and the reverse).
- Diff your moderation taxonomy against current Brand prohibited / restricted themes — any silent holes?
- File a test appeal — timestamps and decision exportable?
- Export one chargeback pack — does it include verification/review event ids?
If step 2 or 4 fails, you have a slogan — not LE-60.
Where this goes next
Keep the loop moving — Law → Interface → Code → Data → Counsel sign-off.
- TIDA consent ledger & anti-weaponization — Chapter 5B (LE-61); base TIDA clocks — Chapter 5 (LE-11).
- Checkout evidence / MCC / fraud — Chapter 10 (LE-26 / LE-27 / LE-39).
- Visitor AV + TAKE IT DOWN — Chapter 5 (LE-10 / LE-11); under-18 gates Chapter 11.
- NCII reporting — Chapter 20 (LE-12).
- § 2257 producer recordkeeping — Chapter 21 (LE-14) — sibling, not substitute.
- Creator onboarding / KYC / NIL — Chapter 13 (LE-28 / LE-29).
- T&S moderation stack — Chapter 29 (LE-36).
- Pattern Map LE-60 — Chapter 32.
Field rule — put this on the release checklist: Card-program adult UGC controls are contracts with evidence objects — not a sticker you borrow from § 2257 or visitor AV.
This chapter is for education and discussion. It isn’t legal advice. Brand / Acquirer Program rules change — verify current manuals with counsel. No client names, merchant IDs, or confidential program correspondence appear in this teaching reconstruction.
This chapter is for education and discussion. It is not legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
Chapter 11 — Worked Example: Under-18 Age Verification Gates
Pattern family: Under-18 / majority-age access gates for adult or harmful-to-minors material (LE-10)
Legal anchors: State adult-content age-verification statutes (e.g., Tex. Civ. Prac. & Rem. Code ch. 129B / H.B. 1181; La. R.S. 9:2800.28; Fla. Stat. § 501.1737 and peers); Free Speech Coalition, Inc. v. Paxton, 606 U.S. ___ (June 27, 2025) (Texas AV upheld under intermediate scrutiny—does not auto-validate every sister statute or every vendor method).
As of September 2026: Keep a state matrix, substantial-portion methodology memo, and method allowlist current. Re-check injunctions and new enactments before enabling a geo. COPPA under-13 personal-information rules are a different pattern (LE-09)—deferred here; don’t collapse “kids privacy” with “majority-age gate.”
Why this memo exists
Try the flow on a small phone.
Fail closed. If the vendor or check fails, the high-risk path doesn’t open. Log the method and the result.
The story in one glance
Illustrative reconstructions for teaching. Not exhibits. Not official screenshots of any party’s product.
Picture a visitor in a covered state. They tap Enter. Thumbnails load. Signed media URLs work. The only “gate” was a checkbox that said “I’m 18.”
That’s incomplete. The statute asked the product to verify majority age before the material appeared — with a recognized method, not a hope.
This chapter is the engineering story of the gate in: geo → AV vendor → content unlock, with retention minimized and media unreachable without av_status=passed. For intimate-image notice-and-removal (TAKE IT DOWN), see Chapter 5 — don’t treat TIDA’s 48-hour clock as a substitute for majority-age verification.
Picture a covered-state visitor hitting adult inventory. Ask: does AV fail closed before content — or does a checkbox theater let them through?
What the law is asking the product to do
Here is the simple version. In covered states, if a substantial portion of your commercial site or app is sexual material harmful to minors, visitors generally must prove they are 18+ before they see that material. A checkbox that says “I’m 18” is usually not enough.
Remember: a Law Engineer is a licensed attorney with software and product expertise. Engineers build these gates under that counsel’s oversight.
Recurring Texas-style / LA / FL themes (confirm your matrix):
- Trigger. Often a substantial portion — commonly more than one-third — is material harmful to minors. Counsel owns the counting methodology and enable flag; adult / explicit UGC products are often in, mainstream dating often out.
- Method. Typical options: digitized / government ID, commercially reasonable transactional data, and (Florida) anonymous alongside standard. Face estimation is often unsettled — counsel-gated per state, not a default.
- Non-retention. Many statutes require no retention of identifying information after access — design tokens and purge jobs, not an ID vault.
- Self-attest insufficiency. Where statute demands a recognized method, “I’m 18+” alone isn’t the architecture.
COPPA note (explicit deferral): COPPA regulates collection of personal information from children under 13. Majority-age / adult AV is about who may enter covered sexual material. Different triggers, different evidence, different failure modes. Ship them as separate products of Law Engineering — not one “age” mega-toggle.
Field rule — put this on the release checklist: Geo resolution without a CDN/API hard gate is a banner. A pass token without purge discipline is a retention risk. Self-attest where the statute demands more is paper compliance.
Verification methods the stack actually implements
Statutes describe method buckets. Commercial age-assurance / IDV stacks implement flows (document capture, liveness, transactional lookups, wallet digital ID, estimation step-up). Map your product to a per-state method allowlist — not one United States boolean. Counsel owns the matrix; the notes below are orientation as of September 2026, not holdings.
Statutory buckets vs vendor implementations
| Regime theme (confirm matrix) | What the statute tends to name | What vendors often implement |
|---|---|---|
| Texas CPRC ch. 129B / H.B. 1181-style | Digital identification or commercial AV that uses government-issued identification or commercially reasonable transactional data | Gov-ID path is frequently delivered as document capture + anti-spoofing/liveness + face match to the portrait on the ID. The statute does not name “liveness”; liveness+match is how many commercial stacks operationalize the gov-ID option. |
| Florida §§ 501.1737 / 501.1738 themes | User choice of anonymous third-party AV and a standard commercially reasonable method | Anonymous path: US-organized independent third party; no retain / use / share of PII used to verify; reasonable security. Some foreign vendors route Florida anonymous through a US-path partner. Offer both paths where the matrix requires choice. |
| Many other states | “Reasonable commercial method” + enumerated ID and/or transactional options | Encode methods_allowed[] per state. Refuse disallowed methods server-side even if the vendor SDK would happily run them. |
Paxton (2025) upheld Texas AV under intermediate scrutiny. Soft read only: it does not auto-validate every sister statute or every vendor method (including estimation-only). Keep injunction watches and new enactments on the matrix.
Method classes (what they are / typical API shape)
Document + liveness + face match (
doc_liveness_match)
User captures a driver’s license, state ID, passport, or (where supported) mDL. Stack runs document authenticity checks, active or passive anti-spoofing/liveness on a selfie, and matches the selfie to the document portrait. Merchant typically receives a pass/fail or over-18 eligibility token — not a durable image vault on your side. Align product storage to that token.Transactional / commercial database (
transactional)
Signals drawn from mortgage, education, employment, credit-file-style, or issuer cross-check sources that can support majority age without uploading an ID image. Still third-party processing. Where statute requires non-retention, design purge / no durable PII on your DB the same way you would for ID scans.Digital ID / mDL (
mdl)
Wallet-based digital identification where the statute (or counsel matrix) defines digital ID as an accepted path. Treat presentation, selective disclosure, and token receipt as vendor-mediated; store opaque session/result identifiers, not raw credential payloads, unless counsel says otherwise.Facial age estimation (
estimation/estimation_stepup) — counsel-gated
Probabilistic over/under from a selfie, often paired with liveness.
Many US adult AV statutes are ID- and transactional-centric; estimation alone may be insufficient, or allowed only as a low-friction check that steps up to ID+liveness on borderline/fail.
Do not present estimation as universally compliant. Gate with estimation_allowed (and related flags) per state.
- Step-up waterfall
Low-friction check → escalate todoc_liveness_match(or transactional) on fail/borderline. How Veriff- / Persona- / Yoti-class stacks are commonly configured. Encode thresholds and allowed next methods as policy config, not growth A/B whims.
Vendor / API integration pattern (category examples, not endorsements)
Commercial stacks in this space include providers such as Yoti, Persona, Veriff, and similar age-assurance / IDV platforms (plus US-path partners some foreign vendors use for Florida anonymous requirements). Name them as examples of the category, not recommendations.
Typical contract shape:
- Hosted UI or mobile/web SDK → user completes a method from your allowlist
- Vendor posts a signed webhook (or signed redirect payload) with result
- You verify signatures; fail closed if the vendor is down in a covered geo (no checkbox fallback)
- Durable store: opaque
vendor_session_id/ eligibility token + method code + jurisdiction + timestamps + purge status
Privacy posture these vendors commonly advertise: return over/under (or pass/fail) results and minimize PII returned to the site. Align the product to token-only durable storage; don’t rebuild an ID image archive “for analytics.”
Operational nuances often missed
- Re-verification clocks / device binding. Some regimes (or counsel policies implementing them) expect device-bound sessions or short re-check intervals for continued viewing. Read your matrix — where it requires re-check on an interval or same-device viewing, encode
expires_at/ device binding; don’t invent a wrong state number here.
- VPN / geo conflict. Document the policy when IP geo and billing/account address disagree (block, step-up, or counsel-mapped precedence).
- BIPA / biometric overlay. If face geometry or templates would be retained for Illinois (or similar) users, prefer vendor-held processing and no raw templates on your DB; or disable estimation/face paths in those geos per counsel.
- Marketing claims. Copy that says “anonymous,” “Paxton-proof,” or similar must match the configured methods and jurisdictions. Statute-named anonymous (Florida) ≠ estimation-only with a soft privacy blurb.
Review this with counsel and eng on the same call. If Side A matches production, you’re still in the memo-to-coders handoff.
Side A — What loses
Don’t ship this. If your current build matches Side A, stop the release train and fix it with counsel.
What goes wrong: Covered-state visitor taps Enter. A lone (sometimes pre-checked) “I’m 18+” checkbox unlocks thumbnails and signed media URLs on session cookie alone. ID scans park in app storage “for fraud” with no purge SLA. Estimation is on everywhere for conversion. Growth A/B-tests substantial_portion_covered.
Why statutes care (theme): Covered regimes care about access before verification, method quality, and often what you keep after. Checkbox assent isn’t a recognized method. Scrapable full-res media without an AV session makes the interstitial decoration. Overreading Paxton (2025) as validating every sister statute or vendor method is a research error — you still need a state matrix and method allowlist.
Lawyer lens — what I’d ask on the call: When an AG or private plaintiff asks “how did you verify, in which state, with what retention?”, you need jurisdiction, method, vendor token, timestamps, and purge receipts — not a screenshot of a checkbox.
Engineer lens: If the media API issues bytes whenever session_id is valid, you built a banner — not an under-18 gate.
Any hit means you don’t ship yet.
Non-compliance checklist (red flags)
- Checkbox-only (or ToS-buried) “18+” as sole AV in covered states
- Scrapable / CDN-cached full-res media without
av_status=passed
- Raw ID images retained after pass contrary to non-retention design
- Face estimation enabled where counsel has not signed the method for that state
substantial_portion_coveredflipped by growth without a counsel memo
- Geo from IP alone with no conflict policy when account address disagrees
- AV pass reused to unlock unrelated marketing SDKs
- Marketing claims (“anonymous AV,” “Paxton-proof”) the stack can’t meet
- Collapsing COPPA under-13 parental consent into the adult AV interstitial
Side B — What works better (LE-10 engineering)
Fixed building blocks
- Counsel factual memo first. Is this property in substantial-portion scope for which states — and on what counting method (pages, media weight, homepage inventory)? The enable list is a product flag counsel owns. Re-audit when the content mix shifts.
- Geo → interstitial → vendor → webhook → unlock. Resolve
av_jurisdiction(document IP vs account-address conflicts). Show an AV interstitial before covered thumbnails/players. Vendor completes a method from the state allowlist. Signed webhook setsav_status=passed(or fail). Only then may media unlock.
- CDN / API hard gate. Signed media URLs and manifests require
av_session=passedfor covered jurisdictions. Short TTL. Pen-test scrapability without the token. Non-covered geos may skip AV — but do not claim nationwide legal clearance from that skip.
- Method allowlist per state. Encode statute buckets as implementable method codes (
doc_liveness_match,transactional,mdl,fl_anonymous, counsel-gatedestimation/estimation_stepup). Refuse disallowed methods server-side. Offer a privacy explainer: what is checked, what is not retained, failure options.
- Minimize retention. Prefer opaque vendor tokens and boolean pass/fail. Schedule purge of raw artifacts (often immediate post-pass). Export jurisdiction, method, vendor, timestamps, purge status — not illicit ID bytes.
- Biometric / TIDA overlays. Face geometry for IL users needs a BIPA-style counsel gate (or disable estimation). Intimate-image N&R clocks live in Chapter 5 / LE-11 — AV is entry, not a 48-hour removal duty.
Compliance checklist (green flags)
- Substantial-portion sign-off + state/method matrix under counsel control
- Media/CDN/API 403
AV_REQUIREDwithout pass in covered geos
- Vendor webhook signature verification; no client-only “I passed” flag
- Purge jobs +
raw_purge_statusaudit; token-only durable storage
- Estimation refused where not signed off; FL anonymous path where required; webhook signatures verified; allowlist refusal logged; COPPA under-13 deferred/separate
- Evidence export (state, method, vendor token, timestamps, purge) + chaos test: covered geo + no AV → zero bytes
Template: Lawyer / Engineer card
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
| Lawyer | Engineer |
|---|---|
| For each property, are we in scope for which AV states — and on what substantial-portion methodology? | Is substantial_portion_covered counsel-set, and do media URLs 403 without av_session=passed? |
| Which verification methods are allowed per state? Is estimation signed off or forbidden? | Does the flow refuse disallowed methods server-side, not only in the UI? |
| Non-retention: can we prove purge without keeping banned raw ID data? | Token-only durable store + scheduled purge + audit row? |
| Are we overreading Paxton, or confusing COPPA under-13 with majority-age AV? | Matrix enable list (not one US boolean); LE-09 surfaces kept separate from this gate? |
| Can counsel export a clean pack for one user/device? | Jurisdiction, method, vendor, timestamps, purge — no illicit ID bytes? |
Interface / code / data — one-page checklists
Run these as acceptance seeds — not as informal hunches. If you can’t export the Data row, you didn’t finish.
Interface: AV interstitial before covered content; privacy explainer; state-allowlisted method chooser (e.g. FL anonymous + standard where required); clear fail/limited-mode messaging; notice before ID upload; explain what is not retained.
Interface must-not: Checkbox-only AV; pre-checked “I’m 18+”; scrapable players behind a banner; forcing the heaviest method when anonymous is required; offering estimation where estimation_allowed=false; COPPA parental consent via this screen; marketing claims the configured stack can’t meet.
Code: Geo → jurisdiction → interstitial → signed webhook verify → av_status=passed → CDN/API unlock. Counsel-owned substantial_portion_covered. Server-side allowlist refusal for disallowed method codes. Purge raw payloads per retain_until. Fail closed if vendor down in covered geo — not checkbox fallback. Pen-test: no media without token. Where matrix requires interval / same-device re-check, enforce expires_at / device binding.
Data: av_policy_config (property, substantial-portion signoff, states_enabled, methods_allowed[], estimation_allowed). Method enum examples: doc_liveness_match | transactional | mdl | estimation | estimation_stepup | fl_anonymous | … . av_sessions (jurisdiction, method, vendor, opaque vendor_session_id / eligibility token, status, passed_at / expires_at, raw_purge_at / raw_purge_status, webhook_request_id, signature_ok). Don’t store full MRZ, ID images, face templates, or SSNs unless counsel exceptional memo + encryption + short TTL.
Try this on your product tomorrow
Screenshots and exports beat opinions.
- From a covered geo (or geo-spoof lab), request a media manifest before AV. Did you get bytes?
- Complete AV with a test method. Ask storage: do we still hold the ID image after the purge window?
- Force method=
face_estimatein a state where counsel setestimation_allowed=false. Does the server refuse?
- Export one user: jurisdiction, method, vendor token, timestamps, purge receipt — any illicit raw bytes?
- Confirm the COPPA under-13 / child-directed path is a different surface (or explicitly N/A) — not this interstitial with a different label.
If step 1 serves media, or step 2 still holds banned ID bytes, you have policy language — not an under-18 gate.
Where this goes next
Keep the loop moving — Law → Interface → Code → Data → Counsel sign-off.
- Chapter 5 for TAKE IT DOWN / intimate-image N&R (LE-11) and the paired AV+TIDA teaching figure — use that chapter for the clock-out story.
- COPPA under-13 / child-directed modes (LE-09) — deferred; don’t overload this chapter.
- § 2257 recordkeeping (LE-14) if you’re a covered producer — orthogonal to visitor AV.
- Creator onboarding and NIL ads grants (Chapter 13) stack beside AV; they don’t replace the gate.
This chapter is for education and discussion. It is not legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
Chapter 12 — Worked Example: TCPA / SMS Consent
Pattern family: Marketing SMS consent, revoke, and evidence (LE-21)
Legal anchors: Telephone Consumer Protection Act, 47 U.S.C. § 227; 47 C.F.R. § 64.1200; Facebook, Inc. v. Duguid, 592 U.S. 395 (2021) (narrowed federal ATDS—does not erase prerecorded-voice, DNC, or broader state automated-system rules); FCC Dish Network declaratory ruling, 28 FCC Rcd 6574 (2013) (seller vicarious liability under agency principles); state mini-TCPAs (e.g., Fla. Stat. § 501.059; Oklahoma Telephone Solicitation Act themes).
As of September 2026: Map federal PEWC / marketing-text rules and your mini-TCPA geo list before turning on a brand. Don’t bury marketing SMS consent only inside the ToS.
Why this memo exists
TCPA assent is its own act — separate from account Terms. Capture it cleanly; honor STOP; keep the evidence pack.
The story in one glance
Illustrative reconstructions for teaching. Not exhibits. Not official screenshots of any party’s product.
Someone handed growth a phone number from signup. Marketing texts “obviously” followed. STOP worked on Vendor A and kept firing on Vendor B. A purchased lead list had no proof. Counsel could not export the consent string that was on screen.
That’s the lost side. It’s familiar. It’s also expensive.
Walk this chapter with one phone number open. Ask: which brand consented, with what words, on which surface, and does STOP suppress every sender that can reach that number?
Picture the SMS that just fired to a reassigned number. Ask: can you show prior express consent and an honor-the-stop path — or only a purchased list?
What the law is asking the product to do
Marketing texts to cell phones sit on a consent-and-revoke architecture — not a “we have the number” architecture.
Remember: a Law Engineer is a licensed attorney with software and product expertise. Engineers build these gates under that counsel’s oversight.
- Prior express written consent (PEWC) themes for marketing. For many autodialed / prerecorded marketing texts, the compliance story expects a clear, affirmative agreement — brand identified, purpose/frequency disclosed, msg & data rates, and (where rules forbid conditioning) that consent isn’t a condition of purchase. Soft reading only: classify your send types with counsel; this chapter isn’t a holding that every OTP is (or isn’t) marketing.
- Clear revoke. STOP (and HELP) must work; commercial marketing must cease per policy/law once revoked. Preference-center toggles should match the suppress list.
- Evidence. Language version, UI surface, timestamp, IP/UA, msisdn binding — exportable years later when a private action or AG letter arrives.
- Quiet hours / mini-TCPA geo. Several states harden consent, automated-system definitions, or calling/texting time windows. Phone NPA-NXX + profile state logic beats “federal only” assumptions.
- No purchased lists without proof. Lead-vendor “guaranteed consent” isn’t your evidence pack. Re-consent or refuse the send.
Field rule — put this on the release checklist: Duguid narrowed one federal ATDS definition. It did not delete STOP, DNC, prerecorded-voice theories, state mini-TCPAs, or the need for a consent row before the marketing API fires.
Review this with counsel and eng on the same call. If Side A matches production, you’re still in the memo-to-coders handoff.
Side A — What loses
Don’t ship this. If your current build matches Side A, stop the release train and fix it with counsel.
What goes wrong: Signup collects a mobile for “account security.” Terms say users agree to texts. Growth buys a lead CSV. Campaigns blast from three SMS vendors; STOP works on A but B keeps sending. OTP templates grow marketing footers. Quiet hours live in a spreadsheet. Evidence folder: ToS PDF + send log — no language version, UI archive, or revoke_at.
Why plaintiffs and AGs care: TCPA private actions and mini-TCPA damages make SMS expensive. Bundled ToS is a weak PEWC story. Affiliate/lead texts “as” your brand raise vicarious-agency themes (Dish Network / Gomez-line — orientation only). Number recycle without re-consent looks like ignored revoke.
Lawyer lens — what I’d ask on the call: You need the exact words shown, when, on which surface, for which brand and number — and proof STOP suppressed all marketing senders. A CRM note “opted in at signup” isn’t that.
Engineer lens: If sms.send(purpose=marketing) can succeed without an active sms_consent row for brand_id + msisdn, the checkbox was decoration.
Any hit means you don’t ship yet.
Non-compliance checklist (red flags)
- Marketing SMS with no separate unchecked consent UI
- “By creating an account you agree to texts” as sole marketing consent
- Pre-checked SMS boxes; purchase conditioned on marketing texts where forbidden
- STOP confirmation that doesn’t set
revoke_atacross every vendor
- Purchased / affiliate lists with no consent artifacts or forced re-consent
- Marketing upsells inside transactional OTP templates without marketing consent
- No language_version / ui_archive / IP binding on the consent row
- Ignoring FL/OK (and counsel-listed) mini-TCPA template or quiet-hour flags
- Affiliates texting under your brand without
affiliate_sms_authorized+ their own proof
Side B — What works better (LE-21)
Fixed building blocks
- Separate unchecked consent UI. Brand name, purpose, frequency disclosure, msg & data rates, STOP/HELP info, link to SMS terms / privacy. CTA disabled until checked. Prefer: consent isn’t required to purchase (where that rule applies).
- Consent string evidence. On accept, write
language_version,ui_surface, serveraccepted_at, IP, user agent, brand_id, msisdn (hashed at rest as policy allows), and an immutable UI/copy archive id.
- Hard send gate. Marketing SMS API requires an active consent record. No consent → 403
SMS_CONSENT_REQUIRED. Transactional path (OTP, fraud alerts) is a separate purpose enum — don’t smuggle promos into it.
- Revoke that actually stops traffic. Inbound STOP/HELP/START webhooks;
revoke_atset; suppress propagates to all connected providers within SLA. Preference-center off = same suppress. Confirmation text per carrier practice.
- Quiet hours + mini-TCPA geo. Counsel-owned policy: which states, which windows, which templates. Resolve geo from NPA-NXX and profile state; fail closed or delay when outside window.
- Lists and affiliates. Ban purchased lists without proof artifacts. Affiliates disabled for brand SMS unless authorized and consent proof attaches to the same brand_id story — or force first-party re-consent.
- Retention under hold. TCPA lookbacks often run years — counsel sets retention (commonly discussed ≥ 4–5 years; confirm). Consent artifacts stay exportable under litigation hold.
How commercial SMS stacks commonly encode this
Consent string contents that marketing PEWC UIs typically surface (counsel finalizes copy): brand / seller identity; that the user agrees to receive marketing texts; purpose and expected frequency; msg & data rates notice; how to revoke (STOP) and get help (HELP); link to SMS terms / privacy; and — where rules forbid conditioning — that consent is not a condition of purchase. On accept, persist the exact disclosure copy (language_version + immutable UI/copy archive), not a paraphrase in a CRM note.
Revoke / STOP: Inbound STOP (and HELP/START where used) must set revoke_at and suppress all connected senders. Preference-center off is the same suppress. Keep evidence that the disclosure shown at opt-in matched the program that later honored STOP.
Quiet hours: Mini-TCPA and counsel policy often restrict send windows by NPA-NXX / profile state. Encode as a pre-send gate (delay or block), not a spreadsheet after the campaign.
10DLC / brand+campaign registration (delivery gate, not TCPA consent): Carrier 10DLC brand and campaign registration (and related throughput / trust scores) is the delivery path mobile carriers use for A2P traffic. It sits beside TCPA / mini-TCPA legal consent — do not conflate them. A registered campaign without an active consent row is still a legal miss; a perfect consent pack that never clears carrier registration still fails to deliver. Gate marketing sends on both active consent and (where you use 10DLC) an approved brand+campaign binding for that traffic type.
Compliance checklist (green flags)
- Unchecked, separate marketing SMS consent with brand / frequency / STOP (disclosure copy archived)
- Append-only consent rows + copy hash / ui_archive; 10DLC brand+campaign treated as delivery gate, not PEWC substitute
- Marketing API blocked without active consent; transactional tagged separately
- STOP → global suppress across vendors; HELP returns instructions
- Quiet-hour / mini-TCPA geo flags enforced before send
- No send from purchased lists lacking proof; re-consent path ready
- Counsel export: language, timestamps, IP/UA, revoke_at, message log linked to consent_id
- Chaos test: revoke on Vendor A; Vendor B attempt must no-op
Template: Lawyer / Engineer card
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
| Lawyer | Engineer |
|---|---|
| Is this send marketing PEWC, transactional, or something else — and which regime applies? | Does purpose=marketing require an active sms_consent row server-side? |
| Can we prove the exact consent language and UI for brand + number? | Are language_version, ui_surface, archive id, IP, and accepted_at written immutably? |
| Does STOP clearly revoke, and is that honored everywhere we can text from? | Does revoke set revoke_at and suppress all providers — not one ESP? |
| Which mini-TCPA / quiet-hour rules apply for this geo? | Are NPA-NXX + profile state checked before queue, with delay/block codes? |
| Did a lead vendor or affiliate create agency risk under our brand? | Is affiliate SMS off unless authorized + proof, else re-consent? |
| Can we export a litigation pack for one msisdn years later? | Consent + inbound keywords + message log joinable by consent_id? |
When this lands in court or before a regulator, better data wins. Design the export — timestamps, versions, hashes, and a path to a declaration — well in advance.
Interface / code / data — one-page checklists
Run these as acceptance seeds — not as informal hunches. If you can’t export the Data row, you didn’t finish.
Interface: Separate unchecked marketing SMS checkbox; brand, purpose, frequency, rates, STOP/HELP; links to SMS terms / privacy; preference-center toggle; first-message STOP/HELP instructions per practice; clear “not required to purchase” where counsel requires it; keep the on-screen disclosure copy identical to the archived evidence string.
Interface must-not: Pre-checked boxes; ToS-only marketing consent; purchase forced through marketing SMS opt-in where forbidden; buried Reject/Off; continuing promo teasers after STOP.
Code: Gates: consent capture → active consent check → (geo/quiet-hour policy) → (10DLC brand+campaign approved for this traffic, where used) → send → log with consent_id. STOP/HELP/START webhooks update suppress globally. Affiliate path default-deny. Number-recycle / error handling triggers re-consent or quiet period per counsel policy. No production “blast anyway” override without legal_exception_id.
Data: sms_consents (append-only: user_id, msisdn_hash, brand_id, language_version, ui_surface, ip, user_agent, accepted_at, revoke_at, evidence_archive_id); sms_messages (purpose, template_id, provider_message_id, sent_at, consent_id); sms_inbound_keywords; sms_policy_versions (copy hash, counsel_signoff). Retain under counsel hold.
Try this on your product tomorrow
Screenshots and exports beat opinions.
- Create an account without checking SMS marketing. Can any marketing API still send? Expect 403.
- Opt in; export the consent row. Do you have language version + UI archive + timestamp + IP?
- Text STOP; immediately attempt sends on every connected vendor. Any leak?
- Load a “guaranteed consent” CSV with no artifacts. Does the pipeline refuse or force re-consent?
- Pick a FL or OK test number (counsel list). Does the quieter template / window logic engage?
If step 1 sends, or step 3 leaks on a second vendor, you have a CRM preference — not TCPA Law Engineering.
Where this goes next
Keep the loop moving — Law → Interface → Code → Data → Counsel sign-off.
- Email / CAN-SPAM is a different consent machine (LE-20) — don’t reuse SMS rows as email proof.
- Affiliate onboarding and agency controls (LE-19) when partners can text as you.
- Formation / ToS clickwrap (LE-01) must not be overloaded as PEWC for marketing SMS.
- If Messaging Terms carry a different arbitration provider than Sale Terms, keep evidence packs split by dispute channel (LE-02 split-ADR deepen) — SMS assent must not bleed into purchase compel-arb packets.
- International ePrivacy overlays when you text into the EEA/UK — treat as adjacent, not identical.
This chapter is for education and discussion. It is not legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
Chapter 13 — Worked Example: Creator Onboarding & NIL Licenses
Pattern family: Creator / contractor clickwrap + KYC before payout (LE-28) and optional NIL / likeness license for platform marketing (LE-29)
Legal anchors: Worker-classification orientation (CA ABC / Dynamex, 4 Cal. 5th 903 (2018); Lab. Code § 2775 et seq.—labels don’t control; Prop 22 is not a general creator safe harbor); tax-form hygiene (W-9 / W-8) before payout where practical; right of publicity (Cal. Civ. Code § 3344 themes; common-law persona cases such as Midler / White / Waits orientation; Comedy III, 25 Cal. 4th 387 (2001), and No Doubt v. Activision, 192 Cal. App. 4th 1018 (2011), on transformative-use limits). Soft orientation only—state publicity regimes differ.
As of September 2026: Keep Creator Agreement versions, KYC depth, and NIL scope taxonomy under counsel sign-off. Hosting UGC ≠ consent for off-platform ads.
Why this memo exists
Creator onboarding is clickwrap, KYC, and a scoped NIL / likeness license — not a footer “agree to Creator Terms” hope.
If likeness leaves the platform without a tracked license, you’re inventing rights later. Don’t.
The story in one glance
Illustrative reconstructions for teaching. Not exhibits. Not official screenshots of any party’s product.
A creator publishes on day one. Payouts start after a quiet footer link. Growth features their face in paid UA because “the ToS said we may promote the service.” They email to revoke. Last week’s creative stays on the CDN.
Two doors looked alike. They aren’t.
Door one: pay the person — agreement + tax + identity/sanctions clearance.
Door two: use their face in ads — a scoped, versioned, revocable marketing grant.
Law Engineering keeps them as separate state machines. Hosting UGC isn’t paid-ads consent.
Picture a creator who clicked Join this morning. Ask: is their NIL grant scoped for paid ads and AI training — or a mega-ToS that pretends one checkbox covers everything?
What the law is asking the product to do
Think of creator programs as two doors that look alike and aren’t.
Remember: a Law Engineer is a licensed attorney with software and product expertise. Engineers build these gates under that counsel’s oversight.
Onboarding / payout (LE-28 themes)
- Versioned creator agreement accepted with clickwrap-grade evidence before monetization / payout settings unlock.
- Tax and identity hygiene — W-9 (US) or W-8 series (foreign), plus IDV/KYC and OFAC payee screening as risk control — before the first transfer where practical.
- Classification honesty. Calling someone a “contractor” while the product controls them like an employee is a fact pattern, not a CSS class. Prop 22 doesn’t generally save creator programs. Tax forms don’t fix misclassification.
NIL / marketing likeness (LE-29 themes)
NIL here means name, image, and likeness rights for platform marketing — not every college-athlete statute.
- Split grants. On-platform hosting license ≠ paid UA, app-store creatives, push featuring, or homepage persona ads.
- Scoped, versioned optional grant — channels, duration, territories, exclusivity/compensation if any, and explicit flags for voice / synthetic lookalikes (default off).
- Revoke / takedown path — settings control; kill jobs for active ad sets; short CDN TTL so post-revoke creatives die.
Field rule — put this on the release checklist: Payout clearance and ads clearance are two predicates. One browsewrap ToS sentence (“we may promote the service”) is a weak § 3344 story for paid featuring.
Review this with counsel and eng on the same call. If Side A matches production, you’re still in the memo-to-coders handoff.
Side A — What loses
Don’t ship this. If your current build matches Side A, stop the release train and fix it with counsel.
What goes wrong: Creator publishes day one. Payouts flow after a footer “agree to Creator Terms” link (browsewrap). W-9 is “later.” Growth features the top earner in paid UA because ToS said the platform may promote the service. Creator revokes ads use by email; CDN still serves last week’s creative. The product mandates schedules and exclusivity while everyone stays labeled 1099.
Why it hurts: Pay-before-KYC creates withholding and sanctions pain. Misclassification turns on control, not a missing checkbox. Publicity claims care about knowing advertising use of likeness — hosting UGC ≠ off-platform ads consent. Post-revoke CDN leftovers look like continued use.
Lawyer lens — what I’d ask on the call: Export must show agreement version + hash + assent event, tax/KYC/sanctions status, and — separately — NIL terms version, scope JSON, ads_ok, and revoke/kill-job history. A Zendesk thread isn’t a grant ledger.
Engineer lens: If payouts.create ignores onboarding state, or the ad builder can select any creator with public content, you shipped growth — not LE-28/29.
Any hit means you don’t ship yet.
Non-compliance checklist (red flags)
- Payouts or monetization before current clickwrap Creator Agreement
- Pre-checked agreement boxes; browsewrap-only creator terms
- Pay-then-collect W-9/W-8; no OFAC/IDV gate before first payout
- Hosting license collapsed with ads/NIL grant in one unavoidable wall of text
- Pre-checked “use my likeness in ads”; no scope bullets
- Ad surfaces ignoring
ads_ok/ expiry /revoked_at
- CDN/cache serving creator ads after revoke with no kill job
- Voice-clone / synthetic lookalike ads without explicit grant flags
- Stacking adult AV, § 2257, and NIL into one overloaded onboarding checkbox
Side B — What works better (LE-28 + LE-29)
Fixed building blocks — onboarding
- Clickwrap Creator Agreement. “☐ I agree to the Creator Agreement (vDATE)” — CTA disabled until checked; full text one tap away; store content_hash + ui_surface (same evidence pattern as formation clickwrap).
- Tax wizard + status meter. W-9 / W-8 collected into a restricted store; app DB holds status + refs only.
- IDV + OFAC. Vendor handoff with privacy explainer and purge expectations; sanctions clear before first payout; cadence re-screen is a sibling control (don’t pretend day-0 KYC lasts forever).
- State machine gate.
payouts.create(and, if policy says so, monetization features) rejects unlessagreement_accepted_current && tax_status cleared && kyc_status=pass && sanctions_status=clear. Missing fields return structured errors — not a silent queue.
- Reconsent on material bumps.
requires_reconsent=trueblocks payouts until the new version is accepted.
- Microcopy honesty. Acceptance ≠ independent-contractor status under all laws — counsel one-liner beats overclaim.
Fixed building blocks — NIL / ads grant
- Optional module. Publish/host without granting ads rights.
- Scope UI. Channels, duration, territories, exclusivity/compensation; flags for
ads_okandsynthetic_likeness_ok/ voice (default false).
- Versioned grant. Hash of NIL terms +
scope_json+ acceptance_id.
- Ad pipeline filter. Allowlist only
ads_ok && now < expires_at && revoked_at is null.
- Revoke → kill jobs. Settings set
revoked_at; enqueue ad-set takedown; short CDN TTL; log kills; export grant + kill history beside onboarding clearance.
How onboarding / NIL stacks commonly encode this
Tax form collection: W-9 (US persons) or W-8 series (foreign) before first payout where practical. Typical shape: hosted tax-form vendor or restricted internal store; app DB keeps form_type, status, and a ref — not a world-readable PDF. Missing tax status → structured 403 CREATOR_ONBOARDING_INCOMPLETE with missing_fields, not a silent finance queue.
IDV / KYC + OFAC: Category stacks (Persona- / Veriff-class IDV; sanctions screening vendors) return pass/fail or eligibility tokens via signed webhook. Store opaque vendor session ids + disposition timestamps. Day-0 clearance isn’t forever — re-screen cadence is a sibling control counsel sets. payouts.create requires agreement_accepted_current && tax cleared && kyc_status=pass && sanctions_status=clear.
Clickwrap evidence: Same formation pattern as LE-01 — version label, content hash, ui_surface, assent event — on the Creator Agreement. Material bumps set requires_reconsent and block payouts until re-accept.
NIL grant schema (LE-29): Optional module separate from hosting. Persist scope_json (channels, territories, duration, exclusivity/compensation flags), ads_ok, synthetic_likeness_ok / voice (default false), NIL terms hash, acceptance_id, expires_at, revoked_at. Ad builders and generative lookalike tools allowlist only live grants.
Revoke → kill path: Settings write revoked_at; enqueue nil_kill_jobs against connected ad accounts (Meta / Google / other paid UA APIs as category integrations — confirm each connector). Short CDN TTL + cache purge so post-revoke creatives die; export grant + kill history beside onboarding clearance. Hosting UGC may continue with ads_ok=false.
Compliance checklist (green flags)
- Payouts blocked until agreement + tax + KYC/OFAC clearance
- Clickwrap version label + hash + assent export
- Hosting path independent of
ads_ok
- Ad tools refuse creators without live NIL grant
- Revoke kills new spend and enqueues creative takedown
- Synthetic / voice default off; AV / § 2257 as sibling gates — not one mega-checkbox; dual export tested
Template: Lawyer / Engineer card
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
| Lawyer | Engineer |
|---|---|
| Is the Creator Agreement current, clickwrapped, and classification-reviewed? | Does payouts.create require agreement_accepted_current + tax + KYC + sanctions clear? |
| Can we prove W-9/W-8 and IDV without over-retaining selfies? | Restricted tax store + vendor refs only; purge jobs on IDV artifacts? |
| Is hosting license separate from ads/NIL grant scope? | Can publish succeed with ads_ok=false? Must ads fail without live grant? |
| What channels, duration, territories, and synthetic/voice rights were granted? | Is scope_json hashed with NIL terms on assent? |
| After revoke, can we show wind-down of paid creatives? | Kill jobs + short CDN TTL + revoked_at enforced on allowlist? |
| Are AV / 2257 / affiliate programs overloaded into this assent? | Separate state machines (LE-10 / LE-14 / LE-19) beside LE-28/29? |
Interface / code / data — one-page checklists
Run these as acceptance seeds — not as informal hunches. If you can’t export the Data row, you didn’t finish.
Interface: Versioned Creator Agreement clickwrap; tax wizard status; IDV handoff + retention explainer; optional “Allow [Platform] to use your name and likeness in ads” module with scope bullets and NIL terms link; revoke control in settings; clear separation from hosting-only accept.
Interface must-not: Pre-checked agreement or ads grant; payouts on browsewrap; burying high-visibility ads rights only inside a long hosting ToS; ignoring revoke for “already running” campaigns in the UI story.
Code: Onboarding gate on payout/monetization APIs; material agreement bump → reconsent block; ad creative builder filters live nil_grants; revoke enqueues nil_kill_jobs; generative lookalike features require synthetic_likeness_ok. No production path that treats generic ToS host license as ads_ok=true.
Data: creator_agreements / creator_acceptances; creator_tax_forms (status, form_type, restricted uri); creator_kyc_checks; creator_onboarding_state; nil_grant_terms / nil_grants (ads_ok, synthetic_likeness_ok, territories, expires_at, revoked_at, content_hash, acceptance_id); nil_kill_jobs. Retain tax forms per IRS/counsel policy; assent and grants ≥ contract / publicity claim horizons counsel sets.
Try this on your product tomorrow
Screenshots and exports beat opinions.
- Attempt a payout with agreement accepted but W-9 missing. Expect
403 CREATOR_ONBOARDING_INCOMPLETEwithmissing_fields.
- Accept hosting only (
ads_okfalse). Can growth tools still pull that creator into a paid UA audience? They must not.
- Opt into NIL ads; export grant scope + terms hash. Then revoke; confirm kill jobs and allowlist exclusion within SLA.
- Bump Creator Agreement to a
requires_reconsentversion. Are payouts blocked until re-accept?
- Ask whether voice-clone or “creator lookalike” ads exist. If yes, is
synthetic_likeness_ok/ voice scope explicitly true — or default-deny?
If step 1 pays, or step 2 ads without a grant, you have a creator FAQ — not Law Engineering.
AI-training / model-use NIL grant flag (Ed 1.20)
Likeness licenses often silently drift into training and model-use claims the creator never saw.
Default off: ai_training_grant=false (and sibling model_use_grant=false if split) unless the creator explicitly opts into a versioned grant UI that states training/fine-tune/embedding uses in plain language. Marketing “we may use your content to improve AI” that isn’t backed by an assent event is a congruence failure (LE-41 / LE-69 adjacency).
| Flag | Default | Gate |
|---|---|---|
ai_training_grant |
false | Training pipelines must check flag or exclude subject |
| Custom deal override | Only via LE-71 deal terms + assent | deal_id + grant version |
Field rule — put this on the release checklist: No likeness in training corpora without an explicit grant event — clickwrap silence isn’t a grant.
Try tomorrow: Sample ten creators in a training set — how many have ai_training_grant=true with timestamps? If the answer is “we assume ToS,” you don’t have LE-29 for AI.
Where this goes next
Keep the loop moving — Law → Interface → Code → Data → Counsel sign-off.
Custom creator Deal OS — Chapter 13B (LE-71). AI Terms congruence — Chapter 6G (LE-69).
Influencer program OS (disclosure + listen + legal alert + kill, wired with onboarding/NIL) — Chapter 17 (LE-52).
Formation evidence pattern twin (LE-01) for the clickwrap mechanics.
Affiliate KYC twin (LE-19) when creators also run paid traffic as affiliates.
Continuous NIL / AI-output monitoring (LE-37) after grants exist.
Adult creators: stack under-18 AV (Chapter 11 / LE-10) and, if in scope, § 2257 (LE-14) as sibling gates — don’t overload LE-28.
Intimate imagery in ads implicates NCII / TIDA paths (Chapter 5) — orthogonal consent and removal duties.
This chapter is for education and discussion. It is not legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
Chapter 13B — Worked Example: Custom Creator Deal OS
Pattern family: Custom creator deal operating system (LE-71). Sits after creator onboarding & NIL (LE-28 / LE-29; Chapter 13). Cross-cuts § 2257 content_class (LE-14; Chapter 21), Section 230 claim-class (LE-58; Chapter 9B), and tip/incentive economics (LE-63; Chapter 16D).
Legal anchors (themes): Negotiated deal terms that precede platform clickwrap for that engagement; IP assignment / license deal_type enums; deliverables and acceptance as state machines; exclusivity monitoring; enhanced due diligence (EDD) registers for high-risk counterparties; morality / conduct kill switches; tension when commissioned work looks studio-like vs ordinary UGC for producer-record and § 230 analyses.
As of September 2026: Teaching reconstructions only — generic Brand / KYC vendor. No client names or deal values.
Why this memo exists
Bespoke deals still need versioned paper, assent, and payout gates counsel can explain.
The story in one glance
Picture a platform that “onboards creators” with clickwrap + KYC (LE-28).
Then BD emails a custom PDF: exclusivity, deliverable calendar, IP assignment, morality clause, bonus tips. Ops still treats uploads as ordinary UGC. § 2257 packages assume uploader-producer.
Section 230 decks still say “we’re just a platform.” Name, image, and likeness (NIL) grants never mention AI training — or silently allow it. When the creator breaches exclusivity, nobody can query deal_id.
When a commissioned scene ships, content_class still says ugc.
Take one live custom deal and ask: Ask: does publish and pay both know the deal_id? Does the commissioned upload wear a different content class than ordinary UGC? If exclusivity breaks tomorrow, is there a monitor — or only an angry email?
Custom deals need an OS: precedence, enums, state machines, monitors, diligence, kills — not a PDF in a drawer.
Plain English — clickwrap isn’t the deal
| Control | Meaning |
|---|---|
| Precedence | Active custom_deal overrides conflicting clickwrap defaults for in-scope acts |
| deal_type / IP enum | assignment / exclusive license / nonexclusive / work-for-hire-style (counsel labels) |
| Deliverables SM | draft → submitted → accepted / rejected → paid |
| Exclusivity monitor | Window + scope; alerts on conflicting publishes |
| EDD register | Diligence artifacts for elevated counterparties |
| Morality kill | Counsel/ops flagged terminate → publish/pay gates |
| content_class | commissioned vs ugc (and hybrids) — drives LE-14 / LE-58 |
Field rule — put this on the release checklist: If finance pays on a custom deal but publish paths ignore deal_id, you have a contract museum — not a Deal OS.
Remember: a Law Engineer is a licensed attorney with software and product expertise.
Review this with counsel and eng on the same call. If Side A matches production, you’re still in the memo-to-coders handoff.
Side A — What loses (“PDF + clickwrap”)
What goes wrong: Custom terms in email. Platform ToS still govern in the CMS. Deliverables tracked in spreadsheets. Exclusivity honored on trust. Commissioned content labeled UGC. NIL silent on AI training (LE-29 miss). 230 macro used on company-commissioned posts (LE-58 miss). 2257 assumes wrong producer story (LE-14 miss).
Any hit means you don’t ship yet.
Non-compliance checklist (red flags)
- No deal_id on publish/pay
- Clickwrap silently overrides negotiated IP
- No deliverable state machine
- Exclusivity not monitored
- Commissioned == ugc in content_class
- AI-training NIL default on without grant flag
- EDD only in someone’s inbox
Side B — What works better (deal registry → gates → monitors)
What works better: creator_deals registry with versioned terms hashes, precedence flags, IP enums, exclusivity windows, morality status, EDD status.
Publish/pay/API require deal predicates when engagement_mode=custom. Deliverables state machine with acceptance events.
Exclusivity job scores conflicting public posts. content_class set to commissioned where facts fit — feeds LE-14 crosswalk and LE-58 claim-class. NIL ai_training_grant default off (LE-29).
Kill switch blocks publish/payout on morality/EDD fail.
Compliance checklist (green flags)
- deal_id on in-scope publish/pay
- Precedence documented + encoded
- Deliverables SM live
- Exclusivity alerts + human queue
- content_class accurate
- ai_training_grant default off
- EDD register exportable
Template: Lawyer / Engineer card
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
| Lawyer | Engineer |
|---|---|
| When does custom deal precede ToS? | Precedence flag enforced in policy engine? |
| What IP deal_type was signed? | Enum on deal; publish watermark/metadata? |
| Is this commissioned for 2257/230? | content_class≠ugc when commissioned? |
| AI training on likeness allowed? | ai_training_grant default false? |
| Exclusivity scope/window? | Monitor job + alert routing? |
Interface / code / data
Interface: Creator deal dashboard; deliverable accept/reject; exclusivity warnings; morality status; EDD checklist for ops (not public).
Code: deal registry; precedence policy; deliverable SM; exclusivity monitor; kill gates; content_class writer; NIL flag.
Data: creator_deals; deal_versions; deliverable_events; exclusivity_alerts; edd_records; morality_events; content_class_audit.
Lost vs fixed
| Lost | Fixed | |
|---|---|---|
| Source of truth | PDF email | deal registry |
| Publish | Ignores deal | deal_id gates |
| Class | Always UGC | commissioned vs ugc |
| NIL AI | Silent on | Default off flag |
Try this on your product tomorrow
Screenshots and exports beat opinions.
- Pay a custom bonus without deal_id — should fail.
- Publish under exclusivity window to a rival surface — alert?
- Commissioned upload still
content_class=ugc? Fix.
- Confirm
ai_training_grantfalse by default.
- Export EDD register row for a high-risk counterparty.
Where this goes next
Keep the loop moving — Law → Interface → Code → Data → Counsel sign-off.
- Creator onboarding / NIL — Chapter 13 (LE-28 / LE-29).
- § 2257 content_class — Chapter 21 (LE-14).
- Section 230 claim-class — Chapter 9B (LE-58).
- Tips / incentives — Chapter 16D (LE-63).
- Pattern Map LE-71 — Chapter 32.
Field rule — put this on the release checklist: Custom deals are codepaths. Precedence, class, and kills must ship — or the PDF is theater.
This chapter is for education and discussion. It isn’t legal advice. No client names, deal values, or employee names appear in this teaching reconstruction.
This chapter is for education and discussion. It is not legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
Chapter 14 — Worked Example: Machine-Readable Site Policy & Swarm Contracts
Pattern family: Machine-readable site policy consume (+ optional publish) (LE-47); overlaps dual-consent / bot pre-flight (LE-43) and the agentic commerce stack in Chapter 6B
Legal anchors: Soft orientation only—emerging teaching pattern, not an enacted statute or UETA mandate. Ordinary formation, ToS hierarchy, robots.txt, and consumer-protection overlays still apply. Where a machine file conflicts with human-readable terms or law, counsel’s conflict matrix wins—JSON doesn’t override consumer protection or formation baselines. Hash-linking structured params to prose is an evidence / integrity aid for terms ledgers, not a substitute for assent gates.
As of September 2026: Treat Swarm Contract–style .well-known policies as voluntary governance-as-code interoperability. Confirm your org guardrails, counterparty publication practices, and Chapter 6B pre-flight / bind / ledger rules before unsupervised agents act.
Why this memo exists
When agents act in swarms, each consequential bind still needs a deterministic gate and a record.
The story in one glance
Illustrative teaching figure. Not official screenshots of any party’s product.
An agent lands on a host. It paraphrases footer ToS. It guesses whether bots are welcome. It binds. Later, nobody can show which policy version it “understood.”
That’s the lost side: free-form scrape fuel dressed up as compliance.
On the fixed side, when a site publishes a versioned machine policy (human prose + machine params + cryptographic bind), the agent consumes before act, matches against org guardrails, escalates high-risk clauses, and optionally your first-party site publishes the same surface for inbound agents.
Walk this chapter with one staging agent and one host. Ask: did it fetch, verify, match, and log — or did it invent permission?
Picture a swarm of agents hitting your site. Ask: did each fetch, verify, and log machine-readable policy — or invent permission from a crawl delay?
Emerging pattern — not enacted mandate
Chapter 6B closed the dual-consent gap with deterministic gates: pre-flight, honest identity, consequential-bind HITL, terms ledger, payment mandate. This chapter zooms one layer deeper on LE-47: a stable, fetchable machine surface so agents stop treating legal prose as free-form scrape fuel.
Remember: a Law Engineer is a licensed attorney with software and product expertise. Engineers build these gates under that counsel’s oversight.
Swarm Contract (open teaching pattern documented at swarmcontract.com) is one concrete shape of that idea: a .well-known JSON (e.g. swarmcontract.json or a counsel-approved equivalent) that pairs human-readable legal text with machine-evaluable parameters, bound by a hash so params can’t silently drift from the prose they claim to encode. Agents fetch → verify → evaluate → log. Sites may optionally publish. The format is experimental / ecosystem-oriented — not a claim that every merchant must ship one, and not a holding that presence of a file equals compliance.
Field rule — put this on the release checklist: Machine-readable policy is governance-as-code infrastructure. It makes allow/deny deterministic when present. It does not legalize bot-banned dealing, skip human confirm on consequential binds, or cure a missing terms ledger. Probabilistic paraphrase proposes; hash-verified params + org rules dispose.
Goal in one sentence: discoverable params, prose bind, consume-before-act, escalate on material risk.
Review this with counsel and eng on the same call. If Side A matches production, you’re still in the memo-to-coders handoff.
Side A — What loses
Don’t ship this. If your current build matches Side A, stop the release train and fix it with counsel.
What goes wrong: A commerce or research agent lands on a host. It scrapes whatever HTML looks like “Terms,” asks the model whether agents are allowed, and proceeds. Org “guardrails” live in a system prompt. No fetch of a well-known machine policy. No hash check against published prose. High-risk clauses (arbitration, broad IP grant, auto-renew, unusual liability) never escalate — they get paraphrased into “looks fine.” If the site did publish a structured file, the agent never looked. If hashes mismatch or the CDN served a stale version, nobody notices. Support later says “the agent handled compliance.”
Why this matters in court / before a regulator: (1) Nondeterministic ToS matching — org rules can’t fire reliably on free-form scrape. (2) Evidence vacuum — no policy/prose hashes or match result for the ledger. (3) Conflict blindness — JSON or model guess trusted over ToS/robots Chapter 6B already flags. (4) Silent high-risk accept. (5) Overclaim — publishing a file treated as legal safety.
Lawyer lens — what I’d ask on the call: Discovery asks what the agent knew and decided before bind. A paraphrase isn’t a policy evaluation record.
Engineer lens: Spend/bind without fetch → verify → match (or LE-43 uncertain fallback) is a guessing keyboard.
Any hit means you don’t ship yet.
Non-compliance checklist (red flags)
- Agent acts without attempting well-known policy fetch when configured to look
- Hash mismatch / parse failure ignored; auto-continue
- Org deny rules overridden by model “judgment”
- High-risk clause classes accepted without escalation UI
- Machine file treated as overriding conflicting ToS / robots / consumer law
- First-party “we published JSON” marketed as compliance certification
- Scraping behind auth walls to “find” hidden policies
Side B — What works better (LE-47 + Chapter 6B)
Fixed building blocks
- Consume before act. On host contact (and again before consequential bind): GET the configured well-known path; timeout / absent → fall through to LE-43 uncertain / prose+robots pre-flight — not silent allow.
- Human prose + machine params + hash bind. Structured params (agent allow/deny classes, identity requirements, bind rules, privacy/transaction flags as counsel defines) reference or hash-bind to the human-readable legal text. Mismatch → fail closed or escalate for spend/bind.
- Deterministic guardrail match. Org rule pack evaluates params (deny > allow). Log which rule fired. Model may summarize for humans; it doesn’t dispose the gate.
- Escalate high-risk clauses. Arbitration, class waiver, broad IP assignment, auto-renew, unusual liability / governing-law shifts → pause + human surface (pair Chapter 6B materiality breakers / bind confirm).
- Optional first-party publish. Versioned params, frozen prose hash, public URL, cache headers aligned to version. Signed bump when counsel changes terms. Publishing is interoperability — not a statute checkbox.
- Ledger export. Write
policy_url, hashes, schema version, match result, and guardrail rule ids into the terms / pre-flight evidence trail.
How well-known consume / publish stacks commonly encode this
Consume path (agents): On host contact and again before consequential bind, GET a counsel-configured well-known URL (Swarm Contract teaching shape: /.well-known/swarmcontract.json or equivalent). Hard timeout; absent / 404 / timeout → fall through to LE-43 uncertain / prose+robots pre-flight — not silent allow. Prefer the site’s authorized API surfaces over HTML automation even when params say agents are welcome.
Document shape (orientation): Versioned JSON pairing human-readable prose (inline or URL) with machine-evaluable params (agent allow/deny classes, identity requirements, bind / spend flags, privacy or transaction constraints as counsel defines), plus a hash bind so params can’t drift from the prose they claim to encode. Record schema_version, policy_url, policy_hash, prose_hash, raw params (or content-addressed ref).
Verify → evaluate → log: Check hash / schema before trust. Org rule pack evaluates params deterministically (deny > allow); log which guardrail_rule_ids fired. Parse failure, unknown critical fields, or hash mismatch → escalate or fail closed for spend/bind. Model paraphrase may summarize for humans; it doesn’t dispose the gate.
High-risk escalation: Map clause classes (arbitration, class waiver, broad IP assignment, auto-renew, unusual liability / governing-law) to materiality breakers + HITL (Chapter 6B) — never auto-accept from JSON alone.
Optional first-party publish: Freeze params + prose hash; serve from versioned CDN/object storage with cache headers aligned to version; signed bump when counsel changes terms. Publishing is interoperability aid — not a compliance certificate. Chaos-test stale CDN / hash drift before bind.
Compliance checklist (green flags)
- Fetch attempted; absent/timeout → LE-43 path, not auto-bind
- Hash / schema verify before trust
- Org deny beats model paraphrase
- High-risk flags open escalate UI; no silent accept
- Conflict UI when machine file disagrees with ToS/robots
- Optional publish console shows version, prose link, public URL
- Chaos test: stale CDN / hash drift → block or re-fetch before bind
Template: Lawyer / Engineer card
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
| Lawyer | Engineer |
|---|---|
| Is this an emerging interoperability aid — or are we overclaiming mandate? | Is LE-47 framed as optional consume/publish, not “compliance because JSON”? |
| Who owns the conflict matrix when JSON ≠ ToS ≠ robots? | Does conflict surface LE-43 / human abort instead of preferring the machine file? |
| Which clause classes must escalate before any agent accept? | Are materiality flags mapped to breaker + HITL — not to LLM soft refuse? |
| Can we prove what policy version the agent evaluated? | Do we store policy_hash, prose_hash, match_result, rule ids, timestamp? |
| Does first-party publish stay aligned with live human terms? | Version bump + cache alignment; hash mismatch fails closed for bind? |
| How does this sit with Chapter 6B dual consent? | Pre-flight → policy match → (if consequential) HITL → ledger — never skip? |
Interface / code / data — one-page checklists
Run these as acceptance seeds — not as informal hunches. If you can’t export the Data row, you didn’t finish.
Interface (must-show): Policy viewer with params summary, prose link, hash match status, and which org rule fired; clear stop / escalate on ban, unknown, or high-risk; optional publish console (edit params, freeze version, show public URL); honest “machine policy present / absent / conflict” state before act.
Interface (must-not): “Compliant because .well-known exists”; silent navigate past conflict with ToS/robots; confirm-shaming past high-risk escalation; teaching scrape-behind-login to discover policies.
Code: Fetch well-known JSON (or counsel-configured equivalent) with timeout; verify prose↔︎params integrity per schema version; deterministic evaluator vs org pack (deny > allow); mismatch / parse fail / unknown fields → escalate or fail closed for spend/bind; optional signed publish + versioned CDN; export into the Chapter 6B ledger path. Prefer authorized APIs over HTML automation even when params say agents_ok.
Data: site_policy_fetches — host, policy_url, policy_hash, prose_hash, params_json, schema_version, match_result, guardrail_rule_ids[], at. Retain with pre-flight and terms-ledger evidence for disputes and tabletop reconstruction.
Try this on your product tomorrow
Screenshots and exports beat opinions.
- Point a staging agent at a host with no machine policy. Does it fall to LE-43 uncertain — or invent permission?
- Serve a file with deliberate hash mismatch. Does bind block?
- Publish (or mock)
agents_prohibited/ high-risk arb flag. Does escalate UI appear before tools run?
- Change only CDN-cached params mid-flow. Does re-fetch / version check catch drift?
- Export one evaluation row with hashes and rule ids. Missing fields = demo, not LE-47.
Where this goes next
Keep the loop moving — Law → Interface → Code → Data → Counsel sign-off.
Revisit Chapter 6B for the full agentic commerce stack (pre-flight, bind confirm, ledger, mandate). Keep formation and cancel patterns in view whenever agents touch checkout. For CFAA / scraping authorization gates (source registers, auth walls, scrape-in vs scrape-out — not commerce bind/spend), continue to Chapter 14B (LE-56). Operating-model release gates: counsel signs Interface → Code → Data for every tool that can create legal consequences — including policy consume and optional publish.
This chapter is for education and discussion. It is not legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
Chapter 14B — Worked Example: Scraping & CFAA Gates
Pattern family: Scraping / CFAA authorization gates — scrape-out collection discipline and scrape-in bot defense (LE-56). Adjacent — not identical — to bot pre-flight and machine-readable site policy (LE-43, LE-47; Chapter 14, Chapter 6B).
Legal anchors (themes): Computer Fraud and Abuse Act, 18 U.S.C. § 1030; Van Buren v. United States, 141 S. Ct. 1648 (2021) (authorization as a gate, not a purpose test); hiQ public-profile vs false-identity / contract themes (teaching reconstruction); contract / ToS breach; copyright (facts vs protectable expression); privacy; trespass-to-chattels / impairment themes; state computer-crime analogues (Verify forum).
As of September 2026: Re-check circuit applications of Van Buren, your ToS formation path, and any live agent-architecture “who accessed” disputes before treating a scraper as “obviously fine because the page loaded in Chrome.”
Why this memo exists
CFAA and contract themes care about authorization. Design the gates; log the breaches you care about enforcing.
The story in one glance
Product wants class schedules from other sites for a comparison feature. Growth already hired a vendor who “just scrapes.” Separately, aggregators are vacuuming your instructor profiles and pricing. Someone asks in Slack: Is scraping legal?
Wrong question. Scraping is a technique. The law cares whether anyone passed a gate — a login, a paywall, a revoked credential, an access control — and whether contract, copyright, and privacy still bite even when the CFAA doesn’t.
Chapter 14 taught agents to consume machine-readable policy instead of paraphrasing footer ToS. Chapter 6B taught dual-consent commerce pre-flight.
This chapter is the access-boundary chapter: ToS, robots.txt, and auth walls as gates; inventory of outbound scrapers and inbound bot policy; evidence of authorization state.
A Law Engineer — a licensed attorney with software and product expertise — owns the classification. Engineers build the registers and denies under that oversight.
Walk it with one outbound job and one inbound API. Ask: Did we classify the gate before the fetch? Can counsel export who was authorized, when policy was snapped, and what halted on revocation? Or did we optimize for “get the HTML”?
Teaching reconstructions only. Not screenshots of any party’s live product and not exhibits.
Picture a scraper’s script hitting your authenticated API. Ask: did you publish a machine-readable rule, log the ban, and keep the evidence — or only a robots.txt hope?
Plain English — Van Buren and why purpose is the wrong dial
Van Buren v. United States, 141 S. Ct. 1648 (2021), is the Supreme Court’s modern CFAA orientation point for product teams. The teaching theme: the statute asks whether the actor was entitled to access that area of the computer system — whether they passed through a gate — not whether an authorized user pursued a purpose the owner disliked.
So “we only use it for research” doesn’t clear a login wall. “Competitors are mean” doesn’t create a CFAA claim by itself if the pages were truly ungated. Design the product around authorization state, not narrative purpose.
Counsel still maps footnote and circuit fights about pure contract-based limits. Law Engineering posture: keep a separate contract track (formation, anti-scrape terms, vendor promises) even when the CFAA story is thin.
What the law is asking the product to do (themes)
Orient to six design pressures. Counsel owns the final map.
- CFAA / state analogues — gate, not purpose. Classify each source and each inbound route: ungated public, robots policy, auth required, paywall, revoked. Encode the class in Code; store it in Data.
- Contract. Account holders who accepted anti-scraping / false-identity terms on a rich path are a different defendant story than anonymous hits on a public marketing page. Formation instincts from Chapter 2 / LE-01 apply.
- Copyright. Facts, prices, and availability aren’t protectable the way photos and crafted biographies are. Scraping schedules ≠ license to mirror expressive profiles.
- Privacy. Harvesting personal profiles for resale or contact is a privacy program problem even when CFAA is quiet.
- Impairment. Trespass-to-chattels themes often need actual system harm. Rate limits and impact logs are how you prove you did — or did not — impair.
- Who accessed. When a browsing assistant runs on a user’s machine and the company only receives screenshots or instructions, the “who accessed” element can shift. Record architecture before theorizing. Prefer authorized APIs over HTML automation.
Hard field rule: Do not teach CAPTCHA evasion, UA spoofing, proxy cloaking, fake accounts, or paywall bypass. Those aren’t Law Engineering tickets. They are refusal items.
Side A — What loses (purpose stories and invisible vendors)
What goes wrong: Growth enables a scraper because “the data is public.” Nobody opens robots.txt or terms. A vendor quietly creates accounts under false names for “QA.” Rate limits are “someone else’s problem.” When a cease-and-desist arrives, retries keep firing for three days because the scheduler has no revocation flag. On the inbound side, valuable JSON sits on ungated URLs; anti-bot language lives only in a footer; there’s no acceptance record, no rate log, no circumvention evidence.
Why CFAA / contract themes care: Van Buren won’t save a purpose essay. hiQ-style teaching reconstructions show that public-profile theories and fake-account / terms theories can diverge on related facts. Deletion and injunctions can reach backups and downstream indexes you forgot you had.
Lawyer lens — what I’d ask on the call: Discovery asks for authorization state, policy snapshots, vendor disclosures, and halt proof — not a Medium post about fair use of facts.
Engineer lens: A cron job without source_id / gate_class / method_id is an uninsured liability keyboard. A disguised User-Agent is a confession of gate awareness.
Any hit means you don’t ship yet.
Non-compliance checklist (red flags)
- Outbound fetch with no source register or gate classification
- “Competitive research” used as CFAA clearance
- Login-wall or paywall scraping without counsel-approved authorized credential/API method
- Vendor fake accounts / undisclosed subcontractors
- Spoofed browser UAs, CAPTCHA farms, or cloaking in the backlog
- Revocation email with no halt on retries / DLQ
- No provenance (
source,retrieval_at) on collected records
- Inbound: commercial APIs ungated; anti-scrape terms only browsewrap; no rate/impact evidence
- RAG pipeline executing scraped HTML as instructions
- Treating Chapter 14 machine policy or LE-43 pre-flight as a substitute for CFAA gate classification (or vice versa)
Side B — What works better (registers, gates, evidence)
What works better: Counsel and eng keep a source register. Every outbound job needs source_id + approved method_id. Gate classes drive denies: auth_required / paywall / revoked fail closed unless the method is an authorized API or credential path counsel blessed — never a bypass. Robots/ToS/machine-policy snapshots hash into evidence before first fetch. Vendors attest: no false identities, disclose subcontractors and manual checks. Rate caps and impact metrics run continuously. Revocation flips a flag that stops schedulers, workers, and vendor webhooks, then traces lineage.
Inbound: put valuable data behind auth / API keys; publish robots aligned with reality; put anti-scraping / false-identity rules on a rich acceptance path for accounts; detect and log circumvention attempts; keep a revocation file with delivery proof. Optional LE-47 publish stays consistent with prose — it doesn’t replace gates.
Fixed user story: Comparison feature needs schedules → counsel marks source ungated_public or points product at a licensed API → job runs under rate policy with provenance → C&D on another source → halt in minutes → export shows gate history. Aggregator hits your keyed API without a token → denied and logged; account holder who accepted terms is on a contract evidence path.
Compliance checklist (green flags)
- Source register with gate_class + counsel_signoff
- Deny-by-default fetchers; honest UA / bot token
- Vendor questionnaire + attestation before production traffic
- Policy snapshot hashes; provenance on records
- Revocation drill passed (halt + lineage)
- Inbound auth walls / keys on valuable surfaces; rich-path ToS
- Rate / bot detection logs retained
- Cross-links to LE-43 / LE-47 / Ch 14 for agents — no duplicated commerce stack
- Explicit backlog ban on evasion features
Interface / code / data — one-page checklists
Run these as acceptance seeds — not as informal hunches. If you can’t export the Data row, you didn’t finish.
Interface (must-show): Collection console with register fields and pre-run gate summary; revocation banner; vendor disclosure status; inbound admin for rate limits, alerts, and revocation delivery evidence; signup acceptance of anti-scrape terms where you’ll rely on contract.
Interface (must-not): Purpose-only clearance; CAPTCHA-bypass toggles; silent “enrichment” vendors; browsewrap-only for account anti-scrape terms you plan to enforce; docs that teach defeating third-party gates.
Code: Register-gated fetchers; fail closed on auth/paywall/revoked without approved method; snapshot robots/ToS/policy; honest identity CI check; rate/impact tripwires; revocation kill on scheduler + retries; inbound auth + detection logging; scraped text as data not instructions.
Data: scrape_sources, scrape_methods, scrape_policy_snapshots, scrape_run_events, scrape_provenance, scrape_revocations, vendor_scrape_disclosures, inbound_bot_events, inbound_acceptance. Exportable authorization-state pack for counsel.
Template: Lawyer / Engineer card
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
| Lawyer | Engineer |
|---|---|
| Is this source ungated public, or is there a login/paywall/revocation gate? | Is gate_class enforced in the fetcher, not only in a wiki? |
| Are we telling a Van Buren gate story — or a purpose story? | Do denies cite gate_class / method_id, not “bad intent”? |
| Did any vendor or contractor use false accounts? | Questionnaire + traffic allowlist joined to method_id? |
| Can we prove policy state at collection time? | robots/ToS/policy hashes stored before first fetch? |
| On C&D, what stops and what must be deleted/preserved? | Revocation flag kills retries; lineage export lists stores? |
| Inbound: will we rely on CFAA, contract, or both? | Auth walls + rich-path acceptance + rate/circumvention logs? |
| Who physically accessed the remote host (user agent vs our egress)? | Architecture record before CFAA theorizing? |
| Any ticket that smells like CAPTCHA evasion? | Refuse; open API/partnership path instead |
Lost vs fixed (scene card)
| Lost | Fixed | |
|---|---|---|
| Clearance | “It’s public / for research” | Gate classification + counsel method_id |
| Vendor | Invisible login QA | Attestation; no false identities |
| Identity | Spoofed browser UA | Honest registered UA / token; CI ban on spoof |
| Proof | HTML in a bucket | Provenance + policy snapshot hashes |
| C&D | Retries for days | Immediate halt + lineage |
| Inbound | Ungated JSON + footer ToS | Keys/auth + rich-path terms + logs |
| Agents | Paraphrase ToS / ignore robots | Ch 14 / LE-43 / LE-47 pre-flight — separate from CFAA register |
Try this on your product tomorrow
Screenshots and exports beat opinions.
- List every outbound collector (cron, notebook, vendor, “temporary” script). If it lacks
source_idandgate_class, it’s unsigned.
- Open one target in a clean profile. Is there a login, paywall, or API key between you and the data you use in production?
- Ask your vendor three questions in writing: logged-in accounts? subcontractors? fake identities for QA?
- Flip a staging revocation flag. Do retries die?
- On your own site: curl the valuable API without a token. If it returns commercial data, your scrape-in gate is theater.
- Search the backlog for CAPTCHA, “stealth,” “residential proxy,” “undetectable.” Those tickets get closed into partnership/API work — or refused.
Where this goes next
Keep the loop moving — Law → Interface → Code → Data → Counsel sign-off.
- Machine-readable policy & Swarm Contracts — Chapter 14 (LE-47): deterministic agent policy consume/publish; not a CFAA substitute.
- Agentic commerce dual consent — Chapter 6B (LE-43…LE-46): visit/bind/spend; cross-ref only.
- Formation evidence for anti-scrape terms — Chapter 2 (LE-01).
- Copyright / anti-piracy when expression is copied — Chapter 9 / Chapter 19 (LE-15, LE-35).
- Legal process data maps when preservation follows a scrape dispute — Chapter 7.
- Operating model / release gates — Chapter 31. Pattern Map LE-56 — Chapter 32.
This chapter is for education and discussion. It isn’t legal advice. Re-check primary authorities for your facts and jurisdiction before you ship. Don’t use this guide to design access-control circumvention.
This chapter is for education and discussion. It is not legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
Chapter 15 — Worked Example: Human Authorship Evidence for USCO
Pattern family: Human authorship evidence trail for registration counsel (LE-40); distinct from output-infringement filters (LE-17) and synthetic-media labeling (LE-32)
Legal anchors: Soft orientation only. U.S. copyright practice treats human authorship as essential; Thaler v. Perlmutter themes address AI named as sole author on the registration record—not a bright-line test of how much human contribution salvages every AI-assisted work. USCO registration guidance (2023) and the Office’s Copyright and Artificial Intelligence, Part 2 report (Jan. 2025) orient disclosure of more-than-de-minimis AI material, claiming only human authorship, and case-by-case analysis of selection, arrangement, and meaningful modification—while treating prompts alone as generally insufficient to claim the output. Classic originality themes (Feist; Burrow-Giles) still frame the inquiry. No invented holdings; no promised registration outcomes.
As of September 2026: Confirm current USCO practice, Compendium updates, and your facts with registration counsel before shipping diary or export tooling. Product logs support counsel—they don’t decide copyrightability.
Why this memo exists
USCO cares what a human contributed. Log prompts, edits, and human decisions — not vibes.
The story in one glance
Illustrative teaching figure. Not official screenshots of any party’s product.
A campaign team ships a polished AI-assisted final. Registration counsel asks a simple question: what did the human select, arrange, or meaningfully edit?
On the lost side, the answer is a Slack thread and a binary named final_v7.png. Intermediates are gone. Tool versions are unknown. Someone checked “all human” because the brand “owns” the account.
On the fixed side, the product exports a deposit package: prompts (ACL’d), generation events, human edit/selection logs, tool versions, and a clean split between human-claimed material and AI-generated candidates.
Logging isn’t a copyright guarantee. It’s how counsel gets facts instead of folklore.
Picture the registration packet on your desk. Ask: can you show human creative control across drafts — or only a pretty final PNG?
Why process evidence is a Law Engineering problem
Registration and later disputes ask what the human did, not only what the render looks like. AI-assisted pipelines erase that history by default: chat windows rotate, “final_v7.png” overwrites intermediates, and marketing says “our artists made this” while the toolchain silently invoked models.
Remember: a Law Engineer is a licensed attorney with software and product expertise. Engineers build these gates under that counsel’s oversight.
Law Engineering goal: Build an authorship diary the product can export — human contribution events, AI-assisted flags, tool/model versions, selection among candidates — so counsel can prepare disclosures and limitations of claim. The UI must educate that logging ≠ guarantee of copyright, and must not list the model as “author.”
Field rule — put this on the release checklist: Capture process evidence for humans who create. Don’t automate a story that the work is “all human” when AI tools ran. Counsel applies USCO themes to facts; the pipeline supplies the facts.
Review this with counsel and eng on the same call. If Side A matches production, you’re still in the memo-to-coders handoff.
Side A — What loses
Don’t ship this. If your current build matches Side A, stop the release train and fix it with counsel.
What goes wrong: A campaign team generates dozens of candidates, picks one, lightly crops, ships. No project diary. No record of which prompts produced which hashes. No selection event among candidates. Tool versions unknown. When registration counsel asks what the human authored, the answer is a Slack thread and a final binary. Someone checks “all human” because the brand “owns” the account. Deposit materials can’t separate AI-generated stretches from human arrangement or modification.
Why this matters in court / before a regulator: (1) No human-creativity trail — selection, arrangement, and meaningful edits are invisible. (2) Disclosure blind — counsel can’t describe more-than-de-minimis AI material or limit the claim honestly. (3) Prompt folklore — teams assume elaborate prompting equals authorship; soft USCO themes cut the other way. (4) False all-human flags — session used AI tools but export claims otherwise. (5) Privacy bomb — raw prompt stores without ACL become a second liability.
Lawyer lens — what I’d ask on the call: You need exportable process facts for registration practice and, later, for credibility. A pretty final isn’t an authorship record. Don’t invent that any particular log “wins” registration.
Engineer lens: If claim_all_human=true is possible after known AI tool invocations without a counsel-gated override, the product is lying by design.
Any hit means you don’t ship yet.
Non-compliance checklist (red flags)
- Final assets with no AI-assisted flag when tools were used
- No human edit / selection / arrangement events
- Prompts discarded or stored in world-readable logs
- Export that hides known generations
- UI listing the model as author or co-author
- Marketing “copyright guaranteed by our AI diary”
- Pure autonomous batch jobs labeled as human-authored without review
Side B — What works better (LE-40)
Fixed building blocks
- AI-assisted flagging. Asset creation through known AI tools sets
ai_assisted=true+ tool/model versions automatically.
- Human contribution record. Append-only edit events (text, pixel, arrange, select) with before/after refs or hashes; optional diary prompts (“What did you write, draw, or change?”).
- Generation + selection lineage. Prompt refs (ACL / minimize), output hashes, model versions; selection events recording chosen candidates and optional rationale.
- Registration export pack. Counsel-facing package: diary summary, human edit list, AI segment candidates, tool versions, manifest hashes — secrets omitted; review gate before anyone files.
- Hard gate on false all-human. Can’t assert
claim_all_humanwhen AI invocations exist unless counsel-role override with reason.
- Education in product. Plain language: prompts alone may not establish authorship of the output; claim human contributions; disclose AI material per counsel.
How authorship-diary stacks commonly encode this
Instrument the toolchain: Studio / generative features that call known AI tools write generation_events (ACL’d prompt_ref, output_hash, model_version, timestamp) and set ai_assisted=true + tool_versions on the asset — creators can’t opt out of truthfulness. Editor actions (crop, composite, arrange, select-among-candidates, substantive text edits) append human_edit_events / selection_events with before/after refs or hashes.
Registration export pack: Counsel-facing zip or object: diary summary, human edit/selection lists, AI generation candidates, tool/model versions, and a manifest_hash over included files. Omit secrets and raw credentials. A review gate (counsel role) sits before anyone uses the pack in a filing workflow — the product does not auto-complete USCO forms or assert registrability.
False all-human gate: API blocks claim_all_human when AI invocations exist unless a counsel-role override records a reason. Pure autonomous batch jobs flag as unclaimable candidates until human contribution events exist.
Prompt privacy: Prompt vault is ACL’d and minimized; random teammates can’t read another creator’s raw prompts. Litigation-hold flag extends retention when counsel requires. Soft USCO themes (disclose more-than-de-minimis AI material; claim human authorship only; prompts alone generally insufficient) stay in product education copy — don’t paste Office open letters or guidance PDFs into the UI.
Compliance checklist (green flags)
- AI tool path →
ai_assisted+ versions without creator opt-out of truth
- Human edits append-only and exportable
- Selection among generations logged
- Counsel export separates human-claimed vs AI candidates
- Manifest hashes verify
- Pure autonomous batch flagged as unclaimable candidate pending human work
- No model-as-author certificate UI
Template: Lawyer / Engineer card
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
| Lawyer | Engineer |
|---|---|
| What human expression can we honestly describe (selection, arrangement, modification, perceptible human input)? | Are those events first-class rows — not chat folklore? |
| Is more-than-de-minimis AI material disclosable from the pack? | Does export list AI generations / segments without hiding them? |
| Are we overclaiming from prompts alone? | Is product copy soft-correct: prompts ≠ authorship of output? |
| Who may assert “all human” on an AI-touched asset? | Counsel-role override only; default blocked when tools ran? |
| Can deposit counsel reconstruct tool versions and lineage? | Manifest with tool_versions, hashes, registration_export_id? |
| Retention and prompt privacy aligned with IP policy? | ACL + minimize on prompt vault; litigation-hold flag? |
Interface / code / data — one-page checklists
Run these as acceptance seeds — not as informal hunches. If you can’t export the Data row, you didn’t finish.
Interface (must-show): Optional project diary (“what did you write/draw/edit?”); visible AI-assisted state when tools ran; export-for-counsel (creator + admin); plain-language education that prompts alone may not suffice and that logs don’t guarantee copyright.
Interface (must-not): Promise that the diary “gets you copyright”; export that conceals known AI generations; certificate or metadata UI naming the model as author; one-click “mark all human” after AI sessions.
Code: Asset create with AI tool → ai_assisted=true + tool_versions; human edit events append-only with before/after refs; selection/arrangement events among generation ids; registration export omits secrets, includes diary + hashes; block claim_all_human when AI invocations exist absent counsel override; pure autonomous batch → unclaimable-candidate flag until human contribution events exist.
Data: creative_assets (asset_id, ai_assisted, tool_versions, created_at); human_edit_events (edit_type, ref_before, ref_after, editor_id, at); generation_events (prompt_ref ACL’d, output_hash, model_version, at); selection_events (parent_generation_ids, chosen_id, rationale_optional); registration_exports (export_id, asset_ids, counsel_user, manifest_hash, at). Retention: IP / business multi-year horizon + litigation hold — counsel sets the clock.
Soft practice themes (educational only)
- Disclose more-than-de-minimis AI-generated material; claim human authorship only; don’t list AI as author.
- Human-protectable candidates (case-by-case): perceptible human expressive inputs, creative selection/coordination/arrangement, meaningful modifications — not mere prompting of today’s systems.
- Thaler-line themes: autonomous AI as sole author fails on that record; AI-assisted facts remain fact-specific.
- Pending theories and docket developments: pull primary sources before citing outcomes — don’t invent holdings.
- This chapter never asserts that a given export “would register” or “would be denied.”
Try this on your product tomorrow
Screenshots and exports beat opinions.
- Generate → human crop/edit → export. Are both generation and edit events present?
- Attempt
claim_all_humanafter an AI session — API should refuse absent counsel override.
- Run a pure autonomous batch — does it flag as unclaimable candidate?
- Open the counsel pack: can someone separate AI candidates from human edit/selection lists without Slack archaeology?
- Check prompt ACL: can a random teammate read another creator’s raw prompts?
- Verify manifest hashes on a re-export. Drift without versioning = demo.
Where this goes next
Keep the loop moving — Law → Interface → Code → Data → Counsel sign-off.
Pair output filters (LE-17) and synthetic labels (LE-32) when the same pipeline publishes publicly. Contributor agreements and assignment hygiene still matter for who owns whatever human authorship exists. Operating-model release gates: counsel signs Interface → Code → Data before “registration-ready” marketing ships.
This chapter is for education and discussion. It is not legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
Chapter 16 — Worked Example: Ecommerce Authenticity, Returns, Reference Pricing & Loyalty
Pattern family: Authenticity / rebottle / nominative identification (LE-48); final-sale / hygiene / RMA (LE-49); compare-at / MSRP / sale labels (LE-50); loyalty / rewards / promo abuse (LE-51); with callouts to deepened formation (LE-01), split ADR (LE-02), and optional paid add-ons (LE-05).
Legal anchors (themes): FTC Act §5 unfairness/deception; Lanham Act authenticity / nominative-use themes; CLRA/UCL themes; former-price / sale-advertising themes; formation (Specht, Nguyen, Meyer) at checkout when dispute clauses are heavy; TCPA kept separate for SMS (LE-21 / Chapter 12).
Teaching note: Illustrative specialty ecommerce patterns (samples, independently filled vials, sale badges, points). Not a screenshot of any live merchant and not an allegation about any named seller.
Why this memo exists
Claims on the page must match the stack. Final-sale and compare-at are product gates, not footer hopes.
The story in one glance
Open a specialty ecommerce cart on your phone. Samples. Independently filled vials. A bright sale badge. Points at checkout. Cookie Settings in the footer.
Now ask what a buyer actually saw before Pay.
On the lost side, authenticity headlines sit without unaffiliated/rebottle disclosures. Final-sale appears only after purchase.
Compare-at numbers have no basis. Loyalty points never claw back on refund.
Pay rests on footer Terms alone while arbitration lives in Sale Terms. Cookie Settings nowhere opens a CMP (Chapter 4).
On the fixed side, each surface carries its claim set, returnability class, price basis, and assent row — frozen as evidence at Pay.
This chapter walks lost vs fixed for the purchase-adjacent stack. Reuse the formation figure mindset from Chapter 2: teaching reconstructions, not exhibits.
Picture the PDP that screams “was $199, now $49” next to a loyalty points loophole. Ask: can you prove the reference price was real, and that the loyalty graph blocks self-dealing?
Review this with counsel and eng on the same call. If Side A matches production, you’re still in the memo-to-coders handoff.
Side A — What loses (archetype composite)
Walk the surfaces the way a buyer actually sees them.
Authenticity. PDP shows a green “100% Authentic” badge. Brand name and logo dominate. Rebottle / independent-fill language lives in FAQ §12. Unaffiliated disclosure is absent. Cart and checkout never repeat the claim set. After a dispute, nobody can hash what authenticity words the buyer saw.
Final sale. Samples are non-returnable in the Help Center. Checkout is silent. RMA bot answers every ticket with “all sales final,” including cracked vials and wrong scent. Damaged-window language is “contact us promptly.”
Compare at. Strikethrough $180 / Sale $49. Methodology paragraph in Sale Terms describes “recent store price”; the pricing service uses a static “list” field from a vendor spreadsheet. Affiliate emails show a third number.
Loyalty. Checkout offers points and a referral code. Stacking rules are a blog post. Refund leaves points in the ledger. Self-referral is a CS spreadsheet. Loyalty Terms were updated last month; earn still cites the old version.
Checkout assent. Pay sits above a footer link row: Terms · Privacy · Cookie Settings. No assent sentence. Cookie Settings is #. Optional shipping protection is pre-checked. SMS box is separate (good) but its Messaging Terms name a different arbitration provider than Sale Terms — and the compel-arb packet later mixes them (bad).
Lawyer lens — what I’d ask on the call: You face §5 / UCL narratives on claims and price, chargebacks without disclosure evidence, and a formation fight on arb — with a contaminated exhibit set.
Engineer lens: CMS, pricing service, loyalty ledger, CMP, and checkout assent were four teams’ problems. None shared version hashes at order time.
Remember: a Law Engineer is a licensed attorney with software and product expertise. Engineers build these gates under that counsel’s oversight.
Any hit means you don’t ship yet.
Non-compliance checklist (red flags)
- Authenticity badge without rebottle/unaffiliated when independently filled
- Final-sale first disclosed post-purchase
- RMA auto-denies damaged/incorrect because SKU is final-sale
- MSRP/Compare-at with no basis record
- Sale Terms methodology ≠ pricing engine
- Points survive refund/chargeback with no clawback rule
- Pay as browsewrap-only while Sale Terms carry heavy arb
- SMS/Messaging ADR evidence used in a purchase dispute packet
- Pre-checked paid shipping protection
- Cookie Settings dead control
Side B — What works better
Here’s the build worth shipping — gates, records, and an export counsel can defend.
Walk each surface the way a buyer actually sees it — then freeze evidence at Pay.
Authenticity + nominative identification (LE-48)
Versioned claim set on the PDP: authenticity language, independent-fill/rebottle disclosure, and unaffiliated / not-sponsored language in the same cluster when brand names identify the scent. Nominative use limited to identification — no “official store” chrome unless true. Add-to-cart and Pay freeze claim_set_hash on the order line. Kill switch revokes a bad claim set without waiting for a full ToS republish.
Final-sale / RMA hygiene (LE-49)
SKU returnability_class drives PDP badge, cart line chip, and checkout disclosure. Return Policy version hash stored on the order. RMA reason picker still offers damaged / incorrect / not-as-described carveouts; change-of-mind on final-sale denies with a coded basis. Numeric report windows, not “promptly.”
Reference pricing (LE-50)
Every strikethrough has a reference_basis_type and record (manufacturer MSRP, own prior price, etc.). Labels match the basis — don’t say MSRP for a cosmetic list field. Methodology disclosure in UI + Sale Terms shares one methodology_hash with the engine. Expired bases suppress badges.
Loyalty (LE-51)
Loyalty Terms assent recorded at earn and redeem. Stacking matrix enforced in API. Refund and chargeback webhooks recalculate points. Abuse gates (self-referral, velocity) fail closed with logged exceptions. Paid VIP tiers route through easy-cancel patterns (Chapter 3), not “rewards” camouflage.
Formation / ADR / add-ons callouts (LE-01 / LE-02 / LE-05)
- Pay: assent sentence or clickwrap when dispute clauses are heavy; guest included (Chapter 2 deepen).
- Multi-doc: Sale Terms bind Pay; Messaging Terms bind SMS only; Loyalty Terms bind rewards — separate evidence rows.
- Split ADR: purchase dispute packet loads purchase clause set only; SMS dispute loads messaging clause set only (Chapter 12 cross-ref).
- Order-as-offer: confirmation says received;
seller_acceptance_atat shipment when Terms use that mode.
- Optional protection: default off; price + scope before charge; separate terms if counsel requires.
Cookie Settings
Footer control opens the working CMP (Chapter 4 deepen). GPC state visible. Deploy smoke test clicks the link.
How methods stacks commonly encode this (Interface / Code / Data)
| Gate | Behavior |
|---|---|
| G1 | PDP authenticity badge requires claim_set_id; independent-fill posture forces rebottle + unaffiliated blocks |
| G2 | Checkout lists final-sale lines + Return Policy version; Pay stores hashes |
| G3 | Compare-at display refused without active basis record; methodology hash matches engine |
| G4 | Loyalty earn/redeem require terms version; refund/chargeback enqueue clawback |
| G5 | Pay requires purchase incorporation_set acceptance when arb_heavy; SMS optional path separate |
| G6 | Optional add-on default_selected=false server-side; Cookie Settings synthetic click passes |
Interface: Claim cluster + returnability chips + honest price labels + loyalty stacking summary + purchase assent + optional add-on off by default + working Cookie Settings.
Code: Gates G1–G6; RMA carveout matrix; split clause-set export by dispute_channel.
Data: order_line_claim_snapshots; return_policy_hash; reference_basis_records; loyalty_ledger + acceptances; purchase vs messaging clause_set_ids; addon acceptance ids; CMP version on preference reopen.
Template: Lawyer / Engineer card
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
| Lawyer | Engineer |
|---|---|
| What authenticity words did this buyer see? | Is claim_set_hash on the order line? |
| Are final-sale and damaged carveouts both encoded? | Does RMA reason damaged open a ticket on final-sale SKUs? |
| Can we substantiate compare-at? | Does display API fail closed without a basis record? |
| Which ADR program governs this claim? | Does export require dispute_channel before attaching clause bytes? |
| Did shipping protection start unchecked? | Can experiments pre-check add-ons without legal allowlist? |
Try this on your product tomorrow
Screenshots and exports beat opinions.
- Open a sample/decant-style PDP. Circle authenticity, rebottle, and unaffiliated language — are they co-located?
- Add a final-sale SKU; screenshot checkout. Is non-returnability visible before Pay?
- Inspect one compare-at: ask pricing for the basis record. No record → no strikethrough.
- Refund a points order in staging; does the ledger claw back?
- Click Pay-path Terms and footer Cookie Settings. Assent + CMP — or paper compliance?
- Trace SMS opt-in vs purchase assent IDs — different rows?
Where this goes next
Keep the loop moving — Law → Interface → Code → Data → Counsel sign-off.
- Formation detail — Chapter 2; privacy/CMP dead controls — Chapter 4.
- TCPA / SMS as a separate assent machine — Chapter 12 (split ADR with LE-02).
- Contests, loot boxes & NFT pay-to-reveal (chance mechanics) — Chapter 16B (LE-54).
- Influencer program OS (sibling growth surface) — Chapter 17.
- Operating model and release gates — Chapter 31.
- Pattern Map LE-48…LE-52, LE-54 — Chapter 32; LE title index — Chapter 33.
This chapter is for education and discussion. It is not legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
Chapter 16B — Worked Example: Contests, Loot Boxes & NFT Pay-to-Reveal
Pattern family: Contests, sweepstakes, loot boxes, virtual chips, and NFT pay-to-reveal chance mechanics (LE-54). Sits with ecommerce revenue / promotions after authenticity, returns, pricing, and loyalty (LE-48…LE-51; Chapter 16) — not with CIPA privacy wiretap themes (Chapter 4B).
Legal anchors (themes): State lottery / gambling elements — consideration + chance + prize (or “thing of value”); sweepstakes free alternative method of entry (AMOE) of equal dignity; skill contests (chance tiebreakers put chance back in); Washington continued-play / “thing of value” themes (Kater v. Churchill Downs Inc., 886 F.3d 784, 787–90 (9th Cir. 2018)); Maryland loss-of-money themes (Mason v. Machine Zone, Inc., 851 F.3d 315, 319–22 (4th Cir. 2017)); loot / random-reveal NFT prize analysis via transferability + secondary market. NFT profile-picture (PFP) pay-then-reveal gambling classification remains unsettled design-risk — when the public teaching article on this pattern was published, no reported case had decided it; allegations alone can chill projects, platforms, and marketers.
As of September 2026: Re-check the jurisdictions you ship into, registration/bonding thresholds for sweepstakes, and counsel’s element map before you enable a spin, a box, or a blind mint. Social-casino chip cases are analogical — not holdings about NFT drops.
Why this memo exists
Chance mechanics are regulated surfaces in many markets. Disclose odds; gate eligibility; keep the proof.
The story in one glance
Picture a profile-picture drop.
Buyers pay in crypto first. Traits stay hidden. An OpenSea-class UI may already show rarity odds from metadata. Reveal day arrives. Rare traits pop. Secondary markets clear. Someone on the team calls it a collectible drop. Someone else jokes it’s a lottery with better art.
Ask the only question Law Engineering cares about at ship time: did the product accidentally ship a lottery?
Not “did we mean gambling?” Not “does the disclaimer say entertainment only?” The stack either removed an element of the lottery rule in code, or it did not.
This chapter walks chance mechanics the way a mentor walks a release board: three elements in plain English, sweepstakes and skill off-ramps that have to be real, virtual-chip jurisdiction traps, loot boxes and pay-to-reveal NFTs, then Interface / Code / Data you can paste into a ticket.
Teaching reconstructions only. Not screenshots of any party’s live product and not exhibits.
Picture a pay-to-reveal loot box. Ask: are odds, no-purchase path, and age gates honest in the UI — or only in a buried FAQ?
Three elements — plain English
Most U.S. lottery / illegal-gambling stories need three things together:
- Consideration — the player pays to enter or play (money, crypto, or another stake the statute cares about).
- Chance — the outcome isn’t predominantly skill under published criteria.
- Prize / thing of value — the player can win something the statute treats as valuable.
Remove one element for real, and counsel may have a lawful sweepstakes, a skill contest, or a fixed-price sale. Leave all three in place without a licence, and friendly product names (“promotion,” “game,” “drop”) won’t save you.
Field rule — put this on the release checklist: A design that “removes” an element must remove it in code, not in a disclaimer.
What the law is asking the product to do (themes)
Orient to five design pressures. Counsel owns the final map for your facts and jurisdictions.
- Classify by elements, not by marketing. Every promotion, loot box, spin, raffle, chip sink, and random-reveal token gets an
element_map: consideration / chance / prize — per jurisdiction.
- Sweepstakes off-ramp — AMOE of equal dignity. If counsel removes consideration with a free alternative method of entry, that path must be visible, equally weighted, and as usable as paid. A buried PDF isn’t equal dignity.
- Skill off-ramp — chance must stay out. Published judging criteria; skill must predominate. A random tiebreaker puts chance back in.
- Prize is statute-shaped. Washington-style “thing of value” themes can reach continued play without cash redemption (Kater themes). Maryland loss-recovery themes asked whether the player lost money to the defendant (Mason themes). Same chips, different statutes — ship a jurisdiction matrix, not a global vibe.
- Loot / NFT random reveal. Consideration and chance are usually on their face. Prize turns on transferability and secondary markets. Copy that says the asset “may increase in value” is the prize element spoken aloud.
Charity changes the recipient of funds. It does not finish the gambling analysis. Elements first; charitable-platform rules second.
Provably fair reveal (commit–reveal, VRF, public seeds) addresses cheating. It does not remove chance.
Review this with counsel and eng on the same call. If Side A matches production, you’re still in the memo-to-coders handoff.
Side A — What loses (lottery with better branding)
What goes wrong: Checkout offers “spin to win 20% off” with no classification memo. The mobile game sells loot boxes; contents appear after purchase. Virtual chips “have no cash value,” but when they run out the only way to keep playing is to buy more. Marketing mints a PFP collection: pay first, reveal later, trade on day two. Official rules PDF mentions “no purchase necessary” on page nine; the free entry form is a mail-in with different odds weight than the paid path. A charity badge sits on the mint page. Influencers hype “lottery vibes” and “floor go up.”
Why the elements care: Consideration is in the wallet debit. Chance is in the RNG or blind reveal. Prize is in the discount, the rare trait, the continued play, or the secondary-market upside. A disclaimer doesn’t amend a statute. A fairness badge doesn’t delete chance. A charity logo doesn’t delete the triad.
Lawyer lens — what I’d ask on the call: You need a jurisdiction × mechanic matrix and proof the removed element is actually gone. Kater / Mason teach that chip stories diverge by statute — don’t brief “social casino is fine in the Ninth Circuit” as if it were a national NFT rule. For PFP pay-then-reveal, keep the posture honest: unsettled / design-risk, not an invented safe harbor.
Engineer lens: If paid entry and free entry don’t share the same drawing weight path, AMOE is theater. If geo checks run only on the marketing site while the mint contract takes funds from anywhere, the gate is a sticker. If “non-transferable” is ToS text while the token standard still transfers, the economic loop will expose you in test — or in discovery.
Any hit means you don’t ship yet.
Non-compliance checklist (red flags)
- Spin-to-win / loot / blind mint live without an element map + counsel sign-off
- AMOE buried, unequal weight, or harder than paid
- Skill contest with a random tiebreaker
- “No cash value” while chips gate continued play
- Transferable random-reveal NFT plus “may increase in value” marketing
- Charity wrapper used to skip element analysis
- Age/geo only at account create — not at wager / mint / reveal / payout
- Provably fair marketed as “not gambling”
- Influencer drop promo with no classification handoff (Chapter 17)
Side B — What works better (remove an element in the stack)
What works better: Counsel inventories every chance mechanic. Each row gets consideration / chance / prize for each ship-to jurisdiction. Product either redesigns (true AMOE, true skill, fixed contents / pre-purchase odds, non-transferable under counsel’s model) or withholds the mechanic where the analysis fails.
Sweepstakes: free entry sits beside paid — same drawing, equal dignity, logged parity. Skill: rubric published; config refuses chance tiebreakers.
Loot / NFT: if counsel’s model is “not chance,” the buyer sees contents or odds before purchase, or buys a fixed SKU. Transfer and secondary-market flags are inputs to the prize analysis, not afterthoughts.
Age and geo fire at the wager act (and at reveal / payout when those are covered). Economic-loop tests run in staging: buy → play → exhaust → reward → transfer → resale.
NFT mint still forms a licence at purchase (Chapter 2) and still respects payments / MCC reality (Chapter 10). Marketers who promote the drop inherit influencer-program gates (Chapter 17). CIPA session-replay consent (Chapter 4B) remains a different machine — don’t park this chapter there.
Fixed user story: Mechanic proposed → element map drafted → counsel signs a version → code encodes the removed element or withholds → loop test passes → production flag opens only for green jurisdictions.
Compliance checklist (green flags)
mechanic_id+ versionedelement_map+counsel_signoffbefore enable
- AMOE equal dignity (if sweepstakes) proven in UI and weight path
- Skill criteria published; no chance tiebreaker
- Pre-purchase contents/odds or fixed selection when “not chance” is the model
- Geo/age at purchase, wager, reveal, payout
- Transfer / secondary-market flags honest and tested
- Charity analyzed after elements
- Reveal-seed / fairness policy recorded without claiming it removes chance
- Kill switch / withhold matrix fail-closed
Virtual chips — jurisdiction matrix, not vibes
Walk the social-casino analogy carefully so nobody ships the wrong lesson into an NFT mint.
In Kater, the Ninth Circuit’s Washington-law themes treated virtual chips that extended the privilege of continued play as a “thing of value” — cash redemption was not required on the pleaded mechanics (886 F.3d at 787–90 themes). In Mason, the Fourth Circuit’s Maryland loss-recovery themes asked whether the player lost money in the statutory sense and affirmed dismissal on that path (851 F.3d at 319–22 themes).
Same chips. Different statutes. Different outcomes.
Law Engineering translation: encode a matrix. Don’t encode a slogan (“players can’t cash out, so we’re fine”). When your facts are loot boxes or pay-to-reveal NFTs, use Kater / Mason to remember that prize definitions travel poorly — then do the NFT analysis on transferability and secondary markets with counsel, as unsettled design-risk where no holding has decided your exact drop.
Interface / code / data — one-page checklists
Run these as acceptance seeds — not as informal hunches. If you can’t export the Data row, you didn’t finish.
Interface (must-show): Classification-backed UX — AMOE as easy as paid; skill rules visible; contents or odds before purchase if “not chance”; age/geo at the wager act; honest transferability; mint licence summary (Chapter 2).
Interface (must-not): Unclassified spin-to-win at checkout; buried unequal AMOE; “entertainment only” as the only prize removal; charity-as-cure; fairness badge as gambling cure; “may increase in value” while denying a prize element.
Code: Per-mechanic element_map; counsel sign-off gate; geo/age at purchase/wager/reveal/payout; AMOE parity; refuse chance tiebreakers; secondary-market / transfer flags; withhold where analysis fails; economic-loop test harness.
Data: mechanic_id, jurisdiction, element_map version, counsel_signoff, test_loop records, reveal_seed_policy (fairness ≠ cure), transfer flags, AMOE parity events, gate basis codes.
Lost vs fixed (scene card)
| Lost | Fixed | |
|---|---|---|
| Opening move | Ship the spin / box / blind mint; memo later | Element map + counsel sign-off before enable |
| Consideration | Pay-only entry; fake free path | AMOE equal dignity in UI + weight path — or accept consideration and licence/withhold |
| Chance | Blind reveal; random tiebreaker | Pre-purchase odds/contents, fixed SKU, or true skill rubric |
| Prize | “No cash value” while play continues / NFTs trade | Statute-aware matrix; transfer + secondary market in the map |
| NFT PFP | Pay → reveal → flex floor price; call it art only | Unsettled-risk memo; redesign or withhold per jurisdiction |
| Fairness tech | “Provably fair = legal” | Fairness logged; chance still present |
| Proof | Disclaimer PDF | Map version, sign-off, loop test, gate logs |
Template: Lawyer / Engineer card
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
| Lawyer | Engineer |
|---|---|
For this mechanic_id, which element did we remove — and under which statute? |
Is the removed element impossible in code (not only hidden in UI)? |
| Is AMOE equal dignity, or brochure compliance? | Do free and paid entries share the same weight path and logs? |
| Continued play or secondary market — in or out of “prize”? | Do transferable / secondary flags drive the map and kill switch? |
| PFP pay-then-reveal — unsettled risk acknowledged in writing? | Can we withhold geo or mechanic without a full redeploy? |
| Charity analyzed after elements? | Two-analysis memo hooked before charity mint flags? |
| Does “provably fair” appear in marketing as a legality claim? | Is reveal_seed_policy stored without a chance=false side effect? |
Try this on your product tomorrow
Screenshots and exports beat opinions.
- List every spin, loot, raffle, chip purchase, and random-reveal mint. If the list is empty, you’re done — for now.
- For one mechanic, fill consideration / chance / prize in one jurisdiction. If any cell is “disclaimer says no,” rewrite the cell to what the code does.
- If you claim sweepstakes, take the free path yourself on a phone. Time it against paid. Equal dignity?
- Run a staging loop through transfer or resale. Does “non-transferable” survive contact with the token standard?
- Search marketing for “may increase in value,” “lottery,” and “provably fair.” Circle each against your element map.
- Ask which endpoint enforces age/geo on mint / wager / reveal / payout. If the answer is “the homepage banner,” fix the gate.
Where this goes next
Keep the loop moving — Law → Interface → Code → Data → Counsel sign-off.
- Formation / licence at mint or checkout — Chapter 2 (LE-01).
- Payments, MCC, chargeback evidence — Chapter 10 (LE-26).
- Ecommerce authenticity / returns / loyalty siblings — Chapter 16 (LE-48…LE-51).
- Influencer / marketer promotion of drops — Chapter 17 (LE-52).
- CIPA session replay is not this chapter — Chapter 4B (LE-53).
- Operating model / release gates — Chapter 31. Pattern Map LE-54 — Chapter 32.
Field rule — put this on the release checklist: Provably fair reveal addresses cheating; it doesn’t remove chance.
This chapter is for education and discussion. It isn’t legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
This chapter is for education and discussion. It is not legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
Chapter 16C — Worked Example: Accessible Checkout & ADA Title III
Pattern family: Accessible transactions / ADA Title III checkout (LE-57). Sits with ecommerce revenue surfaces after authenticity, returns, pricing, loyalty (LE-48…LE-51; Chapter 16) and chance-mechanic overlays (LE-54; Chapter 16B) — not with CIPA privacy wiretap themes (Chapter 4B).
Legal anchors (themes): ADA Title III — full and equal enjoyment of the goods and services of a place of public accommodation (42 U.S.C. § 12182); auxiliary aids / effective communication themes (incl. 28 C.F.R. § 36.303 themes); Robles v. Domino’s Pizza, LLC, 913 F.3d 898 (9th Cir. 2019) — on facts where a website and app connect customers to physical restaurants, Title III reached those digital ordering channels; the statute can supply fair notice without a DOJ web technical blueprint; waiting for DOJ / primary-jurisdiction deferral was not the defense path the Ninth Circuit endorsed; WCAG may be ordered as an equitable remedy theme without being a magic liability checklist. Circuit split on whether a purely online service is a public accommodation — treat as unsettled / jurisdiction-dependent, not a settled national holding either way (Carparts-line themes on one side; physical-nexus themes on the other). State analogues (e.g. Unruh Act themes) may add damages exposure. DOJ Title II web rules for public entities are a separate framework — don’t conflate with private Title III ecommerce.
As of September 2026: Re-check your forum’s pure-online posture, state-law overlays, and the WCAG version counsel is using as the working / remedy target. Scanners help. They don’t finish the job.
Why this memo exists
ADA / accessibility isn’t a marketing badge. If assent and cancel aren’t operable, formation and ROSCA themes get harder — and plaintiffs notice.
The story in one glance
Picture release day.
The accessibility scan is green. Lighthouse is happy. Someone pastes the badge in Slack. A customer using a screen reader still can’t pick a delivery date in the vendor calendar, can’t tell which price belongs to which pizza, and never hears that payment failed — only that the Pay button did nothing. The home page is fine. The transaction isn’t.
Someone says: put the 1-800 number in the footer.
Ask the only question Law Engineering cares about at ship time: can this person complete the purchase — and later cancel — with the tools they use?
Not “did the page scan pass?” Not “did the vendor send an accessibility PDF?” The stack either supports the task, or it doesn’t.
This chapter walks accessible checkout the way a mentor walks a release board: task not scan, Robles-style themes without overclaiming, the pure-online circuit split as risk not slogan, vendor-widget gates, phone alternatives evaluated honestly, then Interface / Code / Data you can paste into a ticket.
Teaching reconstructions only. Not screenshots of any party’s live product and not exhibits.
Picture checkout with a screen reader. Ask: can a keyboard-only user complete purchase and cancel — or does the legal act live in a mouse trap?
Task, not scan — plain English
Automated scanners catch a mechanical subset of issues (contrast, missing alt, empty buttons). Useful. Incomplete.
Customers and Title III theories care about tasks. Name them before you name the tool:
- Find — reach the product or service.
- Price — know what it costs (price associated with the item, not only painted nearby).
- Choose — pick variants, dates, quantities, filters — including the vendor widget everyone blames later.
- Pay — complete payment fields; recover when something fails.
- Confirm — read the confirmation.
- Cancel — get out with dignity comparable to how they got in.
On many stacks you also need accept (terms associated with the control — Chapter 2), log in / MFA, and correct mid-flow errors. If any required step is a cliff for keyboard or assistive technology (AT), the journey fails — even when the marketing site scores 100.
Field rule — put this on the release checklist: The scan measures pages. The law and the customer care about tasks.
What the law is asking the product to do (themes)
Orient to six design pressures. Counsel owns coverage and the acceptance standard for your facts.
- Build the transaction, not the badge. Release gates attach to the journey (find → … → cancel), not to a homepage score.
- Robles-style themes where facts fit. Digital channels that connect customers to physical places of public accommodation have been held within Title III on those facts. Fair notice can come from the statute; “DOJ has not published a web rule for us yet” is a weak design brief. WCAG is often the remedy target a court can order — use it as the working standard, then still prove the task with AT.
- Pure online — circuit split as theme. Whether a purely online service is a “public accommodation” is not a settled national yes/no. Design one accessible transaction across customers rather than betting the product on the circuit. Counsel memos the forum; engineering doesn’t ship an “ADA N/A because SaaS” flag.
- Vendor components are in scope. Calendars, payment iframes, consent banners, chat embeds — gate them in change review; test in situ; prefer native controls. A procurement assurance is an input with a route to fix, not a cure.
- Alternatives evaluated honestly. Hours, delay, privacy, cost, capability. A phone number beside a broken flow is not the duty met.
- Don’t conflate Title II. Public-entity DOJ web deadlines are a different machine from private Title III ecommerce.
State-law analogues may sharpen damages exposure. That’s counsel’s matrix — but it’s why “injunction-only vibes” are a poor eng assumption in some states.
Review this with counsel and eng on the same call. If Side A matches production, you’re still in the memo-to-coders handoff.
Side A — What loses (green scan, broken purchase)
What goes wrong: CI runs axe on the marketing shell. Checkout uses a fashionable custom date picker from a vendor. Payment errors are a red outline. Confirmation is a confetti animation with the order number only in an image. Cancel instructions say “call during business hours.” The accessibility confluence page shows last quarter’s WAVE PDF. Product proposes the footer phone number as the ADA plan. Counsel is told “we’re pure online, so Title III probably doesn’t apply” by someone who read a tweet about the circuit split.
Why the task cares: The customer never completes choose or pay. The scan never walked the vendor iframe. The phone line can’t configure the same SKU after 6 p.m. WCAG poster on the wall doesn’t announce the payment failure. The circuit-split tweet isn’t a jurisdiction memo.
Lawyer lens — what I’d ask on the call: You need a written journey scope, a regime memo that uses Robles carefully (and distinguishes pure-online unsettled risk), and evidence of AT test runs — not a badge. Unruh-style state claims may be riding along. Title II deadlines don’t belong in this private-stack deck.
Engineer lens: If the release train can go green without a keyboard-only checkout and a screen-reader log for pay + cancel, the gate is theater. If vendor upgrades skip change review, you re-broke last quarter’s fix. If focus never moves to the error, AT users are stuck in a silent failure loop — the same loop chargeback and goodwill teams will see as “customer confusion.”
Any hit means you don’t ship yet.
Non-compliance checklist (red flags)
- Scanner-green as the only checkout ship criterion
- Vendor calendar / modal / iframe not tested in situ with AT
- Price or error state only visual
- Phone-only alternative as the ADA plan
- Cancel harder than purchase (or phone-only cancel)
- Terms / consent not associated with the bind control under AT (Chapter 2)
- “Pure SaaS → ADA N/A” without counsel’s circuit-aware memo
- Title II public-entity rule pasted onto Title III private ecommerce
- WCAG marketed as finished compliance with no task evidence
- Defect “fixed” on one control without full-task retest
Side B — What works better (task gates + AT evidence)
What works better: Counsel and product name the journeys. Each release records scanner and manual keyboard / AT runs against find → price → choose → pay → confirm → cancel. Vendor widgets enter through a change-review gate with in-situ evidence — or they stay dark. Hosted payment fields are labelled; failures announce and move focus. Confirmation is text, not confetti-only. Cancel lives in the same dignity band as buy. Formation notices are readable with the agreeing control. Any phone / chat alternative is scored for hours, delay, privacy, cost, and capability — and is never the sole green path while the digital task fails.
WCAG version is written down as the working / remedy target. The regime memo states Title III / state-law posture and, for pure-online models, the unsettled split — then still ships the accessible task, because betting the circuit isn’t a product strategy.
Fixed user story: Journey scoped → regime + WCAG version memoed → scanner on transaction routes → vendor gated → AT full-task pass logged → defects retested on the whole task → counsel signs the evidence pack → promote.
Compliance checklist (green flags)
journey_scopenames task steps (not “be accessible”)
- Scanner necessary; full-task AT required
- Vendor component gate with in-situ AT
- Error + focus management proven
- Confirm + cancel in the same gate as pay
- Alternative-channel eval recorded if any alternative is claimed
- Formation / privacy controls AT-associated (Chapter 2 / LE-01)
- Pure-online split treated as theme / risk — not fake settled holding
- Title II not conflated with Title III
- Defect → full-task retest artifacts retained
Robles themes — use carefully
Walk the Domino’s story so nobody ships the wrong lesson into a pure-play app.
In Robles, a blind customer could not use the website or app with screen-reading software to order a customized pizza from restaurants that exist in the physical world. Domino’s argued due-process / wait-for-DOJ themes. The Ninth Circuit reversed dismissal: on those facts the site and app connected customers to the goods and services of physical restaurants; the statute supplied fair notice without a technical web blueprint from DOJ; primary-jurisdiction deferral was not the path; and WCAG remained available as a remedy a court could order (913 F.3d 898 themes).
Teaching translation:
| Takeaway | Not the takeaway |
|---|---|
| Physical + digital ordering stacks need a serious Title III design brief | Every website everywhere has identical coverage without counsel’s facts |
| “Wait for DOJ regs” is a poor release strategy | DOJ silence means no duty |
| WCAG is a practical remedy / build target | WCAG checkbox alone = automatic liability or automatic safety |
| Test the ordering task with the tools customers use | Homepage scan = checkout compliance |
For pure online services, say the quiet part aloud: courts split. One accessible design beats a forum bet. That’s risk management, not a holding.
Interface / code / data — one-page checklists
Run these as acceptance seeds — not as informal hunches. If you can’t export the Data row, you didn’t finish.
Interface (must-work): Keyboard-complete journey; name/role/value for controls; price associated with item; vendor choose-widgets operable; payment labels + announced errors + focus management; readable confirmation; cancel equal dignity; terms/consent associated with the bind control.
Interface (must-not): Scan-only ship; vendor excused by PDF assurance; silent payment failure; phone footer as the plan; WCAG badge without AT logs; “ADA N/A” sticker for pure SaaS without counsel memo.
Code: journey_scope gate; CI scanners on transaction + embeds; mandatory AT/keyboard accept tests (AT-01…AT-06 style); vendor change-review fail-closed; live regions / focus utilities on error paths; cancel route in the same promote criteria; no eng flag that disables accessibility work based on “no physical store.”
Data: at_run (AT product, browser/OS, operator, date); at_step_log per task step; scanner artifacts; vendor_component gate decisions; defect + retest full-task links; regime_memo_id; wcag_version; alternative_channel_eval when relied upon.
Lost vs fixed (scene card)
| Lost | Fixed | |
|---|---|---|
| Opening move | Badge the scan; ship | Scope the task; gate on AT |
| Choose | Custom vendor calendar AT-blind | Native control or in-situ AT pass |
| Pay | Red outline only | Announced error + focus move |
| Confirm | Confetti / image-only order # | Text confirmation AT-readable |
| Cancel | “Call us” | Equal-dignity manage path (or honest alternative eval) |
| Vendor | Assurance PDF on file | Change-review + in-situ test |
| Alternative | Footer tel: link | Hours/capability scored; digital still fixed |
| Doctrine | Tweet about circuit split | Counsel memo; still ship accessible task |
| Proof | WAVE PDF from Q2 | Per-release at_run + step logs |
Template: Lawyer / Engineer card
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
| Lawyer | Engineer |
|---|---|
| What journey is in scope for this release? | Is find→price→choose→pay→confirm→cancel encoded as accept tests? |
| Title III / state law / pure-online split — memoed without overclaim? | Any “ADA N/A” hardcodes removed pending counsel? |
| Does Robles fit our facts, or must we distinguish? | Are physical-store and app routes both in the test matrix if we have them? |
| WCAG version as remedy target — which, and who owns exceptions? | Scanner in CI and AT evidence attached to the promote? |
| Vendor assurances — input or pretended cure? | Change-review block until in-situ AT passes? |
| Is phone/chat actually capable of the same transaction? | Can digital task pass without relying on the phone path? |
| Are formation notices associated under AT (Chapter 2)? | Does the screen reader announce the notice with the bind control? |
| Full-task retest after each defect? | Is retest linked to defect_id, not “fixed CSS”? |
Try this on your product tomorrow
Screenshots and exports beat opinions.
- Pick one real SKU. Attempt checkout with keyboard only. Note the first trap.
- Repeat with a screen reader your AT vendor supports. Log find / price / choose / pay / confirm.
- Induce a payment failure. Does anything get announced? Where is focus?
- Finish a purchase, then cancel (or start cancel). Equal dignity?
- List every third-party embed on the path. Which ones have in-situ AT evidence for this build?
- If someone points at the footer phone number, fill hours / delay / privacy / cost / capability in one line each. Still want that as the plan?
- Ask counsel whether your pure-online coverage story is a memo or a vibe. Either way, keep shipping the accessible task.
Where this goes next
Keep the loop moving — Law → Interface → Code → Data → Counsel sign-off.
- Tips, matching & incentive self-dealing — Chapter 16D (LE-63).
- Formation / notice associated with the agreeing control — Chapter 2 (LE-01).
- Payments, MCC, chargeback evidence — Chapter 10 (LE-26).
- Ecommerce authenticity / returns / pricing / loyalty — Chapter 16 (LE-48…LE-51).
- Chance overlays at checkout — Chapter 16B (LE-54) — classification and AT operability.
- Cookie / CMP banners that trap the journey — LE-08 adjacency.
- CIPA session replay is not this chapter — Chapter 4B (LE-53).
- Operating model / release gates — Chapter 31. Pattern Map — Chapter 32. LE title index — Chapter 33.
Field rule — put this on the release checklist: The scan measures pages; the customer and Title III care about tasks. WCAG is a remedy theme and working standard — not a magic checklist. Phone-only isn’t the duty met.
This chapter is for education and discussion. It isn’t legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
This chapter is for education and discussion. It is not legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
Chapter 16D — Worked Example: Tips, Matching & Incentive Self-Dealing
Pattern family: Incentive / tip / matching self-dealing & multi-account abuse (LE-63). Sits after accessible checkout (LE-57; Chapter 16C) and beside ecommerce loyalty / promo abuse (LE-51; Chapter 16). Payments / fraud adjacency (LE-26 / LE-39; Chapter 10).
Legal anchors (themes): Unfair / deceptive practices themes when tip matching, bonus pools, or “support creators” incentives are gamed into self-dealing; payments and card-network fraud / misrepresentation themes when multi-accounting manufactures volume; contract / ToS enforcement; AML/sanctions adjacency when payouts loop (LE-34 themes); advertising honesty when match funds are marketed as altruistic. Distinct from ecommerce loyalty points abuse (LE-51) — same abuse shape, different product surface (tips/matching vs coupons/points).
As of September 2026: Verify current Brand / Acquirer fraud expectations and your counsel’s UDAP read before encoding thresholds as “required by the card brands.”
Why this memo exists
Self-dealing and tip-match abuse destroy trust and invite claims. Detect, cap, log, escalate.
The story in one glance
Picture a live tip jar with a generous Brand match: “We’ll match tips to creators this weekend.”
A user opens Account A (payer) and Account B (creator). A tips B. The match fund doubles it. B cashes out. Sometimes A and B share a device farm, KYC vendor face, or funding instrument. Growth celebrates match engagement. Finance sees mysterious match burn. Trust & Safety finds a graph of self-tips. Marketing still shows the altruistic match story.
This isn’t “loyalty points stacking” (LE-51) — though you should steal the discipline, not the layout. It’s incentive self-dealing: multi-account tip-to-self and match-fund abuse.
Walk one matched tip that looks too perfect. Ask: can the same beneficial owner sit on both sides? Did match credit post before any related-account check? If Growth celebrates and Finance panics, you already know the answer.
Teach friction, disclosures, heuristics, terms, and enforcement — with payments Chapter 10 on the bench.
Plain English — who is paying whom?
| Pattern | What happens | Harm themes |
|---|---|---|
| Tip-to-self | Same beneficial owner tips their own creator account | Fake engagement; match theft; misleading popularity |
| Match farming | Manufactured tips trigger platform/Brand match pools | Fund depletion; deceptive marketing of match |
| Ring abuse | Coordinated multi-account webs | Fraud / AML signals; ToS evasion |
| Instrument reuse | Same card/wallet funds “donor” and receives payout | Payments fraud adjacency (LE-39) |
Field rule — put this on the release checklist: If the beneficial owner can sit on both sides of a tip or match without friction, you built a rebate machine — not a generosity feature.
Remember: a Law Engineer is a licensed attorney with software and product expertise.
What the law / program is asking the product to do (themes)
- Define prohibited self-dealing in ToS / program rules with plain examples.
- Beneficial-owner linkage across payer/creator using KYC vendor signals, devices, instruments — proportionate and privacy-aware.
- Anti-abuse heuristics before match credit posts (not only after payout).
- UI friction + disclosures — match eligibility, review holds, “tips from related accounts may be reversed.”
- Enforcement — reverse, clawback, suspend; appeal path.
- Distinct from LE-51 — share graph features where useful; don’t pretend coupon logic covers tip match.
- Payments evidence — join tip/match events into dispute packs (LE-26) when chargebacks follow manufactured volume.
Review this with counsel and eng on the same call. If Side A matches production, you’re still in the memo-to-coders handoff.
Side A — What loses (“match go brrr”)
What goes wrong: Match posts instantly. No graph checks. KYC is checkbox. Creators boast about “matching yourself.” Marketing claims “100% of tips matched to creators” while silent self-deal volume dominates. Enforcement is a spreadsheet after the campaign. Chargebacks arrive without tip-graph evidence.
Why this matters in court / before a regulator: Deceptive engagement and fund diversion are UDAP and Brand-risk stories. Payments teams inherit the mess (Chapter 10).
Lawyer lens — what I’d ask on the call: Program rules + disclosure + enforcement record — not a growth meme.
Engineer lens: If match_credit ignores related_account_score, you automated self-dealing.
Any hit means you don’t ship yet.
Non-compliance checklist (red flags)
- Instant match with no linkage checks
- Same instrument / device freely tips self
- Marketing match claims without abuse carve-outs
- No clawback / appeal path
- Loyalty (LE-51) tooling blindly reused without tip-specific rules
- Chargeback packs lack tip/match event ids
- Employee names or client Brand folklore in runbooks
Side B — What works better (graph → hold → disclose → enforce)
What works better: Tip state machine: authorized → abuse_screen → match_eligible → posted. Linkage service uses KYC vendor identity graph, device, funding instrument — counsel-approved features.
High scores → hold match, notify user with plain disclosure. Terms ban self-dealing and rings.
Campaign dashboards separate organic vs held. Clawback jobs + appeal.
LE-26 export includes tip_ids / match_ids / graph_decision_ids. Cross-ref LE-51 for shared promo-abuse heuristics without merging products.
Fixed user story: User tips → screen → related-account hold on match → disclosure → either clear after review or reverse → payout only on cleared funds → metrics honest.
Compliance checklist (green flags)
- ToS/program rules define self-dealing
- Pre-match abuse screen with versioned heuristics
- UI disclosure on holds / ineligibility
- Clawback + appeal logged
- Marketing claims match measurable reality
- Payments export joins tip/match/graph events
- LE-51 cross-ref without schema collapse
Template: Lawyer / Engineer card
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
| Lawyer | Engineer |
|---|---|
| What counts as self-dealing / ring abuse? | Heuristic rules_version counsel-signed? |
| What must users see when match is held? | Hold UX + reason codes? |
| Are match marketing claims still true? | Dashboards split organic vs held/reversed? |
| Clawback legal basis in terms? | Clawback job + notice events? |
| Chargeback readiness? | LE-26 bundle includes tip/match/graph ids? |
Interface / code / data — one-page checklists
Run these as acceptance seeds — not as informal hunches. If you can’t export the Data row, you didn’t finish.
Interface (must-show): Tip confirm; match eligibility state; hold reasons; program rules link; appeal entry.
Interface (must-not): Silent match on related accounts; “guaranteed match” when holds exist; dark-pattern pressure to tip.
Code: tip/match state machine; related_account_score; pre-match gate; clawback; appeal; campaign kill switch; LE-26 join.
Data: tip_events; match_events; graph_decisions; clawbacks; appeals; rules_versions; links to kyc_subject_ids (KYC vendor tokens).
Lost vs fixed (scene card)
| Lost | Fixed | |
|---|---|---|
| Self-tip | Match posts | Hold / deny match |
| Marketing | “Always matched” | Honest eligibility |
| Enforcement | After-party spreadsheet | Real-time screen + clawback |
| Payments | No graph in dispute pack | LE-26 joins tip/match/graph |
Try this on your product tomorrow
Screenshots and exports beat opinions.
- Create two staging accounts with shared instrument/device — does match hold?
- Read match marketing — does it disclose review/hold?
- Export a tip that charged back — graph decision id present?
- Confirm LE-51 promo tools aren’t the only control on tip match.
- Kill-switch the match campaign — posts stop?
Where this goes next
Keep the loop moving — Law → Interface → Code → Data → Counsel sign-off.
- Accessible checkout — Chapter 16C (LE-57).
- Loyalty / promo abuse — Chapter 16 (LE-51) — sibling discipline.
- Payments / MCC / fraud — Chapter 10 (LE-26 / LE-39).
- Creator KYC — Chapter 13 (LE-28).
- Pattern Map LE-63 — Chapter 32.
Field rule — put this on the release checklist: Match funds and tip incentives need a beneficial-owner story — not only a celebration counter.
This chapter is for education and discussion. It isn’t legal advice. Distinct from LE-51 loyalty abuse; cross-reference, don’t collapse. No client Brand names or employee names in this teaching reconstruction.
This chapter is for education and discussion. It is not legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
Chapter 17 — Worked Example: Influencer Program Operating System
Pattern family: Influencer Program OS (LE-52) — wiring endorsement disclosure (LE-18), affiliate-style KYC gates (LE-19), creator onboarding + NIL (LE-28/29), AML practice controls when payouts warrant (LE-33/34), and continuous monitoring cousins (LE-37) into one loop: onboard → clear → disclose → listen → legal alert → kill switch.
Legal anchors (themes): FTC Act § 5, 15 U.S.C. § 45(a); FTC Endorsement Guides, 16 C.F.R. Part 255 (revised 2023)—§§ 255.5 / 255.0(f) / 255.1(d),(f); affiliate Example 11; FTC v. LeadClick Media, LLC, 838 F.3d 158 (2d Cir. 2016) and FTC v. Credit Bureau Center, LLC, 325 F. Supp. 3d 852 (N.D. Ill. 2018) themes already in Chapter 8; NIL / right-of-publicity themes already in Chapter 13. KYC/KYB/AML here are practice controls—not a money-services claim unless counsel says the client is otherwise regulated.
As of September 2026: Re-check eCFR Part 255, staff FAQ disclosure language, and your counsel’s tier matrix (gift vs paid vs high-risk vs fintech-like payouts) before shipping templates or auto-holds.
Why this memo exists
Influencer programs need contracts, #ad disclosures, payouts, and takedown paths that actually run.
FTC endorsement themes care about clear disclosure and material connections. Track the relationship; enforce the disclosure.
The story in one glance
Monday morning at a brand that “already has an influencer program.”
Legal emailed a polished Influencer Agreement last quarter. Marketing opened a portal. Creators clicked Join. Tracking links minted the same afternoon. Posts went live with a quiet bio-only “#ad.” Paid ads reused a creator’s face because “they agreed to program terms.” Nobody crawled the live posts. When a rogue lander showed up, finance kept paying. Revenue felt sticky. Legal still had a PDF.
That’s paper compliance. The contract exists. The portal exists. The loop that matters doesn’t: monitor → legal/ops alert (with evidence) → kill switch.
Walk this chapter with one live creator open beside you. Ask three questions. Who cleared them before the link minted? What disclosure sat in the first visible region at publish? If monitoring flagged a bad post today, would links and commissions stop before the next payout batch?
Law Engineering’s answer is the program OS. It stitches Chapters 8 (affiliate KYC + #ad) and 13 (creator onboarding + NIL) into one continuous path — not a second copy of either.
Teaching reconstructions only. Not screenshots of any party’s live product and not exhibits. Cross-ref the affiliate figure mindset in Chapter 8 and the creator/NIL figure in Chapter 13 if you want visuals.
Why “we have an influencer agreement” isn’t enough
An agreement without gates is incomplete. A portal without listen is incomplete. Listen without a kill switch is a museum of screenshots.
| Layer | What it asks | Typical miss |
|---|---|---|
| Onboarding | Program terms clickwrap; tax/payment; risk rating | Instant links; browsewrap portal footer |
| KYC / KYB / AML (when warranted) | Know who you pay; screen; withhold tools until cleared | Gift-box lightness applied to CPA payouts; or MSB overclaim in UI |
| NIL / likeness | Scoped grant for channel, duration, paid-ads reuse | Mega-ToS = ads consent |
| Disclosure gates | Material connection clear & conspicuous at publish | Bio-only; first-comment-only; no snapshot |
| Automated social monitoring | Listen for missing disclosures, banned claims, brand-safety, off-script landers | Quarterly spreadsheet |
| Legal/ops alert queue | Tickets + evidence + SLA | Slack screenshots with no disposition |
| Kill switch | Suspend links, commissions, creatives when threshold clears | Soft “pause” that still accrues CPA |
Field rule — put this on the release checklist: Identity without disclosure is still deception. Disclosure without listen is hope. Listen without kill is incomplete.
Remember: a Law Engineer is a licensed attorney with software and product expertise. Engineers build these gates under that counsel’s oversight.
Review this with counsel and eng on the same call. If Side A matches production, you’re still in the memo-to-coders handoff.
Side A — What loses
Don’t ship this. If your current build matches Side A, stop the release train and fix it with counsel.
Agreements and portals without the loop
What goes wrong: Creator clicks “Join.” Tracking link appears. Campaign brief lives in email.
Disclosure “guidelines” sit in a Notion page. NIL is one sentence in Program Terms §14.
Monitoring is “we ask creators to tag us.” When a post ships without Paid partnership language — or a lander claims “clinically proven” the brand never substantiated — legal opens a ticket in a general CS queue.
Finance’s next payout batch still includes the creator. Growth points at a clawback clause in the PDF.
Why § 5 / Guides themes care: Advertisers are expected to monitor endorsers (§ 255.1(d)). Material connections must be disclosed clearly and conspicuously (§ 255.5; § 255.0(f)).
Networks and merchants that keep benefiting after notice of deceptive formats invite participation/control and ratification themes (LeadClick / Credit Bureau Center — see Chapter 8).
Clawback prose without a kill API is a litigation hope.
Lawyer lens — what I’d ask on the call: If you can’t show who was cleared, what disclosure appeared at publish, when monitoring flagged the post, and whether links and pay stopped, you have a binder — not a program. When an AG letter or CID asks for that story, the exportable packet is the answer — not a PDF agreement alone.
Engineer lens: If tracking_link mints while approval_state is pending, or publish succeeds with disclosure_present=false, or payouts ignore legal_hold, the stack is incomplete.
Any hit means you don’t ship yet.
Non-compliance checklist (red flags)
- Tracking links or paid campaign assignment before clearance
- Gift-tier lightness applied to commission / CPA creators
- Bio-only or first-comment-only #ad for main-caption endorsements
- No immutable disclosure snapshot at publish
- Paid UA reuse of likeness without scoped NIL /
paid_ads_reusegrant
- No automated listen for missing disclosure, banned claims, brand-safety, off-script landers
- Alerts without evidence snapshots or SLA
- Finance pays after legal flag; soft pause still attributes commissions
- Product copy claiming “MSB/AML certified” without counsel-owned regulatory posture
Side B — What works better (the program OS)
Here is the mentor walk. Build seven layers. Skip one and the loop breaks.
1. Onboard wizard (always)
Versioned program terms clickwrap before tools unlock. Tax/payment status when money moves. Risk questionnaire (methods, verticals, prior terminations, sample posts). State machine: applied → pending_* → cleared|rejected|suspended. Same evidence instincts as formation clickwrap and Chapter 8 onboarding.
2. KYC / KYB / AML — counsel tier matrix (not one size)
Encode a tier. Don’t invent law in the UI.
| Tier | When | Depth before links / paid campaigns |
|---|---|---|
| A — Seeded gift / PR | Product seed; no commission; low claim risk | Light identity + terms; still disclosure when posts endorse |
| B — Paid / commission | Flat fee, CPA/CPC, tracking links | LE-19-class KYC/KYB + sanctions + risk rating before links |
| C — High-risk / regulated claims | Health, finance, crypto, dating “success,” adult, etc. | B + EDD + sample creatives + claim pack approval |
| D — Fintech-like payouts | Nested payees, crypto rails, high-velocity cross-border | Counsel-directed LE-33/34 practice depth — product does not self-declare MSB |
Gate: no tracking_link / paid campaign unlock until approval_state clears the tier’s predicates.
3. NIL / likeness releases (when ads reuse exists)
Separate module from hosting or “post for this campaign.” Scope: channels, duration, territories, paid-ads reuse, synthetic/voice default off. Version hash + revoke → kill jobs for active creatives (Chapter 13 / LE-29 themes). Organic campaign post ≠ brand UA consent.
4. Disclosure gates (reuse Chapter 8 / LE-18)
Composer requires approved template (#ad, Paid partnership, seeded-product language). Placement in the first visible region; modality-matched for stories/video. Publish API 422 without template + placement when requires_disclosure=true. Snapshot text + viewport archive.
5. Automated social monitoring (the differentiator starts here)
Jobs crawl or listen (platform APIs, tagged URLs, approved handle lists — counsel + vendor architecture) for:
- Missing or weak disclosures
- Banned / unsubstantiated claim lexicon
- Brand-safety categories
- Landers that drift from the approved set
Hits write evidence snapshots (URL, capture time, hash, excerpt).
6. Legal / ops alert queue
Every actionable hit becomes a ticket: severity, SLA, assignee, influencer_id, campaign_id, snapshot. Dispositions: notify creator, hold pay, kill, escalate, false-positive. Timeline is immutable. Slack can notify; it can’t be the system of record.
7. Kill switch
When counsel-set threshold clears (or dual-control confirms): disable tracking links, hold commissions, pull creatives from allowlists, enqueue NIL ad-set kills if paid reuse is in scope. Finance batches must honor the same hold flag. Soft “pause” that still accrues CPA is a failure mode — not a feature.
Compliance checklist (green flags)
- Links 403 until tier clearance
- Publish blocked without disclosure when required; snapshots prove placement
- NIL ads path refuses creators without live paid-reuse grant
- Monitor jobs running; alert inbox has SLA clocks
- Confirmed hit → links/pay/creatives stopped with a
kill_eventrow
- Counsel can export one influencer packet: onboard + KYC refs + NIL + posts + hits + alerts + kills
Interface / code / data — one-page checklists
Run these as acceptance seeds — not as informal hunches. If you can’t export the Data row, you didn’t finish.
| Interface | Onboard wizard (terms, tax/pay, risk, status); tier badge; disclosure composer + preview lint; NIL scope module + revoke; legal alert inbox with snapshots and SLA; kill-switch confirm listing blast radius (links / commissions / creatives) |
| Interface must-not | Instant links; pre-checked terms or ads grant; bio-only disclosure as the whole story; Slack-only “monitoring”; kill UI that finance/link services ignore |
| Code | Mint/assign gated on approval_state + tier tokens; publish requires disclosure metadata; monitor → alert with SLA; kill APIs 403 links + hold ledger + creative allowlist; payout batch excludes holds; NIL allowlist for paid reuse |
| Data | influencer_id, kyc/kyb (and aml when in scope) status, nil_release_version, campaign_id, monitor_hit evidence, alert_id, kill_events, commission holds |
Template: Lawyer / Engineer card
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
| Lawyer | Engineer |
|---|---|
| Can we show clearance before links and paid campaigns? | Does mint/assign 403 while pending_*? |
| Are disclosures clear & conspicuous and monitored? | Publish gate + listen job + snapshot on every hit? |
| After notice of a bad post/lander, did benefit stop? | Kill switch + payout hold within SLA — with audit rows? |
| Was paid-ads reuse separately granted and scoped? | Does UA builder require live paid_ads_reuse NIL? |
| Is AML depth matched to payout reality — not paper compliance or overclaim? | Tier matrix encoded; no “MSB certified” chrome? |
| Can we export one packet ready for counsel’s response to an AG letter or CID? | Onboard + KYC + NIL + posts + alerts + kills in one zip? |
Try this on your product tomorrow
Screenshots and exports beat opinions.
- Applicant still
pending_kyc— can you mint a tracking link or assign a paid campaign? If yes, stop.
- Paid publish with disclosure deleted → 422? Snapshot written when present?
- Inject a fixture post missing
#ad— does an alert with evidence appear before the SLA dies?
- Confirm a rogue lander — do links 403 and commissions hold within minutes? Does finance’s next batch exclude them?
- Attempt paid UA reuse with hosting-only / no NIL paid-reuse grant — builder must refuse.
- Export one influencer OS packet. Missing listen → alert → kill rows means you still only have an agreement.
Where this goes next
Keep the loop moving — Law → Interface → Code → Data → Counsel sign-off.
- Affiliate KYC + disclosure twin — Chapter 8 (LE-18/19).
- Brand / trademark usage for creators & affiliates — Chapter 17B (LE-77).
- Creator onboarding + NIL twin — Chapter 13 (LE-28/29).
- Deeper AML when payouts require it — LE-33/34 Pattern Map rows.
- Continuous NIL / AI-output monitoring cousin — LE-37.
- CAN-SPAM / TCPA when others mail or text “on your behalf” — LE-20/21.
- Operating model / release gates — Chapter 31. Pattern Map LE-52 — Chapter 32.
This chapter is for education and discussion. It is not legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
Chapter 17B — Worked Example: Brand & Trademark Usage for Creators/Affiliates
Pattern family: Brand / trademark usage policy for creators & affiliates (LE-77). Sits after influencer program OS (LE-52; Chapter 17). Stitches marketing guidelines (LE-52) and nominative / authenticity themes (LE-48) lightly — not a full trademark treatise.
Legal anchors (themes): Allowlisted marks and assets; prohibited claims; takedown / kill when misuse; clear rules so creators and affiliates don’t imply sponsorship, alter marks, or run ads that confuse source.
As of September 2026: Generic Brand. No client mark specimen dumps.
Why this memo exists
Nominative fair use isn’t a free-for-all. Publish rules; gate assets; keep examples of what you allowed.
The story in one glance
Affiliates cloning the Brand wordmark into “official” landers.
Creators stitch the logo onto merch the Brand never approved. Ads claim “#1 rated by Brand doctors.” Nominative fair-use references in honest reviews get mixed with counterfeit kits. When Legal sends a cease-and-desist, Growth can’t kill creatives by asset_id because nothing was allowlisted.
Ship a usage OS: allowlist, claim bans, monitoring, kill — wired to influencer/affiliate controls.
Picture a creator post that pastes your logo into a political meme. Ask: did brand-usage gates and a kill path exist — or only a trademark section in a PDF?
Plain English — allowlist + kill
| Control | Meaning |
|---|---|
| Allowlisted marks/assets | Approved logo/wordmark/kit versions with asset_id + usage rules |
| Prohibited claims | Superlatives, fake awards, implied employment/sponsorship |
| Nominative lane | Honest referential use themes (LE-48) — counsel-scoped, not a blank check |
| Takedown / kill | Misuse → creative suspend + commission hold (LE-52 / LE-19) |
| Guideline pack | Versioned creator/affiliate brand guide joined to program OS |
Field rule — put this on the release checklist: If anyone can download a logo zip from a 2019 Drive folder, you don’t have brand usage control.
Remember: a Law Engineer is a licensed attorney with software and product expertise.
Review this with counsel and eng on the same call. If Side A matches production, you’re still in the memo-to-coders handoff.
Side A — What loses (“logo in Drive”)
What goes wrong: Stale asset zip. No claim list. Affiliates run lookalike domains. Monitoring is brand-team eyeballing. Kill means “send Slack.” Nominative and counterfeit confused in macros. No join from creative_id to asset_id.
Any hit means you don’t ship yet.
Non-compliance checklist (red flags)
- Unversioned logo distribution
- No prohibited-claims list in lint
- No kill path to links/commissions
- Lookalike landers stay paid
- “Fair use” waved at every scrape
- Guideline PDF not version-joined to posts
Side B — What works better (allowlist → lint → listen → kill)
What works better: Brand asset registry with asset_id, permitted contexts (social, paid, packaging), alteration bans. Composer / affiliate creative upload lints for unallowlisted marks and prohibited claims. Program guidelines version (brand_guide_version) required on paid campaigns (LE-52). Monitoring samples for lookalike / misuse; legal alert; kill switch stops links and holds pay (LE-19). Nominative / authenticity paths documented with LE-48 without overclaiming fair use. Agreement factory (LE-76) can attach brand schedule.
Compliance checklist (green flags)
- Allowlisted assets only in kits
- Claim lint on paid creatives
- brand_guide_version on campaigns
- Misuse → kill + hold
- Nominative guidance counsel-scoped
- Exportable misuse case packet
Template: Lawyer / Engineer card
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
| Lawyer | Engineer |
|---|---|
| Which marks/assets are approved for which contexts? | Registry + context flags? |
| What claims are categorically banned? | Lint dictionary versioned? |
| When is nominative use OK? | LE-48 playbook linked — not auto-approved? |
| How fast can we kill misuse? | Creative + link + commission join? |
| Is the brand guide version binding on affiliates? | Assent / program OS join? |
Interface / code / data
Interface: Asset kit portal (current only); claim do/don’t examples; misuse appeal; takedown status.
Code: asset registry; upload lint; monitoring hooks; kill switch joins affiliate/influencer OS; guide version gate.
Data: brand_assets; brand_guide_versions; creative_asset_links; claim_lint_hits; misuse_cases; kill_events.
Lost vs fixed
| Lost | Fixed | |
|---|---|---|
| Assets | Stale Drive zip | Versioned allowlist |
| Claims | Hope | Lint + dictionary |
| Enforcement | Slack plea | Kill + hold |
| Nominative | Magical shield | Counsel-scoped LE-48 |
Try this on your product tomorrow
Screenshots and exports beat opinions.
- Download kit — only current
asset_ids?
- Upload creative with altered wordmark — lint fail?
- Fixture lookalike lander — monitoring alert + kill path?
- Confirm paid campaign stores
brand_guide_version.
- Export one misuse packet (creative, asset rule, kill event).
Where this goes next
Keep the loop moving — Law → Interface → Code → Data → Counsel sign-off.
- Influencer program OS — Chapter 17 (LE-52).
- Affiliate KYC + disclosures — Chapter 8 (LE-18 / LE-19).
- Authenticity / nominative themes — Chapter 16 (LE-48).
- Agreement factory brand schedules — Chapter 2C (LE-76).
- Pattern Map LE-77 — Chapter 32.
Field rule — put this on the release checklist: Brand usage is allowlist + kill — not a PDF logo sheet.
This chapter is for education and discussion. It isn’t legal advice or a trademark opinion. No client marks are reproduced in this teaching reconstruction.
This chapter is for education and discussion. It is not legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
Chapter 18 — Worked Example: Repeat Infringer / Repeat NCII Abuser Policy-as-Code
Pattern family: Repeat infringer / repeat NCII abuser policy (LE-16); fed by DMCA intake (LE-15 / Chapter 9) and optional NCII class (LE-12 / Chapter 20)
Legal anchors: 17 U.S.C. § 512(i)(1)(A)—adopt and reasonably implement, and inform users of, a policy providing for termination in appropriate circumstances of repeat infringers; § 512(i) STM clause is separate. Themes: BMG Rights Mgmt. (US) LLC v. Cox Commc’ns, Inc., 881 F.3d 293 (4th Cir. 2018) (policy eviscerated in practice); EMI Christian Music Grp. v. MP3tunes, 844 F.3d 79 (2d Cir. 2016) (repeat infringer not limited to adjudicated); Motherless, 885 F.3d 597 (9th Cir. 2018) (reasonableness ≠ perfection); In re Aimster, 334 F.3d 643 (7th Cir. 2003).
As of September 2026: Cox Communications, Inc. v. Sony Music Entertainment, 607 U.S. ___ (Mar. 25, 2026), narrowed contributory themes for conduit ISPs—it does not erase a UGC host’s need for a real § 512(i) program. Courts have not mandated a universal “three strikes” number. Keep copyright strikes separate from NCII / ToS abuse classes in any harbor export.
When “we terminate repeat infringers” is only poetry
In cases where a company lost DMCA safe harbor because it did not terminate repeat infringers, the lesson is not a better Terms paragraph. You need to track the program and present it in evidence when harbor is on the line. A court asks: show me the terminations. Show me the strikes. Show me that high-ARPU accounts actually die when the ladder says they die.
What goes wrong: A host says “we terminate repeat infringers.” Ops never does. Top spenders stay immortal behind a silent VIP flag. Support macros reactivate accounts and wipe the counter. Copyright and NCII share one blob. When counsel needs a harbor export, the evidence is a ToS paragraph and a Slack thread. Themes in BMG v. Cox and related § 512(i) cases keep returning to policy that was eviscerated in practice — treat those as orientation; re-check holdings with counsel for your facts.
What works better: a versioned public policy, append-only strike events from DMCA intake (and a separate NCII class), a warn → restrict → terminate ladder that actually runs, audited exceptions, and an exportable ledger for § 512(i) proof — the pack you’d attach when harbor is on the line.
Ask of the top-spender account with three copyright strikes: does the ladder actually terminate, or does a silent VIP flag keep them immortal? Answer from the database — not from hope.
Why this is an engineering problem
If your product hosts user uploads, “we terminate repeat infringers” has to become a ledger you can show a court — not Terms poetry you pasted in 2019.
Harbor eligibility cares whether you told users about a termination policy, ran it in appropriate circumstances, and can prove the run. A slogan like “we take IP seriously” is not a ledger. I’ve lived both sides of internet copyright fights long enough to distrust slogans. Platform process is where theory meets a clock and a hash sweep — track the program, or lose the harbor story when you need it.
Keep copyright strikes separate from NCII / ToS abuse. Harbor exports care about that distinction.
| Stage | What statute / practice asks | Typical miss |
|---|---|---|
| Inform | Users know repeat infringers may be terminated | Buried ToS clause; no strike / termination notices |
| Strike write | Qualifying events attach to accounts immutably | Slack notes; counters reset on support macros |
| Thresholds | Versioned rules counsel owns (N in window W) | Hard-coded “3” with no policy_version; VIP skip |
| Ladder | Warn / restrict / terminate actually run | Soft-warn forever; revenue silent bypass |
| Export | Policy text + hashes + strikes + terminations + exceptions | Archaeology across Zendesk and Discord |
Field rule: Informed policy → append-only strikes by class → versioned thresholds → real ladder → audited exceptions → export pack. Skip a link and the § 512(i) story breaks. Track it. Present it. Design that evidence well in advance.
Side A — What loses
ToS poetry and the immortal VIP
Here’s the lose pattern. Terms say “we terminate repeat infringers.” Ops never does. A do_not_ban flag protects top spenders. Support macros reactivate accounts and zero the counter. Counsel cannot show a single termination in the last year.
Why it fails (themes): BMG themes — policies that never bite are not reasonably implemented. § 512(i) requires informing and implementation; a dead-letter paragraph fails both. Silent VIP skips without an audited exception row are the textbook anti-pattern. This is exactly how companies lose the safe-harbor story: they had a policy on paper and no tracking in the stack.
Lawyer lens: Harbor loss ≠ automatic liability (§ 512(l)) — but you still want the harbor when facts allow. Do not overread Cox (2026) as permission to skip host § 512(i) work. When you walk into the motion, you need the ledger — not a paragraph.
Engineer lens: If termination is a spreadsheet cell, not account.status=terminated_repeat_infringer with login/API kill, you built a memo — not a policy.
One counter for everything; no human hooks
Pattern: Spam, copyright, and NCII share strikes_total. A deficient DMCA notice still increments. First match from a fingerprint job auto-terminates. Appeals are “email support” with no decision log.
Why it fails (themes): § 512(i) is copyright-focused. NCII / intimate-image enforcement is a separate policy choice (ToS / state NCII / TIDA ops) — useful, but do not export NCII counts as if they were § 512(i) proof. Automatic bans on low-confidence matches without review create contract/UDAP and false-positive risk. Threshold numbers are unsettled — document and apply consistently; do not invent a court-required “three.”
Lawyer lens: Define what events create copyright strikes (e.g. substantially compliant notice + removal). Keep classes distinct in discovery exports.
Engineer lens: Without class=copyright|ncii and policy_version on every strike, counsel cannot rebuild the story for evidence.
Non-compliance checklist (red flags)
- No public / help-center summary of the ladder; signup never records policy ack
- Strike ledger mutable or support-clearable without appeals path
- High-revenue / partner flag silently skips threshold evaluation
- Auto-reactivation macros that wipe strikes
- Copyright and NCII collapsed into one harbor export column
- Strikes on deficient notices without a documented rule
- Termination notice with no appeal channel or no decision actor logged
- No export pack you could attach to a declaration or harbor brief
Side B — What works better
Policy-as-code that can survive a harbor motion (LE-16 theme)
Here’s what I want you to build — collaboratively, counsel owning legal meaning, eng owning the ladder:
- Publish and inform: Help Center + ToS summary — what counts as a strike, approximate thresholds, termination, appeal. Signup stores
repeat_policy_version_ack. Public statement that repeat copyright infringers are terminated in appropriate circumstances.
- Strike events by class: Qualifying DMCA removal (LE-15 / Chapter 9) → append-only
strike_eventwithclass=copyright,source_id,policy_version. Optional upheld NCII removal (LE-12 / Chapter 20) →class=nciion a separate counter. Fingerprint assists (LE-35 / Chapter 19) create review events unless counsel’s rule says a confirmed match may mint a strike.
- Versioned thresholds: Rules engine reads
abuse_policies(thresholds jsonb, text_hash, effective_at, counsel_signoff). Example shape counsel sets: N copyright strikes in window W → warn; N+1 → restrict; N+2 → terminate. Encode grace and strike expiry if counsel allows — document, do not freestyle.
- Warn / restrict / terminate ladder: Warn = notice + policy link. Restrict = upload / monetize / payout limits. Terminate = disable login/API; retain records; freeze payouts where creator rails apply.
- Human review hooks — no silent revenue skip: Exception requires
counsel_or_trust_lead_id+ reason code + optionalexpires_at; logged inpolicy_exceptions. Attempted bypass without a row fails closed.
- Appeals: Logged channel; decision stores actor and whether strikes reset or retain per policy. No support macro that “just turns them back on.”
- Exportable ledger: Policy markdown hashes, informing proofs, strike rows by class, terminations, exceptions, appeals — multi-year retention (counsel; often align with DMCA harbor proof). Prefer write-once (WORM) / append-only. This is the evidence pack. Track it so you can present it.
Adult UGC follows the same ladder (Motherless themes — adult ≠ inherently infringing). Dating / creator stacks often want a faster NCII track — still keep classes distinct.
Compliance checklist (green flags)
- Policy version ack at signup; strike notices cite
policy_version
- Copyright strikes only from documented qualifying events
- NCII class separate; harbor export filters
class=copyright
- Threshold hit enqueues real restrict/terminate jobs
- VIP path requires audited exception row — or fails
- Appeal decisions attributable; reactivation only via appeals path
- Counsel can export a full § 512(i) pack without Slack archaeology — ready for evidence
Template: Lawyer / Engineer card
Lawyer column = legal meaning. Engineer column = what must be true in the stack. Use this card in the kickoff.
| Lawyer | Engineer |
|---|---|
| Did we inform users of a termination policy for repeat infringers? | Do we store repeat_policy_version_ack and show Help Center copy that matches live policy_version? |
| What events mint a copyright strike — and are NCII strikes explicitly separate? | Does each qualifying DMCA removal append class=copyright with source_id? |
| Are thresholds versioned and counsel-signed — not folklore “three strikes”? | Does the rules engine read abuse_policies.thresholds + policy_version? |
| When thresholds hit, do we actually terminate in appropriate circumstances? | Hard disable login/API; retain records; no soft-ghost accounts? |
| Can high-value accounts skip the ladder only via audited exception? | Fail closed unless policy_exceptions row with approver + reason? |
| Can we prove the program in discovery / a harbor motion — track it and present it? | Export: policy hashes, strikes by class, terminations, exceptions, appeals? |
Interface / code / data — one-page checklists
Interface (must-show): Help Center / ToS summary of strike classes, approximate thresholds, termination, appeal; per-strike user notice with policy link + version; termination notice with appeal CTA; ops console showing strike count vs threshold, class, pending ladder action, exception flag.
Interface (must-not): Secret VIP never-ban without audit trail; one “abuse score” blob mixing spam, copyright, and NCII for harbor proof; auto-reactivate button that clears strikes; appeal dead-end.
Code: Append-only strike write on qualifying events; separate counters by class; versioned threshold evaluation; enqueue warn/restrict/terminate; kill login/API on terminate; exception gate requires approver; block silent revenue skip; appeals decision log; reject support macros that wipe the ledger.
Data: abuse_policies; strike_ledger (user_id, class, source_id, policy_version, created_at); terminations; policy_exceptions; appeals. Prefer write-once (WORM) storage. Retention: multi-year harbor / litigation hold per counsel. If you can’t export it, you didn’t finish the § 512(i) program.
Try this on your product tomorrow
- Export last 90 days of copyright strikes — do rows exist, or only ToS text?
- Pick a high-revenue account with ≥ threshold strikes — did ladder actions fire, or was there a silent skip?
- Attempt terminate without an exception row for a flagged VIP — does code fail closed?
- Confirm NCII strikes (if any) do not appear in the § 512(i) copyright export.
- Run appeal → decision with actor; confirm reactivation cannot happen via a generic “restore account” macro.
- Diff Help Center thresholds against live
policy_versionhash.
- Ask counsel: could we attach this ledger to a harbor brief next week?
If step 1 or 2 fails, you have Terms poetry — not a § 512(i) program. And poetry is how companies lose safe harbor when the court asks for tracking and evidence.
Where this goes next
Upstream: DMCA notice intake (LE-15 / Chapter 9). Parallel NCII class: state NCII reporting (LE-12 / Chapter 20) and TAKE IT DOWN (LE-11 / Chapter 5) — do not merge clocks. Fingerprinting (LE-35 / Chapter 19) may feed review or counsel-defined strikes — never replace statutory notice. ToS presentation (LE-01 themes) informs users; implementation still has to be real.
This chapter is for education and discussion. It is not legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
Chapter 19 — Worked Example: Automated Anti-Piracy / Fingerprinting Pipeline
Pattern family: Automated anti-piracy / fingerprinting pipeline (LE-35); subordinate to DMCA intake (LE-15 / Chapter 9) and repeat-infringer policy (LE-16 / Chapter 18)
Legal anchors: 17 U.S.C. § 512—notice/counternotice (LE-15) remain the statutory path; § 512(m) (no general affirmative monitoring duty as a harbor condition, subject to STM interplay); § 512(i) STM clause—no broadly adopted consensus that Content ID–style fingerprinting is a mandated “standard technical measure” on current practice. Inducement themes (Grokster / Fung-family): don’t design or market to foster infringement.
As of September 2026: Ship matching as rights ops + risk control, not as a substitute for the published agent and six-element notice form. Proactive tools may still matter commercially or to knowledge/control facts in litigation—those doctrines are distinct; counsel guides. Repeat-infringer duties (LE-16) still apply.
Why this memo exists
Fingerprints assist review — they don’t replace statutory notice. Log matches; don’t auto-terminate on vibes.
The story in one glance
Marketing ships “AI copyright protection.” Legal retires the DMCA form. Low-confidence matches auto-ban. Appeals go nowhere. When the matcher is wrong—or has never seen the file—there’s no statutory path left.
What loses — don’t ship this: “we have hashes so we deleted the DMCA form”; auto-ban on a low-confidence match; no appeal; no match→action evidence; marketing that winks at piracy.
What works better — build this with counsel: hash / perceptual-hash assist for ops; statutory DMCA path stays live; false-positive human review; auditable match→action ledger; kill switch for matched URLs; appeals with an SLA.
Picture a matched fingerprint at 2 a.m. Ask: does the pipeline disable and notify with an exportable clock — or wait for a human who is asleep?
Why this is an engineering problem
Fingerprinting can help ops move fast. It can’t replace the DMCA notice path—and it should not auto-ban people on a low-confidence “similar” score.
Matching at scale is a product capability. Safe harbor is a statutory process. Collapse them and you often lose both—the notice pipeline and the ability to defend automated takedowns when the matcher is wrong.
Wire matching as an assist: reference assets, scored match events, human review on the edge, a hard kill switch, and a live statutory notice form that still works when the matcher has never seen the file.
| Stage | What practice asks | Typical miss |
|---|---|---|
| Reference ingest | Rights holder registers assets + ownership attestation | Anonymous hash dumps; no owner contact |
| Match | Score + matcher_version + threshold on every event | Opaque “similar” with no replayable params |
| Action policy | Block / monetize / quarantine / leave-up+notice | One global auto-delete; no human edge queue |
| Statutory path | LE-15 notice still forces disablement | Form removed “because we have Content ID” |
| Appeal / evidence | Uploader sees basis; counsel exports match→action | Dark-pattern dead-end; Slack-only dispositions |
Field rule — put this on the release checklist: Reference → match event → versioned policy action → human review on edge → appeal → ledger. DMCA clocks stay source of truth. Automation assists; it doesn’t repeal § 512.
Side A — What loses
Don’t ship this. If your current build matches Side A, stop the release train and fix it with counsel.
Matcher as fake statute
What goes wrong: Product marketing says “AI copyright protection.” Legal retires the DMCA agent page. Ops treats every perceptual-hash hit as infringement. Low-score matches auto-terminate accounts. Counternotice calendars are ignored because “the system already decided.”
Why this matters in court / before a regulator: § 512(m) themes—harbor eligibility isn’t conditioned on a general duty to monitor. Fingerprinting is not, on consensus practice, a bright-line STM mandate under § 512(i). Retiring the statutory notice form trades a known harbor path for a vendor dependency. Auto-ban without review creates false-positive and contract/UDAP exposure. LE-15 put-back clocks remain law even when a matcher also fired.
Lawyer lens — what I’d ask on the call: Keep the designated agent and six-element form staffed. Decide in writing whether confirmed matches may mint LE-16 strikes—or only open review tickets.
Engineer lens: If piracy_actions lack matcher_version + threshold + actor, you can’t defend or unwind a bad day.
No kill switch, no false-positive path
What goes wrong: Matched CDN objects stay warm “until the job finishes.” Appeals go to a void. Rights-holder reference spam (fraudulent ownership) has no audit. Matcher outage fail-opens the entire premium library.
Why this matters in court / before a regulator: Operational negligence themes—known matched URLs should be hard-disabled under policy. Appeal dead-ends turn automation into unchecked censorship claims. Fraudulent references poison the corpus. Fail-open on high-risk catalogs is a business choice that needs counsel eyes—not a silent default.
Lawyer lens — what I’d ask on the call: Ownership attestation copy and appeal SLA are counsel-owned. Marketing review: no inducement winks.
Engineer lens: Quarantine-before-publish and URL kill switches are code gates; hope isn’t a CDN purge.
Any hit means you don’t ship yet.
Non-compliance checklist (red flags)
- DMCA public agent / notice form missing or unmonitored because “fingerprinting covers it”
- Auto-terminate on first low-confidence match; no human edge queue
- Match notices omit policy basis and appeal CTA
- No
matcher_version/ score / threshold on action rows
- Soft-hide without hard URL/object disable (kill switch)
- Appeals with no SLA timer or human disposition
- Public marketing that invites infringement
Side B — What works better
Here’s the build worth shipping — gates, records, and an export counsel can defend.
Pipeline that assists ops without replacing § 512 (LE-35 theme)
- Rights-holder portal: Register reference assets (hash / perceptual hash / fingerprint_ref); ownership attestation; contact. Store
attestation_hash. Fraud / spam references escalate to counsel.
- Match on upload or publish: Query matcher; write
match_events(content_id, asset_id, score, matcher_version, at).
- Versioned policy matrix: Counsel-approved actions—
block,monetize,quarantine(block CDN publish until review),leave_up+ notice. Edge / low-confidence scores → human queue, not silent terminate.
- Kill switch for matched URLs: Hard disable identified objects/URLs; store action with actor (
system/human), policy_version, matcher params. Soft-hide alone isn’t enough.
- False-positive human review: Appeals open a ticket with SLA; human disposition required for edge queue; restore + audit on upheld appeal. Label UI copy: automated match ≠ legal determination of infringement.
- Statutory DMCA remains supreme: Published agent + six-element form (LE-15 / Chapter 9) can force disablement independent of the matcher. Counternotice 10–14 business-day clocks still govern put-back for DMCA removals. Unmatched assets still accept notices.
- Strike coupling (explicit rule): Default—matches create review events. Only counsel-defined confirmed outcomes mint LE-16 copyright strikes (Chapter 18). Never silently skip high-revenue accounts on the repeat-infringer ladder.
- Export ledger: rights_assets, match_events, piracy_actions, piracy_appeals—multi-year IP/litigation retention per counsel; WORM preferred for actions.
Adult UGC, games/mods, and generative mirrors use the same skeleton; generative filters (LE-17 / continuous monitoring cousins) are adjacent, not a substitute.
Compliance checklist (green flags)
- Rights portal + attestation live; DMCA form still public and staffed
- Every action stores score, matcher_version, threshold, policy_version
- Edge matches → human queue; kill switch hard-disables URLs
- Appeal SLA met; false-positive restore audited
- Statutory notice on unmatched asset still removes expeditiously
- Export pack for asset_id / user_id without Slack archaeology
- Marketing reviewed for inducement themes
Template: Lawyer / Engineer card
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
| Lawyer | Engineer |
|---|---|
| Is fingerprinting positioned as ops assist—not a § 512 substitute? | Is the LE-15 notice path still reachable and able to force disablement? |
| Who attests ownership of reference assets, and how do we audit fraud? | Do we store attestation_hash, owner_id, and escalate spam references? |
| What score/threshold maps to block vs human review vs leave-up? | Does policy engine return versioned actions and write match_events? |
| Can uploaders appeal, and is copy clear that match ≠ infringement finding? | Appeal ticket + SLA timer + human disposition on edge queue? |
| Do confirmed matches mint LE-16 strikes only under a written rule? | Review events by default; strike write only when policy says so? |
| Can counsel export match→action→appeal for a dispute? | WORM actions with matcher_version + actor? |
Interface / code / data — one-page checklists
Run these as acceptance seeds — not as informal hunches. If you can’t export the Data row, you didn’t finish.
Interface (must-show): Rights-holder portal (reference upload, attestation, contact); uploader match notice with policy basis + appeal CTA; clear “automated match ≠ legal determination” label; separate public DMCA agent + notice form; ops console (score, threshold, action, appeal state, kill-switch status).
Interface (must-not): Removing DMCA intake because matching exists; auto-ban on first low-confidence hit; appeal dead-ends; marketing that fosters infringement.
Code: Ingest fingerprint → store asset + owner; publish path queries matcher; policy engine actions; quarantine mode blocks CDN until review; hard URL kill switch; appeals SLA; DMCA path independent; every action stores matcher_version + threshold; fail-closed quarantine option for premium libraries on matcher outage.
Data: rights_assets; match_events; piracy_actions; piracy_appeals. Retention: multi-year per counsel; WORM for actions. Link to LE-15 notice ids and LE-16 strike ids when policy couples them.
Try this on your product tomorrow
Screenshots and exports beat opinions.
- Submit a statutory DMCA notice for an asset the matcher has never seen—does LE-15 still remove and log?
- Force a low-confidence match—does it land in human review instead of auto-terminate?
- Kill-switch a matched URL—is the object hard-disabled (not soft-hidden)?
- File an appeal on a known false positive—restore + audit row within SLA?
- Export one
asset_idpack: reference, matches, actions, appeals, matcher_version.
- Confirm product marketing doesn’t invite piracy; confirm DMCA page still matches the Office directory.
If step 1 fails, you replaced the statute with a vendor—not a Law Engineering pipeline.
Where this goes next
Keep the loop moving — Law → Interface → Code → Data → Counsel sign-off.
Statutory backbone: DMCA intake (LE-15 / Chapter 9). Ladder: repeat infringer (LE-16 / Chapter 18)—wire strikes only under counsel rules. Intimate-image paths (LE-11 / Chapter 5, LE-12 / Chapter 20) are not copyright matching—keep queues separate. Generative upload filters and continuous corpus re-scan are cousins, not replacements.
This chapter is for education and discussion. It is not legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
Chapter 20 — Worked Example: State NCII / Revenge-Porn Reporting Workflow
Pattern family: State NCII / revenge-porn reporting + ToS enforcement (LE-12); parallel to federal TAKE IT DOWN (LE-11 / Chapter 5)—not the same path; distinct from DMCA (LE-15 / Chapter 9)
Legal anchors: State civil/criminal NCII regimes (exemplars—re-check before matter use): Cal. Civ. Code §§ 1708.85 (authentic), 1708.86 (digitized / deepfake SPEX); Cal. Pen. Code § 647(j)(4); N.Y. Penal Law § 245.15, Civ. Rights Law §§ 52-b, 52-c; Tex. Penal Code §§ 21.16, 21.165, Civ. Prac. & Rem. Code ch. 98B; S.C. §§ 16-15-330, 16-15-332 (authentic + digitally forged). Federal overlays: TAKE IT DOWN / 47 U.S.C. § 223a (covered-platform N&R → LE-11); 15 U.S.C. § 6851 (victim civil claim). Many state statutes include § 230 construction / savings language—don’t invent holdings that § 230 always bars or always fails.
As of September 2026: TIDA does not displace state NCII. DMCA is not a complete intimate-image remedy (copyright ownership ≠ consent). Build reporter privacy, taxonomy, priority queue, preservation, and LE export into the product—then cross-link the federal form where the platform is covered.
Why this memo exists
Nonconsensual intimate-image reporting is its own machine — separate from DMCA clocks and copyright forms.
Intimate-image harm has its own statutes and SLAs. Don’t mash it into copyright tickets.
The story in one glance
Someone reports a nonconsensual intimate image. The only door is “Report abuse,” three menus deep, and it opens a copyright affidavit. Soft-hide leaves the CDN object warm. The victim waits. The clock never started.
What loses — don’t ship this: login-walled report; copyright form for NCII; soft-hide without hard disable; no identical-copy sweep; tickets lost in a general queue.
What works better — build this with counsel: plain-language NCII entry (including non-account holders); fields that match the statute or ToS policy; hard disable + copy sweep; separate TIDA / DMCA / CSAM routing; exportable timeline.
Picture a state NCII report landing in a general support queue. Ask: is there a dedicated path with preservation and a clock — or a macro that says “sorry”?
Why this is an engineering problem
When someone reports a nonconsensual intimate image, a generic “Report abuse” button that opens a copyright affidavit fails the victim twice—wrong form, wrong clock.
State NCII / revenge-porn reporting (LE-12) is a parallel machine to federal TAKE IT DOWN (LE-11). Distinct intake. Distinct fields. Distinct evidence. Don’t mash them into DMCA.
Walk the lost path (login wall, copyright form, soft-hide) and the fixed path (plain-language entry, statutory elements, hard disable + copy sweep, exportable timeline).
| Stage | What practice asks | Typical miss |
|---|---|---|
| Taxonomy | Authentic vs synthetic vs threat-to-distribute | One “nudity” bucket; CSAM mis-tagged |
| Reporter privacy | Identity not shown to uploader by default | Forced confrontation; full identity in notice |
| Priority | SLA ahead of generic spam | Same queue as “spam link” |
| Preserve | Snapshot + hash before delete | Delete first; evidence gone |
| Dual-track | ToS NCII + optional TIDA form | Merged into DMCA; or TIDA-only when state/ToS still matter |
| LE export | Masked ops view; unmask only for legal process | Mods see everything; counsel can’t package |
Field rule — put this on the release checklist: Taxonomy → private intake → priority queue → preserve → ToS action (+ optional TIDA) → LE-16 NCII class → LE export. Don’t route intimate-image harm through the copyright form.
Side A — What loses
Don’t ship this. If your current build matches Side A, stop the release train and fix it with counsel.
Copyright form as the only door
What goes wrong: User reporting a nonconsensual intimate video must swear copyright ownership and list a registration number. Guests can’t report. The ticket lands in the DMCA queue beside piracy claims. Support tells the reporter to “file a DMCA.”
Why this matters in court / before a regulator: Copyright can help when the depicted person owns the work—it’s not a complete NCII solution. Consent and intimate-image statutes are different legal engines from § 512. Forcing a perjury-of-ownership frame chills legitimate reporters and mis-trains ops.
Lawyer lens — what I’d ask on the call: Keep DMCA, TIDA, state/ToS NCII, and CSAM/NCMEC as separate menus and schemas. Point victims to 15 U.S.C. § 6851 / state civil paths in help text counsel approves—without practicing law in-product.
Engineer lens: If report_type can’t be ncii_*, you’ll never get priority or preservation right.
Privacy narrative without preservation, and delete-blind ops
What goes wrong: Reporting auto-notifies the uploader with the reporter’s name and city. Mods soft-hide without freezing bytes. When LE serves process, the object is gone and logs are incomplete. False NCII reports auto-ban the accused with no validity review.
Why this matters in court / before a regulator: Reporter privacy is operational safety and often aligned with statutory design goals. Preservation-before-delete is how you answer legal process (LE-24 themes) and internal appeals. Weaponized false reports need validity review and reverse-abuse policy—not instant nuclear bans on a single uncorroborated tip.
Lawyer lens — what I’d ask on the call: Unmasked reporter contact is an LE-export privilege, not a moderator toy. Litigation hold overrides ordinary retention.
Engineer lens: preserve_snapshot must precede hard delete; fail closed if preserve fails.
Any hit means you don’t ship yet.
Non-compliance checklist (red flags)
- No dedicated Nonconsensual intimate image reason (authentic / deepfake / threat)
- Account-gated only; >3 navigations from the media
- Copyright registration required to report NCII
- Uploader notice reveals reporter identity by default
- NCII tickets in low-priority spam queue; no SLA
- Delete without snapshot/hash; no legal-hold flag
- Merged into DMCA or treated as identical to TIDA’s 48-hour federal clock
- CSAM aged content handled as adult NCII without § 2258A path
Side B — What works better
Here’s the build worth shipping — gates, records, and an export counsel can defend.
Reporting workflow that can survive LE and civil discovery (LE-12 theme)
- Dedicated taxonomy (versioned):
ncii_authentic,ncii_synthetic(deepfake / digitized),ncii_threat. Optional: “I’m the person depicted” vs authorized reporter. Storencii_taxonomy_v.
- Reporter privacy by default: Don’t expose
reporter_user_id/ contact to reported-user APIs. Ops sees masked identity; unmask requires LE-export role + process id. Privacy notice on the form.
- Priority queue:
report_type=ncii_*→ priority Trust & Safety queue + SLA (counsel-set minutes/hours—document; don’t invent a fake “statutory 1 hour” for state ToS paths).
- Preserve-before-delete: On intake or on uphold path, freeze snapshot + metadata + content hash;
legal_hold_flagavailable. Heightened ACL on intimate artifacts.
- ToS enforcement + LE-16 NCII class: On uphold—hard remove; write strike with
class=nciiinto the repeat-abuser ledger (LE-16 / Chapter 18)—separate from copyright strikes. Warn / restrict / terminate per NCII policy version.
- Dual-track with TIDA (LE-11 / Chapter 5): If the platform is covered, offer a clear “Federal TAKE IT DOWN removal request” link. User can open TIDA without abandoning the ToS NCII report. Don’t pretend the state/ToS path is the 48-hour federal duty—or vice versa. Clocks, validity elements, and enforcement agencies differ.
- Distinguish DMCA: Banner: this path is intimate-image / consent, not copyright. Link out to the DMCA form for copyright claims.
- LE export path: Role-gated package—taxonomy, actions, strikes, snapshot refs, process_id, exporter id. Align with legal-process register themes. Safety-resources link (counsel-approved) is care UX, not a substitute for process.
- CSAM fork: Age/minor signals → mandatory CSAM/NCMEC path (LE-13 themes)—never leave confirmed CSAM in an adult NCII bucket.
Dating and marketplace UGC see the highest volume; train mods on authentic vs synthetic themes without turning the product into a legal-advice chatbot.
Compliance checklist (green flags)
- Dedicated NCII reasons live; taxonomy versioned
- Reporter identity masked from uploader notifications
- Priority queue + preserve job before hard delete
- Uphold → removal +
class=nciistrike (not copyright)
- TIDA form linked where covered; schemas remain distinct
- DMCA form not required for NCII reports
- Counsel LE export pack works without Slack archaeology
- CSAM mis-tags route to the required reporting path
Template: Lawyer / Engineer card
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
| Lawyer | Engineer |
|---|---|
| Do ToS/Guidelines ban authentic and synthetic NCII with reportable definitions? | Is taxonomy versioned (ncii_authentic / ncii_synthetic / ncii_threat)? |
| Is reporter privacy the default—unmask only for legal process? | Are reporter fields encrypted; reported-user APIs omit identity? |
| How does this path relate to TIDA § 223a if we are covered? | Separate TIDA ticket/schema; dual-track CTA without merging SLA clocks? |
| Can we preserve intimate artifacts lawfully for LE / civil process? | Preserve-before-delete with hash, ACL, legal-hold flag? |
| Do repeat NCII uploaders hit a real ladder separate from copyright? | Uphold writes class=ncii into LE-16—not the copyright counter? |
| Can counsel export a clean package under process? | le_export_events with role gate, process_id, scope? |
Interface / code / data — one-page checklists
Run these as acceptance seeds — not as informal hunches. If you can’t export the Data row, you didn’t finish.
Interface (must-show): Report reason Nonconsensual intimate image with sub-reasons; depicted-self vs reporting-for-another; privacy notice; status tracking; link to federal TIDA form where applicable; safety-resources link; ops view with content id, masked reporter, prior NCII strikes, one-click preserve.
Interface (must-not): Copyright registration as a condition of NCII report; forced public confrontation as the only path; auto-notify uploader of reporter’s full identity; burying NCII under generic spam; merging into the DMCA form defaults.
Code: ncii_* → priority queue + preserve job; default mask reporter; on uphold hard remove + LE-16 class=ncii strike; optional TIDA ticket link; LE export role for unmask; taxonomy version field; CSAM classifier fork to mandatory reporting path; fail closed if preserve fails before delete.
Data: safety_reports (taxonomy, content_id, reporter encrypted, depicted_self, tida_request_id nullable, action, policy_version, moderator_id); ncii_preservations (storage_uri, hash, preserved_at, legal_hold_flag); le_export_events. Retention: counsel-set; heightened ACL; litigation hold overrides.
Try this on your product tomorrow
Screenshots and exports beat opinions.
- From a logged-out session, can you reach an NCII report in ≤3 navigations without a copyright affidavit?
- File a synthetic/deepfake subcategory—does taxonomy store
ncii_synthetic?
- Confirm the reported user’s notification omits reporter identity.
- Uphold a test report—export
preserved_at, content hash, removal timestamp, andclass=nciistrike.
- Open the TIDA form (if covered) without closing the ToS NCII ticket—two records, two clocks.
- Attempt LE export without the export role—should deny; with role—pack includes taxonomy and snapshot refs.
If step 1 or 4 fails, you have a generic Report button—not an NCII program.
Where this goes next
Keep the loop moving — Law → Interface → Code → Data → Counsel sign-off.
Federal covered-platform clock: TAKE IT DOWN (LE-11 / Chapter 5). Repeat NCII abuser ladder: LE-16 / Chapter 18 (separate class). Copyright remains LE-15 / Chapter 9—use when ownership fits, not as the default intimate-image door. CSAM/NCMEC (LE-13 themes) and legal-process intake (LE-24 themes) sit alongside. Fingerprinting (LE-35 / Chapter 19) doesn’t replace consent-based reporting.
This chapter is for education and discussion. It is not legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
Chapter 21 — Worked Example: § 2257 / 2257A Producer Recordkeeping
Pattern family: § 2257 / 2257A producer recordkeeping when in scope (LE-14); sibling to visitor age gates (LE-10) and creator onboarding (LE-28)—not the same gate
Legal anchors (themes): 18 U.S.C. §§ 2257 / 2257A; implementing regulations 28 C.F.R. Part 75 (record contents, categorization, location, retention, custodian, labeling / compliance-statement themes). Primary vs secondary producer classification is matter-specific—counsel maps the product; this chapter doesn’t invent a bright-line holding that every UGC host is (or isn’t) a producer.
As of September 2026: Re-check statute, Part 75, and counsel’s in-scope memo before enabling publish gates. Do not treat visitor majority-age verification (LE-10), COPPA under-13 (LE-09), or a ToS checkbox as a substitute for producer records. Do not overclaim that dating profiles, non-explicit social posts, or pure redistribution without production nexus automatically trigger the same package.
Why this memo exists
Producer records are a compliance system — identity, date, cross-reference — not a folder someone remembers.
The story in one glance
Counsel says the product is in scope as a producer. Upload still asks only “I’m 18+.” The compliance statement lives on /legal/2257 while scene pages ship bare. ID scans live in a shared bucket any moderator can browse.
What loses — don’t ship this: checkbox-as-records; missing custodian; statement only on a legal URL; publish unlocked without a complete package; ID vault as a general T&S gallery.
What works better — build this with counsel: in-scope flag → complete records package → custodian + label on every covered depiction → publish unlock; exportable examination artifacts under access control.
Picture an examiner asking for the producer records behind one URL. Ask: can you produce the package — or only a custodian name on a static page?
Why this is an engineering problem
If counsel says your product is in scope as a § 2257 / 2257A producer, “I’m 18+” at upload isn’t a records program.
Producer recordkeeping is a custody problem: who examined the ID, what was retained, where the statement lives on every covered depiction, and whether publish can fire without a complete package.
Visitor age gates (LE-10) and creator onboarding (LE-28) are siblings—not substitutes.
| Stage | What the regime asks (themes) | Typical miss |
|---|---|---|
| Scope | Am I a primary / secondary producer for this depiction? | Blanket “2257 on everything” or “UGC platforms never keep records” without a memo |
| Ascertain | Examine ID; record legal name, DOB, aliases; date of original production | Self-attest age; selfie without ID examination where required |
| Package | Cross-index by performer names/aliases and title/identifier; keep ID copies (redaction rules for secondary copies per Part 75 themes) | Loose Drive folder; no content_id join |
| Custodian | Named custodian; records at producer or non-employee custodian place of business; authenticate digital records | “Legal@” alias; no street address on statement |
| Label | Compliance statement / disclosure on covered matter as Part 75 requires | Footer on marketing site only; CDN strip; mobile app omits |
| Gate | Do not publish covered matter without a complete package | Soft warn; growth override for top earners |
| ACL | Records are highly sensitive PII + government ID images | Broad Trust & Safety read; analytics export |
Field rule — put this on the release checklist: In-scope flag → complete records package → custodian + label → publish unlock. Substitute an age gate or a ToS poem and the LE-14 story breaks. Out-of-scope products should fail closed to off, not pretend to run a fake 2257 program.
Side A — What loses
Don’t ship this. If your current build matches Side A, stop the release train and fix it with counsel.
Fake IDs, Drive folders, and “manage content” creep
What goes wrong: Uploader checks “I’m over 18 and own this.” Support asks for a photo of a driver’s license in chat “if we get a complaint.” Someone titled “2257 Custodian” left two years ago; the compliance statement still shows their name and a P.O. box. Product managers add crop, timeline, and “studio tools” that look like production. Counsel never revisited secondary-producer risk. Visitor AV (LE-10) is treated as “we already do age.”
Why this matters in court / before a regulator: § 2257 / 2257A and Part 75 turn on producer duties for covered depictions—examination of an identification document, maintenance of specified records, categorization/retrievability, location, retention (commonly discussed as seven years from creation/last amendment, with shorter post-cessation themes—confirm Part 75 and counsel), and labeling. Self-attest isn’t examination. A chat PDF isn’t an inspectable, cross-indexed store. Age-gating viewers doesn’t create performer records. “Manage content” features can change the primary/secondary map—matter-specific, not a slogan.
Lawyer lens — what I’d ask on the call: Scope memo first. If out of scope, document why and keep the gate off. If in scope, custodian name + street address on the statement, record contents, and inspection readiness are launch items—not backlog poetry. Don’t invent a holding that every dating app or every tube site is automatically primary.
Engineer lens: If publish ignores records_package_status=complete, you shipped a checkbox.
Labels missing where the matter lives; open ACL
What goes wrong: Compliance statement lives on /legal/2257. Individual scene pages, embeds, API payloads, and offline exports omit it. Edge cache serves an old template without the statement. Meanwhile, any moderator role can download the full ID vault “to investigate.”
Why this matters in court / before a regulator: Part 75 labeling / compliance-statement themes attach to the matter (including internet computer site or services themes)—a single legal URL is a weak substitute when covered pages ship bare. Records location must be real and inspectable. ID images aren’t general moderation evidence; broad ACL creates privacy, extortion, and insider-threat blast radius on top of any regulatory miss.
Lawyer lens — what I’d ask on the call: Statement text and custodian block are counsel-owned; engineering owns imprint at origin for every covered surface.
Engineer lens: Label in the origin template (and app/API fields), with CI asserting presence—not a CMS field editors can blank. Records DB: separate store, strict ACL, audit every read.
Any hit means you don’t ship yet.
Non-compliance checklist (red flags)
- No written in-scope / out-of-scope memo; product treats “adult vertical” as automatic § 2257 without analysis—or the reverse
- Publish allowed when ID examination, aliases, production date, or cross-index entry is missing
- Custodian name/address on statement ≠ live custodian; no succession runbook
- Labels only on marketing footer; CDN/app/embed omit compliance statement
- Visitor AV or creator KYC substituted for producer records
- Secondary-producer path with no primary name/address + accepted copies (where that path applies)
- Trust & Safety / analytics can bulk-export ID images
- “Exemption” or 2257A certification paths claimed in UI without counsel-owned classification
Side B — What works better
Here’s the build worth shipping — gates, records, and an export counsel can defend.
Recordkeeping that can survive an inspection ask (LE-14 theme)
- Classify before you build the vault. Counsel memo: covered depiction types; primary vs secondary producer map for this product; which upload paths are in scope; dating / non-explicit / redistribution carve-outs stated affirmatively. Encode
in_scopeper content class—not one global scare banner.
- Uploader path = attestations + evidence, not decoration. For in-scope uploads: performer legal name, DOB, all aliases/stage names, government ID examination artifacts (image + ID type + ID number as Part 75 requires), date of original production, title/content_id. Attestations (age, identity, authority) are inputs to the package—not a replacement for examination records.
- Complete package gate. State machine:
draft → records_pending → records_complete → publishable. Server blockspublish/go_live/ syndication untilrecords_complete. No revenue override.
- Inspectable store. Cross-index by every performer name/alias and by title/content_id; retrieve either way; digital records authenticable by custodian (Part 75 digital-form themes). Secondary-producer path (where counsel says it applies): store primary’s name/address and accepted copies with permitted redactions—ID number not redacted per Part 75 themes.
- Custodian. Named individual (or role with named incumbent); street address for inspection location; succession + offline export drill; statement fields pulled from versioned
custodian_profile, not hardcoded HTML. Non-employee custodian contracts don’t erase producer liability themes—encode who answers the door.
- Labels / disclosure where required. Compliance statement (counsel text) on every covered page/surface: custodian name + address / records location themes as Part 75 requires; imprint from origin templates and API serializers so CDN can’t strip. Mobile and embed parity.
- Strict ACL + retention. Separate datastore; break-glass reads logged; no analytics warehouse copies of ID images; retention aligned to Part 75 (counsel confirms seven-year / post-cessation themes). Purge jobs respect legal hold.
- Sibling gates stay sibling. Visitor AV (LE-10), CSAM reporting (LE-13), creator payout KYC (LE-28), NIL (LE-29) don’t collapse into one “adult compliance” checkbox.
Adult UGC and dating-adjacent products: explicit production paths may be in; vanilla profile photos and non-covered messaging often out—counsel’s matrix, not growth’s assumption. Foreign production and 2257A certification / exemption themes are counsel-owned flags, not engineer folklore.
Compliance checklist (green flags)
- In-scope memo version pinned in config; out-of-scope classes can’t open the 2257 vault UI by mistake
- Publish API returns hard error when package incomplete
- Cross-index round-trip tested (lookup by alias and by content_id)
- Live pages/API show current custodian statement; CDN purge after custodian change
- Records ACL: named roles only; every access audited
- Export pack for inspection: records + index + statement snapshot + custodian profile—without Slack archaeology
- LE-10 / LE-14 / LE-28 state machines separately queryable
Template: Lawyer / Engineer card
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
| Lawyer | Engineer |
|---|---|
| For this product, which upload classes are in-scope primary/secondary—and which are affirmatively out? | Is in_scope enforced per content class, with publish blocked when false-complete? |
| Do records contain examination of ID, names/aliases, DOB, production date, and cross-index keys Part 75 expects? | Can we retrieve by alias and content_id and export an inspection pack? |
| Is the custodian named, current, with a real inspection address on the statement? | Does custodian_profile version feed origin templates (not cache-only HTML)? |
Are labels/compliance statements on the matter where required—not only /legal? |
CI assert statement fields on web, app, embed, and API serializers? |
| Are visitor AV / payout KYC / 2257 kept legally distinct? | Separate state machines and datastores—no mega-checkbox? |
| Who may read ID images, and is that access defensible? | Strict ACL + append-only access audit; no warehouse replicas? |
Interface / code / data — one-page checklists
Run these as acceptance seeds — not as informal hunches. If you can’t export the Data row, you didn’t finish.
Interface (must-show): Uploader checklist for in-scope classes (ID exam status, aliases, production date, attestations); clear in-scope vs not copy owned by counsel; custodian name + street address on compliance statement; blocked-publish UX naming missing package fields; ops view of package completeness without exposing raw ID images to general moderators.
Interface (must-not): Single “I’m 18+” as the only control; fake custodian; statement only on a legal URL while scene pages ship bare; growth “publish anyway”; general T&S gallery of performer IDs.
Code: in_scope classification; package completeness predicate; hard block publish/syndicate; cross-index writes; custodian-driven label imprint at origin; ACL middleware on records routes; retention/legal-hold jobs; refuse silent fallback to self-attest-only when examination required.
Data: producer_scope_matrix (versioned); producer_records_packages (performer fields, ID artifacts refs, aliases, production_date, content_id, completeness, primary_ref if secondary path); custodian_profiles; label_impressions / statement version on publish; records_access_audit. Prefer encrypted at rest + strict ACL. Retention: Part 75 themes per counsel (often multi-year).
Try this on your product tomorrow
Screenshots and exports beat opinions.
- Written scope memo: which content classes are in / out—and does config match?
- Attempt publish with missing ID examination → hard fail with field-level errors?
- Lookup one performer by stage name and by content_id → same package?
- View a live covered URL/app screen → compliance statement shows current custodian + address?
- Moderator role → can’t bulk-download ID images; break-glass leaves an audit row?
- Confirm visitor AV pass does not flip
records_package_statusto complete.
If step 2 or 4 fails, you have a safety slogan—not an LE-14 program.
Commissioned vs UGC — content_class crosswalk (Ed 1.20)
Custom creator deals (LE-71; Chapter 13B) can make uploads look studio-like. § 2257 / 2257A producer duties (when in scope) turn on who produced and what the records must contain — not on whether Marketing still calls it “UGC.”
| content_class | Typical story | 2257 program pressure (themes) |
|---|---|---|
ugc |
User uploads own content under platform ToS | Uploader-centric attestations / records as counsel designs |
commissioned |
Platform-directed deliverable under custom deal | May look like platform/producer participation — counsel matrix |
hybrid |
Deal-funded but creator-controlled | Explicit classification required — do not default to ugc |
Field rule — put this on the release checklist: content_class must be set at publish when a deal_id is present. “We always do UGC 2257” isn’t a crosswalk.
Engineer lens: Publish API accepts content_class; commissioned rows require records_package predicates counsel configures; dashboards separate classes.
Try tomorrow: Find one custom-deal publish — is content_class still ugc by default? If yes, you have a labeling bug before you have a records bug.
Where this goes next
Keep the loop moving — Law → Interface → Code → Data → Counsel sign-off.
Card-network adult UGC participant controls (LE-60 / Chapter 10B) are a different engine — § 2257 ≠ Brand/Acquirer checklist. Visitor majority-age gates (LE-10 / Chapter 11) are orthogonal.
Creator payout onboarding (LE-28) and NIL (LE-29) stay sibling machines. CSAM / NCMEC (LE-13) is a different duty.
Generative intimate outputs may raise separate TIDA/NCII and recordkeeping questions—counsel map, don’t auto-merge. Pattern card LE-14 in the Pattern Map (Chapter 32) .
This chapter is for education and discussion. It is not legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
Chapter 22 — Worked Example: Breach Detection → Counsel → Notice Clocks
Pattern family: Breach detection → counsel escalate → statutory notice clocks (LE-23); pairs with living data maps / legal-process portals (LE-24) and privacy rights ops—not a substitute for either
Legal anchors (themes): U.S. state breach-notice mosaic (numeric deadlines in some states; “without unreasonable delay” / qualitative standards in others); Cal. Civ. Code § 1798.82 as amended by SB 446 themes (effective Jan. 1, 2026): consumer notice within 30 calendar days of discovery or notification, subject to law-enforcement and scope/integrity delay themes; AG sample-notice timing themes when more than 500 California residents are notified (e.g., 15 days after consumer notice—confirm current text). Sectoral overlays (health, finance, education, telecom, FTC/GLBA/HIPAA-adjacent duties) run in parallel where they apply. Federal “one breach statute to rule them all” isn’t the architecture.
As of September 2026: Keep a jurisdiction matrix (state + sectoral) under counsel sign-off. Themes only below—don’t treat the illustrative buckets as a 50-state survey substitute or as invented holdings.
Why this memo exists
Breach work is discovery, assessment, and notice deadlines by jurisdiction — clocks that belong in code and calendars.
Clocks are real. Encode them. Missed notice windows are how small incidents become big matters.
The story in one glance
Security finds unusual exfiltration on a Thursday. The war room runs hot. Nobody stamps discovered_at. Counsel hears about it on Monday Slack. State clocks and “who lives where” are a spreadsheet someone meant to update.
What loses — don’t ship this: detection without counsel escalate; no jurisdiction matrix; notice evidence that’s a draft email; clocks that start when someone “felt sure.”
What works better — build this with counsel: detection → counsel escalate with a server timestamp; geo/residency matrix; notice jobs with evidence; living data map so you know whom you owe.
Discovery of unauthorized access on a Friday. Ask: when does counsel’s notice clock start — and does the stack know, or only the binder?
Why this is an engineering problem
Breach notice is a clock problem dressed up as an incident-response problem. Statutes care when you discovered the event, who lives where, and whether counsel got a real escalate—not whether the Slack channel felt busy.
Detection without a counsel escalate is a war room. Escalate without a jurisdiction matrix is a guess. Matrix without mailed/emailed notice evidence is a hope.
Pair this with living data maps (LE-24). A clock without a map of where personal data lives will miss the people you owe.
| Stage | What statutes ask (themes) | Typical miss |
|---|---|---|
| Detect | Security event with acquisition / reasonable belief themes | Alert fatigue; “maybe later” severity |
| Discover | Clock start = discovery or notification of breach | Analyst edits the date; laptop local time |
| Counsel | Legal characterizes duty, exceptions, content | Silent Slack; privilege and accuracy both suffer |
| Map who | Residents by state; PI categories; vendor vs owner role | Flat “all users” CSV; no residency |
| Clock | State/sectoral deadlines + permitted delays | Single “notify ASAP” sticky note |
| Notice | Content elements; method; AG/regulator packets | Marketing email tone; wrong channel |
| Prove | Timeline + who got what when | Mail-merge with no batch ledger |
Field rule — put this on the release checklist: Detection → immutable discovered_at → counsel ticket → matrix of deadlines → evidence pack → notice batches. Skip counsel or invent discovery time and the LE-23 story collapses.
Side A — What loses
Don’t ship this. If your current build matches Side A, stop the release train and fix it with counsel.
Slack forensics and editable discovery time
What goes wrong: On-call posts “weird S3 listing.” Thread grows for four days. Someone says “we should loop legal.” A PM sets discovered_at to next Monday so “the clock is fair.” Vendor notified the company two weeks earlier; nobody opened the ticket. California residents are in the blast; the team still uses a 2019 “expedient time” mental model and misses SB 446’s numeric consumer clock themes.
Why this matters in court / before a regulator: § 1798.82 / SB 446 themes peg consumer disclosure to discovery or notification, with a 30 calendar day outer structure subject to defined delay themes—not to when the brand feels ready. Other states use 30 / 45 / 60-day numeric buckets or qualitative “without unreasonable delay” standards—your matrix must encode both. Client-edited discovery time is an evidence problem. Vendor-notification statutes often give the owner a short fuse after the processor speaks up—silent email isn’t a legal ticket.
Lawyer lens — what I’d ask on the call: Privilege-aware channels still need a system of record: ticket id, timestamps, counsel-engaged flag, hold. Characterizing whether an event is a “breach” under each statute is legal judgment—the product supplies facts, not conclusions in the user-facing banner.
Engineer lens: If discovered_at is a nullable form field anyone can rewrite, you built a story editor.
No jurisdiction matrix; notice to the burned inbox
What goes wrong: One national email: “We take privacy seriously.” No residency split. No AG sample where thresholds apply. Notices go to the login email that was in the stolen table. Status for execs is a slide; privacy ops can’t see which clocks are red.
Why this matters in court / before a regulator: Multi-state incidents inherit the mosaic—shortest applicable numeric clock and content variances matter. AG / regulator notice thresholds and timings differ (California’s post-consumer AG sample timing themes are one example). Notifying only a compromised channel is an operational miss on top of statutory method themes. Sectoral regimes (illustratively HIPAA breach notice, GLBA, education, telecom) can impose parallel duties—ignoring them because “we’re a dating app” isn’t analysis.
Lawyer lens — what I’d ask on the call: Templates and legal conclusions are counsel-owned. Engineering owns clock math, batching, and proof.
Engineer lens: Without residency_counts[] and deadline_at per jurisdiction row, the dashboard is décor.
Any hit means you don’t ship yet.
Non-compliance checklist (red flags)
- Security severity without auto-open legal/privacy IR ticket
discovered_ateditable by non-counsel after first write; client clock skew
- Counsel looped after containment “feels done”
- No state/sectoral matrix; single national SLA invented by marketing
- California path still assumes pre-2026 “expedient only” with no 30-day consumer clock encoding
- Notice only to known-compromised addresses; no alternate channel logic
- Vendor/owner role confused—no owner-notify workflow when you’re the processor
- Evidence in Slack screenshots; no append-only timeline or notice-batch ledger
- User-facing “we had a breach” banner shipped without counsel template
Side B — What works better
Here’s the build worth shipping — gates, records, and an export counsel can defend.
Clocks that privacy ops can run (LE-23 theme)
- Detection → ticket. Security events above counsel-set severity open an IR matter with server-time
detected_at/discovered_at(first qualifying signal wins; amendments are append-only notes, not silent overwrites).
- Counsel escalate. Mandatory
counsel_engaged_atpath (page + ticket state); legal_hold flag freezes relevant stores; privilege mode for commentary separate from facts timeline.
- Fact pack, not conclusions. PI category taxonomy (e.g., credentials, financial, health, precise geo, government ID—counsel taxonomy); systems touched; encryption/key-status fields; vendor vs owner role; estimated residency counts from the living data map (LE-24 themes).
- Jurisdiction matrix (themes only). Versioned table counsel maintains, for example buckets such as:
- Numeric ~30-day consumer themes: e.g., California (§ 1798.82 / SB 446), and peer states counsel lists (often discussed alongside CO / FL / NY / WA—confirm matrix).
- Numeric ~45-day / ~60-day themes: other states as counsel encodes.
- Qualitative themes: “without unreasonable delay” / expedient-language states—still track
target_notice_byas policy, not as a fake statute number.
- California AG sample themes: when >500 CA residents notified, encode follow-on AG packet deadline themes (e.g., 15 days after consumer notice—confirm current § 1798.82).
- Sectoral overlays: parallel rows (health, financial, education, etc.) where in scope—never “replaced by” state consumer notice.
Permitted delay codes: law-enforcement request; scope/integrity restoration—each with actor, evidence ref, and resumed clock rules counsel defines.
- Numeric ~30-day consumer themes: e.g., California (§ 1798.82 / SB 446), and peer states counsel lists (often discussed alongside CO / FL / NY / WA—confirm matrix).
- Evidence pack. Append-only timeline; hashed export of notices; AG/regulator packet builder; exception/delay log; counsel sign-off on send.
- Status UI for privacy ops. Clock dashboard: jurisdiction, deadline, remaining time, residency count, counsel flag, batch status—internal. User-facing notices render only from counsel-approved templates.
- Channel discipline. Prefer channels not known-compromised; document method (email / mail / substitute) per statute themes; vendor→owner notify workflow with its own clock when you process for others.
Adult / dating / creator platforms: credential + message + payment + government-ID (AV/2257) stores change PI category and residency math—map them. Don’t wait for a “real company” IR tool if the product already holds the identifiers.
Compliance checklist (green flags)
- First qualifying alert → ticket with immutable server
discovered_at
- Counsel paged;
counsel_engaged_atset before public statements
- Matrix version id stored on the matter; deadlines computed, not guessed
- Delay codes require evidence refs; can’t “pause forever” without actor
- Notice batches ledgered (who, template hash, sent_at, channel)
- CA >500 path produces AG sample packet task automatically
- Privacy ops UI shows red/yellow clocks without exporting raw PI to Slack
- Processor path can notify the owner on a separate SLA
Template: Lawyer / Engineer card
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
| Lawyer | Engineer |
|---|---|
| What event starts discovery vs mere investigation under our memo? | Is discovered_at server-stamped and append-only after first write? |
| Which state and sectoral rows apply to this incident’s PI + residency? | Does the matter load matrix version and compute deadline_at per row? |
| Are LE / scope delays documented so the 30-day (or other) clock story holds? | Are delay codes enumerated with evidence_ref and resume rules? |
| Who approves consumer and AG/regulator text? | Are sends blocked until counsel_template_id + approval bit are set? |
| If we are a vendor, when must we notify the owner? | Separate owner-notify workflow and clock fields? |
| Can we prove who was notified when? | Notice-batch ledger with template hash and channel? |
Interface / code / data — one-page checklists
Run these as acceptance seeds — not as informal hunches. If you can’t export the Data row, you didn’t finish.
Interface (must-show): Internal IR clock dashboard (jurisdiction, deadline, residency counts, counsel-engaged, delay state); matter timeline; evidence-pack export; privacy-ops status without raw ID dump; counsel-only template picker before send.
Interface (must-not): Public “breach” banner from eng alone; editable discovery date; Slack as the only clock; single national countdown pretending to be all fifty states.
Code: Event → ticket; immutable discovered_at; counsel page; legal_hold; matrix-driven deadline jobs; delay state machine; batch send gated on approval; owner-notify path; refuse notice to known-compromised-only without alternate-channel rule.
Data: breach_matters; append-only incident_timeline; pi_category_taxonomy; residency_counts; versioned jurisdiction_deadline_matrix; delay_events; notice_batches (template_hash, sent_at, channel, counts); ag_regulator_packets. write-once (WORM) / append-only preferred for timeline and batches.
Try this on your product tomorrow
Screenshots and exports beat opinions.
- Open a severity event in staging → IR ticket with server
discovered_atwithin minutes?
- Attempt to edit
discovered_atdownward → blocked; amendment note only?
- Load CA + one qualitative state + one sectoral row → distinct
deadline_atvalues?
- Simulate LE delay → clock UI shows delay code + evidence ref, not a deleted deadline?
- Send path without counsel approval → blocked?
- Export evidence pack: timeline, residency, batches, matrix version—no Slack ZIP?
If step 1 or 3 fails, you have an incident channel—not an LE-23 program.
Where this goes next
Keep the loop moving — Law → Interface → Code → Data → Counsel sign-off.
Living data maps and counsel portals (LE-24 / legal-process chapter) feed residency and system inventory. Privacy tag congruence and rights UX sit upstream. Ransomware payment screening (LE-25) is a different gate—don’t conflate notice clocks with OFAC payment approval. Pattern card LE-23 in the Pattern Map (Chapter 32) .
This chapter is for education and discussion. It is not legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
Chapter 23 — Worked Example: Ransomware / OFAC Payment Screening
Pattern family: Ransomware / OFAC payment screening before any ransom or related payment flow (LE-25); cousin to payee sanctions gates in affiliate/creator payouts (LE-19, LE-28, LE-33) and continuous monitoring (LE-37)—same screening discipline, different pressure cooker
Legal anchors (themes): OFAC sanctions framework; OFAC Updated Advisory on Potential Sanctions Risks for Facilitating Ransomware Payments (Sept. 21, 2021) themes—sanctions risk when payments involve SDNs / blocked persons, comprehensively embargoed jurisdictions, or facilitation; civil liability themes can be strict even without knowledge; license applications for ransomware payments discussed with a presumption of denial orientation; voluntary self-disclosure and cooperation with law enforcement / CISA / Treasury as mitigating factor themes. This chapter is practice controls for screening and governance—not advice to pay ransoms, to refuse all ransoms, or to negotiate with threat actors.
As of September 2026: Re-check OFAC advisories, SDN/wallet list formats, and counsel’s ransomware payment policy before enabling any payment workflow. Paying is a business/legal decision under counsel—engineering’s job is to make silent pay impossible.
Why this memo exists
Before anyone pays a ransom, OFAC screening has to be a gate — not a blog search after the wire.
Paying a sanctioned party is its own disaster. Screen first; document the decision.
The story in one glance
The ransom note has a wallet address and a countdown. Finance wants to “just pay and restore.” Nobody screened the wallet or the intermediary. Dual-control is a group chat emoji.
What loses — don’t ship this: payment path with no OFAC / sanctions screen; single-approver wire; crypto send that bypasses the same gates as fiat; no decision record when counsel says no.
What works better — build this with counsel: screen before any payment UI unlocks; dual-control approve; counsel decision artifact; same screening discipline you use for payouts—under pressure, still fail closed.
Picture the ransom note and a finance lead ready to wire. Ask: did OFAC screening run before anyone touched a wallet — or is “we’ll check later” the plan?
Why this is an engineering problem
Ransomware pressure is designed to make you skip steps. OFAC screening is one of the steps you must not skip if a payment is even on the table.
This is the same screening discipline you use for affiliate and creator payouts—under a different pressure cooker. Counsel owns whether any payment is lawful or wise. Product owns whether the wire or crypto send can fire without a screen result and a dual-control approve.
| Stage | What controls ask | Typical miss |
|---|---|---|
| Matter | Incident id; threat strain; demanded wallets | Chat-only; no durable case |
| Screen | Wallets, aliases, facilitators, jurisdiction nexus against OFAC lists + analytics | Brand-name only; exact-address-only blindness |
| Counsel | Sanctions + payment policy gate | “Pay now, legal later” |
| Decide | Recorded approve / deny / license-path with actors | Emoji in Slack |
| Pay rail | Corporate-controlled, logged, dual-controlled | Personal exchange accounts |
| Report | LE / CISA / IC3 / OFAC contact refs as policy requires | Never filed; or filed after chain-hop |
Field rule — put this on the release checklist: Matter → screen wallets & facilitators → counsel gate → decision ledger → (only then) payment rail. Any shortcut is silent pay.
Side A — What loses
Don’t ship this. If your current build matches Side A, stop the release train and fix it with counsel.
Personal crypto and brand-name screening
What goes wrong: Ransom note lists three BTC addresses. An engineer creates a personal exchange account “to move faster.” Someone searches the malware family name against a blog; no hit; they call it “clear.” Insurer broker DMs a payment partner. Finance wires stablecoins before counsel sees the wallet list. Weeks later OFAC attribution links a reused address to a designated actor. Nobody has a contemporaneous decision record.
Why this matters in court / before a regulator: OFAC ransomware advisory themes emphasize screening for SDN / blocked person / embargoed jurisdiction nexuses—not informal brand-name screening. Exact listed-address matching alone misses shared-wallet / graph / facilitator risk themes the advisory ecosystem stresses. Facilitation can sweep in insurers, responders, and exchanges. Strict-liability civil penalty themes mean “we didn’t know” is a weak engineering story if you never ran a gate. Personal rails destroy dual control and audit.
Lawyer lens — what I’d ask on the call: Whether to pay at all is counsel + leadership under a written policy. This pattern’s job is to force the question through sanctions and governance—not to optimize payment UX. License-path themes (presumption of denial orientation) belong in the decision record when counsel invokes them—not as a product entitlement.
Engineer lens: If any disbursement API can fire without ofac_screen_status=cleared and counsel_gate=approved, you built an escape hatch.
No ledger; insurer bypass; after-the-fact notice duty
What goes wrong: Payment happens; decrypt key works; everyone celebrates. Only then does someone ask about IC3. Breach-notice clocks (LE-23) were never started because “it was ransomware, not a breach.” Decision makers disagree later about who approved.
Why this matters in court / before a regulator: Cooperation and prompt reporting are mitigating factor themes in OFAC’s advisory framing—after-the-fact amnesia helps no one. Ransomware often is a personal-information incident; payment screening doesn’t replace notice-clock engineering. Side-letters that route payment outside the gate are still your controls problem if your systems honor them.
Lawyer lens — what I’d ask on the call: Keep payment decision files and IR/breach files linked but distinct. Don’t let a decrypt success bury sanctions or notice analysis.
Engineer lens: Decision ledger is append-only. “Approved in a phone call” isn’t a row.
Any hit means you don’t ship yet.
Non-compliance checklist (red flags)
- Any ransom/payment path without a matter id
- Screen of malware marketing name only—not wallets, facilitators, jurisdictions
- Exact SDN address match only, with no graph/facilitator review hook counsel requires
- Employee personal exchange / personal wallet as the payment rail
- Single approver; emoji / Slack as approval
- Insurer or vendor can trigger pay without your counsel gate
- No IC3/CISA/OFAC contact fields on the matter
- Payment success closes the incident without LE-23 breach evaluation
- UI copy that encourages paying ransoms or promises “OFAC safe payments”
Side B — What works better
Here’s the build worth shipping — gates, records, and an export counsel can defend.
A payment flow that can’t go silent (LE-25 theme)
- Policy upfront. Written ransomware payment policy: default posture, who may approve, when license analysis is required, reporting expectations. Product encodes the gate, not the business outcome.
- Open a matter before any rail unlocks. Fields: incident timeline ref, strain/aliases, demanded amounts, wallet addresses, intermediary/facilitator identities, jurisdictions touched, backup/restore status.
- Hard-gate sanctions screen. Screen each wallet, alternate addresses in the note, known facilitators, and counsel-required graph/analytics signals against current OFAC lists (list version stored). Statuses:
clear/hit/inconclusive/embargo_nexus. Hits and embargo nexus block pay. Inconclusive forces counsel path—not a growth retry.
- Counsel gate. No pay API without
counsel_review_status=completeand an explicit decision code:do_not_pay/pay_approved/license_path/abandoned. Dual approval (e.g., counsel + authorized exec) with separate user ids.
- Decision ledger. Append-only: screen results + list versions, decision code, actors, timestamps, rationale refs, LE report identifiers (IC3 / CISA / other as policy requires).
- Corporate rails only. Prohibit personal-employee crypto rails in policy and in tooling (no “paste txid from your phone”). Payment partner integrations inherit the same gate—insurer/responders can’t bypass with a side channel your systems honor.
- Report and link. Store LE/CISA report ids; link to breach-notice matter (LE-23) when PI acquisition themes exist; decrypt success doesn’t auto-close legal tasks.
- No product cheerleading. Internal UI language is sanctions-mandatory and decision-neutral—“screen and counsel gate required”—never “pay safely.”
Adult, dating, and creator platforms often hold intimate imagery, AV/2257 ID vaults, and payment instruments—extortion and leak threats are in-scope IR. The OFAC gate is the same; the breach and NCII follow-ons are additional LE patterns, not reasons to skip screening.
Compliance checklist (green flags)
- Payment button/API absent until matter + screen + counsel decision exist
- Wallet list screened with stored
list_version/ analytics run id
- Hit or embargo nexus → pay route disabled
- Dual approval with distinct principals; ledger immutable
- Personal rail attempts rejected by policy automation
- IC3/CISA (or counsel-specified) report id fields required before
pay_approvedfinalizes if policy says so
- Linked LE-23 evaluation task created when PI may be involved
- Exportable decision pack without Slack archaeology
Template: Lawyer / Engineer card
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
| Lawyer | Engineer |
|---|---|
| Does our ransomware policy forbid silent pay and define approvers? | Is every value-moving path gated on matter + screen + decision codes? |
| Were wallets and facilitators screened—not only the malware brand? | Do we store addresses, screen results, and OFAC list/analytics versions? |
| Is there a contemporaneous approve/deny/license decision with named actors? | Append-only ledger with dual approver_user_ids? |
| Have we documented LE/CISA/OFAC contacts as mitigating-cooperation themes require? | Are report ids first-class fields on the matter? |
| Could an insurer or employee personal rail bypass us? | Are personal rails and ungated vendor callbacks technically blocked? |
| If PI may have been accessed, is breach-notice running in parallel? | Auto-link or require LE-23 matter before closing ransomware case? |
Interface / code / data — one-page checklists
Run these as acceptance seeds — not as informal hunches. If you can’t export the Data row, you didn’t finish.
Interface (must-show): Internal-only matter UI; sanctions-mandatory banner; wallet/intermediary entry; screen result panel (list version visible); counsel decision + dual approval; LE report id fields; explicit no silent pay empty state when gates fail.
Interface (must-not): One-click “pay ransom”; public or customer-facing payment encouragement; brand-name-only screener; emoji approval as the record; insurer portal that fires pay without your gate.
Code: Disbursement APIs hard-require ofac_screen_status ∈ allowed set and counsel_decision ∈ {pay_approved, license_path} with dual approvals; block on hit/embargo; reject personal-rail txid submission paths; freeze pay if list data stale beyond counsel SLA; never log seed phrases.
Data: ransomware_matters; ransom_wallets; sanctions_screen_results (list_version, analytics_run_id, status); payment_decisions (append-only; decision_code; approvers); le_report_refs; optional linked_breach_matter_id. Retain under counsel (often multi-year). Prefer WORM for decisions and screen snapshots.
Try this on your product tomorrow
Screenshots and exports beat opinions.
- Attempt a staging “ransom payment” with no matter id → API refused?
- Submit wallet list → screen rows persist with list version; brand-name-only path nonexistent?
- Force a simulated SDN hit → pay route dead even with exec urgency flag?
- Single approver without counsel → blocked?
- Personal txid paste path → rejected?
- Export decision pack: screens, decision codes, approvers, LE refs?
If step 1 or 3 fails, you have a panic channel—not an LE-25 control.
Where this goes next
Keep the loop moving — Law → Interface → Code → Data → Counsel sign-off.
Breach detection and notice clocks (LE-23) when personal information may be involved. Legal-process / SCA playbooks (LE-24) if process arrives mid-incident. Payee OFAC for affiliates/creators (LE-19, LE-28, LE-33) reuses screening muscle—don’t invent a second list stack without reason. Pattern card LE-25 in the Pattern Map (Chapter 32) .
This chapter is for education and discussion. It is not legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
Chapter 24 — Worked Example: CAN-SPAM Commercial Email
Pattern family: Commercial email headers, identification, unsubscribe, and suppression (LE-20)
Legal anchors: Controlling the Assault of Non-Solicited Pornography and Marketing Act, 15 U.S.C. §§ 7701–7713; FTC CAN-SPAM Rule, 16 C.F.R. Part 316 (primary-purpose test § 316.3; sexually oriented commercial email labeling § 316.4; opt-out mechanics § 316.5). Themes: accurate headers; non-deceptive subjects; clear commercial identification where required; valid physical postal address; functioning opt-out that remains available; honor commercial opt-outs within 10 business days; limited transfer of opted-out addresses. Brands remain responsible for others sending commercial mail on their behalf (FTC Compliance Guide themes).
As of September 2026: Map commercial vs transactional/relationship taxonomy with counsel before turning on lifecycle or win-back sends. Do not treat an SMS consent row (LE-21 / Chapter 12) as email proof—channels are separate machines. Re-check Part 316 and current FTC staff Compliance Guide language before quoting footer or adult-wrapper templates in a matter.
Why this memo exists
CAN-SPAM is from-lines, honest subject lines, working unsubscribe, and suppression lists that actually sync.
CAN-SPAM is basic hygiene. Honor unsub as a gate; keep the suppression evidence.
The story in one glance
Three ESPs blast “Account Security” From names on promo upsels. The footer address is a dissolved entity. Unsubscribe demands login. Affiliates keep mailing after the preference center said stop.
What loses — don’t ship this: fake Re:/invoice subjects; unsub that only updates a spreadsheet; multi-ESP drift; purchased lists with no provenance; list-bomb subscribe endpoints.
What works better — build this with counsel: purpose-tagged templates with truthful headers; postal address + ad ID + one-click unsub in every commercial render; central suppression checked pre-send across every outbox; abuse gates for manufactured consent.
Picture a promotional blast that went out with a broken unsubscribe. Ask: can you show the consent lineage and a working opt-out in one export?
Why this is an engineering problem
Commercial email still has a federal floor. CAN-SPAM isn’t “add an unsubscribe someday”—it’s truthful headers, honest subjects, a working opt-out, and a postal address that matches who is really sending.
Federal commercial email is an opt-out + honesty architecture. Having the address isn’t enough; the send job must honor suppression, and the headers must tell the truth.
Do not treat an SMS consent row (LE-21) as email proof—channels are separate machines.
| Stage | What the statute / Rule asks | Typical miss |
|---|---|---|
| Headers | From / To / Reply-To accurately identify the person or business initiating the message | “Your Package Update” From on a promo blast |
| Subject | Subject line that is not deceptive as to content or subject matter | “Re: your invoice” on a cold acquisition mail |
| Ad ID | Clear and conspicuous identification as advertisement / solicitation when required | Tiny gray “Ad” buried under tracking pixels |
| Postal address | Valid physical postal address the sender can receive mail at | Missing footer; fake suite; entity that no longer exists |
| Opt-out | Clear mechanism; usable without fee / account / excessive steps (§ 316.5 themes); remains available for a statutory window after send | Login wall; mailto that bounces; “manage preferences” with no global commercial stop |
| Honor window | Process commercial opt-outs within 10 business days; do not sell/transfer the address after opt-out except as allowed | Suppression only on ESP-A; ESP-B and affiliates keep blasting |
| Classification | Primary-purpose test for mixed messages (§ 316.3) | Order receipt smuggling a full win-back catalog |
Field rule — put this on the release checklist: Truthful headers + address + working unsub + shared suppression + purpose enum. Skip a link and the brand has a newsletter—not a CAN-SPAM program. SMS PEWC (LE-21) doesn’t substitute for any of these gates.
Side A — What loses
Don’t ship this. If your current build matches Side A, stop the release train and fix it with counsel.
Misleading headers, broken unsub, multi-ESP drift
What goes wrong: Growth buys a “verified” email CSV. Campaigns ship from ESP-A (lifecycle), ESP-B (promotions), and an affiliate network that mails “as” the dating or ecommerce brand. From names rotate through urgency frames (“Security alert,” “Someone messaged you”) even when the body is a paid upsell. The footer has a street address for a dissolved entity. Unsubscribe opens a login page; if the password is forgotten, the user is stuck. Preference center offers “fewer emails” but never a global commercial stop. STOP-equivalent for email is a support ticket. Opt-outs sync to ESP-A overnight; ESP-B’s weekly digest still fires for fourteen days.
Why plaintiffs, AGs, and the FTC care (themes): CAN-SPAM is primarily a federal enforcement / ISP-damages statute, but deceptive commercial email also feeds FTC Act § 5 and state UDAP stories—especially when dating or ecommerce brands keep mailing after a clear opt-out, or when affiliates mail under the brand. Inaccurate headers and subjects are independently actionable themes. § 316.5 themes reject fee, account, or survey walls as the only opt-out path. Vicarious “on your behalf” themes mean the brand’s suppression story must cover partners, not only the first-party ESP.
Lawyer lens — what I’d ask on the call: You need the rendered commercial message (headers + subject + body + footer as sent), the list_source, the unsubscribed_at server time, and proof that every commercial sender for that brand stopped within the statutory window. A CRM note “user prefers less mail” isn’t that.
Engineer lens: If email.send(purpose=commercial) can succeed while the recipient is on email_suppressions, or while the template lacks address_block + unsub_component_id, the footer was decoration.
List-bombing and manufactured-consent abuse
What goes wrong: Attackers (or rogue affiliates) subscribe a victim’s address to dozens of brand lists—“guaranteed opt-in” webhooks with no double-confirm, CAPTCHA, or velocity limit. The victim’s inbox floods; support tells them to “just unsubscribe from each.” Growth celebrates list growth. Purchased/partner lists arrive with a spreadsheet column labeled consent=true and no artifact. Dating win-back and ecommerce abandoned-cart streams treat every imported address as fair game.
Why this matters in court / before a regulator: Manufactured consent and list-bombing are abuse of the acquisition path. Even though federal CAN-SPAM is opt-out oriented for many commercial sends, continuing to mail after a timely opt-out—or building lists that recipients never initiated—creates enforcement and § 5 narratives, carrier/ISP reputation damage, and state-law overlays counsel may map. “We honored unsub within 10 business days” doesn’t cure a pipeline that creates harassment volume.
Lawyer lens — what I’d ask on the call: Ask whether the brand can show how the address entered the commercial pool, who attested to the source, and what abuse controls exist when one IP or affiliate floods subscribe endpoints.
Engineer lens: If POST /subscribe has no rate limit, no confirmation step where policy requires it, and no anomaly job that freezes list growth from a single source, you built a list-bomb amplifier.
Any hit means you don’t ship yet.
Non-compliance checklist (red flags)
- Commercial From/subject that misstates who is sending or what the message is about
- Missing or non-receivable physical postal address in the commercial footer
- Ad identification absent or buried when the primary purpose is commercial
- Unsubscribe behind login, paywall, CAPTCHA maze, or dead mailto (§ 316.5 anti-pattern)
- Preference “opt-down” with no global commercial stop
- Opt-out honored on one ESP while others (or affiliates) keep sending past 10 business days
- No
purpose=commercial|transactionalon the send job; promos inside “receipt” templates
- Purchased / partner lists with no
list_sourceprovenance
- Subscribe endpoints that accept bulk or high-velocity third-party enrollments without abuse gates
- Adult sexually oriented commercial mail without required warning-label / wrapper treatment when Part 316 applies
- Reusing SMS
sms_consentsas email authorization
Side B — What works better (LE-20)
Fixed building blocks
Classify before you send. Every template and send job carries
purpose=commercial|transactional|relationship(counsel taxonomy). Mixed messages run the § 316.3 primary-purpose analysis—when commercial wins, full commercial footer / ad-ID / unsub rules apply. Don’t smuggle win-back catalogs inside order receipts or password resets.Truthful headers and subjects. Template lint and pre-send checks: From display name and domain align to the initiating brand/entity; Reply-To is monitored; subject isn’t a fake “Re:” / invoice / security thread on promotional content. Entity and domain changes are release events.
Footer that can survive a screenshot. Every commercial render includes: clear ad/solicitation identification where required; valid physical postal address for the sender; a conspicuous Unsubscribe (or preference-center link that can effect a global commercial stop). Address block is a versioned component counsel owns—not a free-text field growth edits per campaign.
Opt-out UX that § 316.5 themes would recognize. One clear action; no fee; no account creation; no “survey to confirm.” Internet-based unsub must work for at least the statutory post-send window counsel maps (commonly discussed as 30 days after transmission—confirm). Preference center may offer categories, but global commercial stop must be one click away and must write suppression—not only “weekly → monthly.”
Honor within 10 business days—as code. Unsub endpoint sets
unsubscribed_at(server time), reason, and source (footer/preference/esp/support).
Suppression propagates to all connected ESPs and brand-authorized affiliate/vendor senders within an internal SLA that finishes inside the statutory 10-business-day outer bound.
Enforcement job: commercial send to a suppressed recipient → hard abort (EMAIL_SUPPRESSED). Chaos-test multi-ESP drift.
Suppression list as code + data. Central suppression service is the only pre-send oracle. ESPs are sinks, not sources of truth. Transactional/relationship sends may still go when counsel’s taxonomy allows—but still require truthful headers/subjects and must not smuggle commercial primary purpose. Opted-out addresses aren’t transferred/sold except as the statute permits (e.g., to the same enterprise’s compliance processors).
List provenance and abuse gates. Every commercial audience row traces to a
list_source(first-party checkout, preference opt-in, import batch id, affiliate feed id).
Ban or quarantine purchased lists lacking artifacts. Subscribe / import pipelines: rate limits, bot signals, optional confirm-flow where counsel requires it, anomaly freezes when one IP/affiliate enrolls many third-party addresses (list-bombing gate), and reject webhooks that assert consent=true with no verifiable artifact (manufactured-consent gate).
Affiliates who mail on the brand’s behalf share the same suppression file or lose the channel (pair LE-19).
Adult / dating overlays. Sexually oriented commercial email takes Part 316 warning-label / “brown paper wrapper” template paths when the Rule applies—separate template flag, not a subject-line joke. Dating lifecycle and “someone likes you” mail that’s commercial still needs LE-20 footers and must not monetize fraud-flagged bait (LE-22).
Evidence pack. Retain message_id, template version (with address + unsub component hashes), purpose, list_source, sent_at, esp_id, suppression rows, and affiliate sender id. Multi-year retention under counsel hold.
Method notes commercial email stacks commonly encode
Commercial vs transactional: Counsel owns the taxonomy. Password reset, shipping notice, and legally required notices are usually relationship/transactional—until marketing copy becomes the primary purpose. Win-back, coupon blasts, and “we miss you” dating upsells are commercial. Encode the enum in the send API; refuse unmarked sends.
Shared suppression: One email_suppressions table (or service) keyed by recipient hash + brand_id (or enterprise_id). Every ESP adapter and affiliate outbox calls is_suppressed() before queue. Preference-center global stop and footer Unsubscribe write the same row. Partial category mute must not clear a global commercial suppression.
10-business-day clock: Store unsubscribed_at; compute business-day deadlines with a holiday calendar counsel approves; alert ops if any ESP ack is still pending inside the window; after the window, any commercial delivery is an incident—not a “sync lag” footnote.
Cross-channel boundary: Email suppression ≠ SMS revoke. A user who texts STOP (LE-21) has not necessarily unsubscribed from email, and an email unsub has not revoked SMS PEWC. Preference centers may offer both toggles; backends must keep separate ledgers.
Compliance checklist (green flags)
- Purpose enum required on every send; commercial templates lint for address + unsub + ad ID
- From/subject truthfulness reviewed in template CI; no fake security/invoice subjects on promos
- Footer Unsubscribe works without login/fee; global commercial stop writes suppression immediately
- Central suppression blocks commercial sends on all ESPs and authorized affiliate senders
- No commercial send to suppressed recipients after the honor window (tabletop proves it)
- List imports carry
list_source; purchased lists without artifacts refuse or force re-permission
- Subscribe velocity / list-bombing anomaly job can freeze a source
- Adult sexually oriented path uses approved warning-label templates when in scope
- Counsel export: one message_id → rendered proof + list_source + unsub timeline across ESPs
- SMS consent rows never authorize email (and vice versa)
Template: Lawyer / Engineer card
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
| Lawyer | Engineer |
|---|---|
| Is this send’s primary purpose commercial, transactional, or relationship—and who signed the taxonomy? | Does the send API require purpose= and refuse unmarked jobs? |
| Are From, Reply-To, and subject truthful for the initiating brand? | Do template lint + pre-send checks block deceptive header/subject patterns? |
| Does every commercial mail show a valid postal address and clear ad identification when required? | Is address_block + ad-ID component versioned and required in the HTML render? |
| Can a recipient stop commercial mail without fee, login, or a scavenger hunt? | Does Unsubscribe write unsubscribed_at and sync all ESPs inside the SLA? |
| Can we prove honor within 10 business days across every sender “on our behalf”? | Does is_suppressed() gate every commercial adapter—including affiliates? |
| How did this address enter the commercial pool, and are list-bomb / fake-consent abuses gated? | Are list_source, subscribe velocity limits, and manufactured-consent rejects enforced? |
| Are email and SMS ledgers separate for the same human? | Do email suppressions and sms_consents never substitute for each other? |
Interface / code / data — one-page checklists
Run these as acceptance seeds — not as informal hunches. If you can’t export the Data row, you didn’t finish.
Interface (must-show): Commercial footer with physical postal address; clear Unsubscribe / preference-center path; ad/solicitation identification where required; preference center with a global commercial stop (categories optional, not a substitute); honest From/subject preview in campaign QA; affiliate/vendor sender inventory visible to ops.
Interface (must-not): Login or payment to opt out; mailto-only unsub that bounces; misleading From/subject on promos; “fewer emails” without a true commercial stop; continuing promo teasers after unsub confirmation.
Code: Gates: template lint (address + unsub + ad ID) → purpose classification → is_suppressed(brand, recipient) → send → log message_id + list_source. Unsub webhook/endpoint sets suppression and fans out to all ESPs. Enforcement sweeper aborts residual commercial queues. Affiliate outbox default-deny unless shared suppression bound. Subscribe/import: rate limits, anomaly freeze, reject consent-without-artifact. Adult path: warning-label template flag when required. No production “blast anyway” without legal_exception_id.
Data: email_messages (message_id, template_id, purpose, recipient_hash, list_source, sent_at, esp_id, affiliate_sender_id); email_suppressions (recipient_hash, brand_id, reason, unsubscribed_at, source); email_templates (version, address_block_hash, unsub_component_id, ad_id_component_id, sexual_warning_flag, counsel_signoff); list_sources (method, consent_ref, imported_at, risk_rating); subscribe_abuse_events (velocity, source_ip, affiliate_id, disposition). Retain under counsel hold.
Ops / ticketing: Commercial email complaints and unsub failures open a compliance ticket class (not general CS): link message_id, ESP, suppression propagation status, and 10-business-day deadline. Affiliate repeat unsub leaks → suspend mail privilege (pair LE-19 kill themes).
Try this on your product tomorrow
Screenshots and exports beat opinions.
- Send a commercial campaign; view source. Postal address + working Unsubscribe + ad ID present?
- Unsubscribe via the footer without logging in. Is
unsubscribed_atset?
- Immediately queue commercial sends on every connected ESP and affiliate outbox. Any leak?
- Wait / simulate the 10th business day—does any digest still deliver?
- Import a CSV labeled “guaranteed consent” with no artifacts. Does the pipeline refuse or quarantine?
- Hammer
POST /subscribefor one victim address from one IP. Does list-bombing detection freeze the source?
- Confirm a transactional receipt can still send after commercial unsub—and that it does not carry a promo primary purpose.
- Export one message_id pack for counsel. Missing list_source or multi-ESP unsub timeline = newsletter decoration.
If step 3 leaks on a second ESP, or step 5 accepts the CSV blindly, you have a marketing calendar—not CAN-SPAM Law Engineering.
Where this goes next
Keep the loop moving — Law → Interface → Code → Data → Counsel sign-off.
- Marketing SMS is a different consent-and-revoke machine — Chapter 12 (LE-21). Don’t reuse email suppressions as PEWC, or SMS STOP as email unsub.
- Affiliates mailing on your behalf — onboarding / KYC and disclosure controls in Chapter 8 (LE-19, LE-18); influencer program kill loop in Chapter 17 (LE-52).
- Dating “like/message” commercial mail must also clear fraud-eligibility gates — Chapter 25 (LE-22).
- Subscription / ROSCA notices — classify carefully against LE-03 so legally required mail isn’t stuffed with commercial primary purpose.
- Formation / ToS (LE-01) isn’t a CAN-SPAM unsub mechanism.
This chapter is for education and discussion. It is not legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
Chapter 25 — Worked Example: Dating Fake-Profile / Scam Advertising Controls
Pattern family: Dating fake-profile / scam advertising controls (LE-22)
Legal anchors: FTC Act § 5, 15 U.S.C. § 45(a)—deceptive and unfair acts themes when platforms monetize “likes,” “messages,” or “someone is interested” signals tied to accounts the platform has already flagged as likely fraud, scam, or bot. Orientation matters (not holdings of your facts): FTC v. Match Group complaint themes (N.D. Tex. 2019) and the Aug. 12, 2025 settlement themes (Verify (as of September 2026 — re-check before citing in a matter): $14M figure and operative injunctive terms around guarantees, chargeback retaliation, and cancellation—read the order); Ashley Madison settlement themes (2016) on fake engagers inducing paid membership. § 230 is a weak shield for the platform’s own ads, billing, and conversion UX. Pair cancel quality (LE-03) when guarantees / negative-option dating offers co-travel.
As of September 2026: Re-check any operative injunction language that binds a similarly situated client, and your counsel’s fraud-flag taxonomy, before shipping “liked you” lifecycle mail or paid UA that names or depicts interest from specific profiles. Affiliate and influencer promotion of dating offers still needs LE-18/19 and the program OS in LE-52—this chapter is the eligibility gate those channels must honor.
Why this memo exists
If you advertise connection and ship bots, regulators and plaintiffs will read the product — not the press release.
The story in one glance
Paid ads promise “real local singles.” Landers show stock-photo “members.” Fake profiles and romance-scam creatives keep earning. When monitoring flags them, spend continues because conversion is sticky.
What loses — don’t ship this: unverified profile amplification; fake scarcity claims on landers; no creative/landing honesty gate; kill switch finance ignores.
What works better — build this with counsel: authenticity signals before ad eligibility; creative and landing substantiation; monitor → alert → kill spend; evidence snapshots for counsel.
Picture an ad that implies real nearby singles. Ask: did the creative pass authenticity and disclosure gates — or only a media buyer’s gut?
Why this is an engineering problem
Dating and social ads get ugly fast when fake profiles and romance-scam creatives slip through. Regulators and platforms care whether you knew, whether you kept benefiting, and whether the lander matched what the ad promised.
This chapter is the control plane: profile authenticity signals, creative/landing honesty gates, and a kill switch that stops spend when monitoring flags deception—not a binder of brand-safety aspirations.
| Duty | What § 5 themes ask | Typical miss |
|---|---|---|
| Eligibility | Do not use profiles already flagged likely fraud/scam/bot as bait in acquisition or conversion ads | Marketing bus ignores fraud_status |
| Honest empty states | When no eligible interest exists, say so—do not recycle flagged ids | “12 people like you” fabricated from bots |
| Substantiated claims | Active-user, success-rate, “real profiles” claims need defined metrics | Hero copy with no counsel-owned formula |
| Creative / landing honesty | Ads and landers match what the product can substantiate | Fake scarcity claims; stock-photo “members” |
| Kill path | When fraud flags fire mid-campaign, ads and accounts stop earning | Soft pause; CPA still attributes |
| Evidence | Impression ↔︎ subject profile ↔︎ eligibility snapshot exportable | Slack screenshots; no join key |
Field rule — put this on the release checklist: Flag → ineligible → no bait event → honest UI. Monitoring without an eligibility gate is a museum of scammer profiles that still sell subscriptions.
Side A — What loses
Don’t ship this. If your current build matches Side A, stop the release train and fix it with counsel.
Monetizing known-fraud “likes”
What goes wrong: A free account is scored likely_fraud (payment instrument abuse, device farm, romance-scam reports, velocity).
Growth’s lifecycle job still emits “Someone likes you—upgrade to see who” because the event bus reads the likes table, not the fraud table. Paid social retargeting uses the same teaser.
The landing page shows a blurred avatar and a countdown. Guarantees promise matches “or your money back” with buried conditions.
Chargeback users get suspended in ways that look retaliatory. Cancel is three screens deeper than upgrade.
Why § 5 theories care (themes): The Match complaint narrative centers on advertising and notifications about likers/messagers the company had already flagged as fraudulent—i.e., the platform’s own commercial speech and billing practices, where § 230 help is thin.
Ashley Madison themes add fake engagers built to induce paid membership. Unfairness themes also attach when cancel, guarantee, or chargeback handling stacks deception onto the same funnel (LE-03 adjacency).
Affiliates who amplify romance-scam frames create ratification / participation stories when the brand keeps paying (LE-18/19; LeadClick / Credit Bureau Center themes in Chapter 8).
Lawyer lens — what I’d ask on the call: If counsel can’t export, for a given ad impression or email, the subject_profile_id, its fraud_status at send time, and ad_eligible reason codes, the defense is storytelling—not evidence.
Engineer lens: If marketing.emit(like_notice) can succeed when ad_eligible=false for the subject—or when growth passes a raw profile list that bypasses the eligibility service—you built conversion decoration.
Creative and landing fiction; no kill switch
What goes wrong: UA creatives claim “#1 real-singles app” and “2M active members tonight” with no metric registry.
Landers use stock couples and chat screenshots unrelated to inventory. Affiliate publishers run “local singles want to meet” fake-news frames.
When Trust & Safety mass-flags a bot farm, ads keep serving for days because the ad account’s audience file was a static CSV. Influencer posts reuse the same unverified success rates without disclosure or claim pack approval (LE-52 gap).
Why this matters in court / before a regulator: Deceptive advertising is a first-party § 5 problem whether the pixel fires on your domain or an affiliate’s. Endorsement and affiliate disclosure rules (LE-18) don’t cure false scarcity. Without creative review and a kill that stops spend and commissions, monitoring emails become exhibits.
Any hit means you don’t ship yet.
Non-compliance checklist (red flags)
- Lifecycle mail/push/ads referencing profiles with
fraud_statusin likely_fraud / scam / bot_farm
ad_eligibleonly computed for paying users (free bait accounts unmarked)
- Hard-coded campaign audience lists that bypass the eligibility API
- Inflated “online now” / “liked you” counts including known bots
- “No fake profiles” / success-rate claims without a counsel-signed metric definition
- Landers whose social proof is stock or fabricated chat UI
- Affiliate romance-scam creatives still minting CPA after brand notice
- Mid-campaign fraud flag that doesn’t invalidate caches / pause ads within SLA
- No
eligibility_snapshoton marketing_events rows
- Guarantee / chargeback / cancel UX that co-travels with bait deception (LE-03 miss)
- § 230 assumed to cover the platform’s own upgrade ads
Side B — What works better (LE-22)
Fixed building blocks
Fraud flag taxonomy → eligibility. Counsel and Trust & Safety own enums: e.g.
likely_fraud,scam,bot_farm,payment_abuse,under_review. Policy maps which flags forcead_eligible=false(and which are warn-only). Flags cover free and paid accounts—bait is often free. Storeset_at,source(model/user_report/payment/ops), actor, and clear path.Eligibility service as the only oracle. Personalization, lifecycle email/push, in-app teasers, and paid UA audience builders call
GET eligibility(profile_id)(or batch equivalent). No raw campaign profile lists in growth repos. CI / code review bans hard-coded subject ids for “like” campaigns. Cache TTL short; flag flip invalidates within SLA (commonly discussed 5–15 minutes—set with ops).Marketing event bus drops ineligible subjects. Event types (
like_notice,message_teaser,interest_badge) refuse to enqueue when the subject fails eligibility. Recipient-side copy that implies a specific person’s interest must carrysubject_profile_id+eligibility_snapshotat send/impression time. Aggregate counts use only eligible, substantiated inventories.Honest empty states. Zero eligible likers → clear empty UI (“No new likes right now”), not recycled fraud ids, not evergreen fake avatars. Scarcity timers only when inventory is real and counsel-approved.
Creative review and landing honesty. Paid and organic UA creatives pass a claim pack: metric_id, formula, evidence query, counsel_signoff. Landers must not invent members, chats, or distances. Stock photography labeled as illustrative if used at all; prefer real eligible inventory or non-representational art. Ban lists for romance-scam tropes (wire-transfer “sweetheart,” fake military, etc.) in brand and affiliate creative guidelines.
Affiliate / influencer channel binding. Dating offer affiliates (LE-19) can’t clear KYC and still run fake-profile creatives—monitoring flag
deceptive_traffic/romance_scam_creativesuspends links and holds commissions (Chapter 8). Influencer programs (LE-52) add disclosure + listen + legal alert + kill; claim packs for “I met my partner on…” need substantiation and #ad proximity (LE-18). Shared rule: no commission on traffic whose lander or creative violates LE-22 eligibility/honesty gates.Kill ads and accounts when fraud flags fire. On flag: set
ad_eligible=false; purge subject from live audiences; pause first-party campaigns that depend on that inventory cluster; suspend the fraudulent account’s ability to like/message as bait; open a ticketing case with evidence. Affiliate link 403 + commission hold when the publisher’s creative is the vector. Don’t keep attributing CPA to ineligible bait events (audit query).Guarantees, cancel, chargebacks (adjacent). If the product sells guarantees, surface conditions and claim CTA clearly (settlement themes—confirm order text). Easy cancel (LE-03) sits beside LE-22; unfair chargeback retaliation patterns are a separate unfairness story—map feature flags to counsel’s injunction checklist when relevant.
Evidence for FTC § 5 themes. Retain fraud flags, eligibility decisions/reason codes, marketing_events with eligibility snapshots, creative/landing versions, kill actions, and affiliate dispositions. Prefer ids + enums in snapshots over unnecessary PII. Multi-year retention under counsel hold.
Method notes dating ad stacks commonly encode
Eligibility snapshot: At enqueue/impression time, freeze { subject_profile_id, ad_eligible, reason_codes[], fraud_status, policy_version, decided_at }. Later flag changes don’t rewrite history; they stop future bait. Counsel exports prove what the system believed when it spoke.
Count substantiation registry: claim_definitions rows (metric_id, SQL/formula, window, counsel_signoff). UI and ads may only bind to approved metric_ids. “2M members” without a row → block publish.
Surface inventory: Maintain a living list of every “interest bait” surface—email, push, SMS teaser, in-app modal, paid social, affiliate lander modules. Each surface declares whether it’s subject-specific (needs eligibility) or aggregate (needs claim registry). New surfaces can’t ship without a row on that list (release gate).
Compliance checklist (green flags)
fraud_status→ad_eligible=falsefor counsel-listed flags on free and paid accounts
- Marketing / personalization / UA builders call eligibility service only
- like/message teasers store eligibility_snapshot; ineligible subjects never enqueue
- Honest empty states when eligible inventory is zero
- Claim registry blocks unsubstantiated success / active-user / “real profiles” copy
- Creative + landing review before paid spend; romance-scam tropes banned
- Flag flip invalidates caches and pauses dependent ads within SLA
- Affiliate/influencer kill holds commissions when LE-22 gates trip
- Counsel can export campaign_id / date-range packs joining flags → eligibility → impressions
- Cancel / guarantee / chargeback UX reviewed as sibling controls (LE-03), not ignored
Template: Lawyer / Engineer card
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
| Lawyer | Engineer |
|---|---|
| Do we monetize interest from accounts we already flagged as likely fraud/scam/bot? | Does ad_eligible=false hard-block like/message marketing events? |
| Can we prove eligibility at the moment of each ad/email impression? | Is eligibility_snapshot written on every subject-specific marketing_events row? |
| Are “real singles” / success / active-user claims substantiated? | Do creatives bind only to counsel-signed claim_definitions metric_ids? |
| When T&S flags a bot farm, do ads and affiliate CPA actually stop? | Does flag flip invalidate audiences, pause campaigns, and 403 affiliate links within SLA? |
| Are free bait accounts in the same fraud pipeline as paid users? | Does the flag job cover free accounts used as subjects—not only subscribers? |
| Do affiliate/influencer dating promos honor the same honesty gates? | Are LE-18/19/52 kill switches wired to romance_scam_creative / LE-22 reason codes? |
| If guarantees or cancel are in scope, do settlement-style duties show up in product? | Are guarantee/cancel/chargeback feature flags on the counsel checklist—not orphan Notion docs? |
Interface / code / data — one-page checklists
Run these as acceptance seeds — not as informal hunches. If you can’t export the Data row, you didn’t finish.
Interface (must-show): Honest empty states for likes/messages; substantiated count labels (tooltip or FAQ definition OK); creative/landing review status in the ads console; guarantee conditions + claim CTA if guarantees exist; easy cancel entry point near upgrade (LE-03); ops case UI showing fraud flag → eligibility → campaigns paused.
Interface (must-not): Teasers that name or depict interest from ineligible profiles; fabricated “online now” stacks; landers with fake chat UI as social proof; “no fake profiles” badges without monitoring + substantiation; silent continued upgrade prompts after mass fraud flags.
Code: Gates: fraud flag write → eligibility recompute → cache invalidate → marketing bus filter → impression log with snapshot. Personalization API returns only eligible subjects for bait modules. UA audience export pulls from eligibility service (reject static CSV subjects). Creative publish requires claim_pack_id when claims present. Affiliate/influencer: monitoring disposition → suspend links + hold pay. Audit job: paid conversions attributed to ineligible bait events → page / alert. No growth override without legal_exception_id.
Data: account_fraud_flags (user_id, flag_type, score, source, set_at, cleared_at, actor); ad_eligibility (user_id, ad_eligible, reason_codes[], updated_at, policy_version); marketing_events (event_type, subject_profile_id, recipient_id, eligibility_snapshot, campaign_id, channel, sent_at); claim_definitions (metric_id, formula, counsel_signoff_id, evidence_query_ref); creative_reviews / landing_versions (hash, review_status); ad_kill_actions (campaign_id, reason, actor, at). Retention: multi-year FTC/UDAP horizon per counsel; snapshots minimize PII (ids + enums).
Ops / ticketing: Fraud-flag spikes open a LE-22 compliance case: inventory of live campaigns using that cluster, eligibility recompute ack, affiliate publishers affected, and evidence zip. Romance-scam creative hits route to the same kill queue used by LE-19/LE-52—not a separate ignored mailbox.
Try this on your product tomorrow
Screenshots and exports beat opinions.
- Flag a free account
likely_fraud. Within your SLA, does it appear in any “liked you” email, push, or in-app teaser? Expect none.
- Attempt to enqueue a
like_noticefor that subject via the marketing API. Expect reject / no-op.
- Export a recent “liked you” send: is
eligibility_snapshot.ad_eligible=truepresent and joinable?
- Zero out eligible likers for a test user—does the UI show an honest empty state rather than filler bots?
- Publish a paid creative claiming “2M active members” with no
claim_definitionsrow—blocked?
- Mid-campaign, mass-flag a bot farm—do audiences purge and affiliate links 403 with commissions held?
- Confirm growth can’t ship a CSV of profile ids into the ad account without passing eligibility.
- Pull one counsel pack: flags + eligibility + impressions + kill actions for a date range. Gaps = § 5 exhibit risk.
If step 1 still upgrades on fraud bait, or step 6 keeps paying the affiliate, you have a T&S dashboard—not LE-22 Law Engineering.
Where this goes next
Keep the loop moving — Law → Interface → Code → Data → Counsel sign-off.
- Easy cancel / ROSCA / guarantee UX often co-pled with dating monetization — LE-03 (Chapter 3).
- Affiliate KYC + #ad disclosures when partners promote dating offers — Chapter 8 (LE-19, LE-18).
- Influencer monitor → legal alert → kill program OS — Chapter 17 (LE-52).
- Commercial email footers / suppression for lifecycle mail — Chapter 24 (LE-20); SMS teasers — Chapter 12 (LE-21)—channel compliance doesn’t cure fraud-bait content.
- Payment fraud signals that feed
fraud_status— LE-39; trafficking / FOSTA paths are distinct (LE-13)—don’t merge queues.
- Formation assent for subscriptions (LE-01) still required; it doesn’t legalize deceptive ads.
This chapter is for education and discussion. It is not legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
Chapter 26 — Worked Example: Enterprise AI No-Training-on-Customer-Data Default (Lost vs Fixed)
Pattern family: Enterprise AI — no-training-on-customer-data as the default (LE-31); pairs contract/DPA themes with product gates
Legal anchors: Soft orientation only. Contract and DPA alignment themes (customer content used only for providing the service; no secondary training / improvement use unless expressly opted in); privacy / confidentiality congruence when marketing or order forms promise “not used to train”; FTC Act § 5 deception themes when UI, MSA, and backend diverge; subprocessors and model-host flow-down. Not a claim that any particular statute forbids all training on all enterprise inputs, and not a warranty that models can “unlearn” past training.
As of September 2026: Confirm your MSA/DPA language, vendor model-host settings, and customer-facing admin copy against current product defaults before you ship or renew enterprise SKUs.
Why this memo exists
No-training promises are product gates. If the pipeline can train, the contract lied.
The story in one glance
The DPA says customer data isn’t used to train models. The product default is “improve our AI” checked. A vendor egress path still ships raw prompts to a training corpus. Enterprise diligence asks for the gate; the team sends the contract PDF.
What loses — don’t ship this: contract poetry without a product flag; default-on training; egress that ignores the flag; no exportable deny log.
What works better — build this with counsel: no-training as the default; gated opt-in only where counsel allows; egress denial when the flag is off; evidence that the control plane actually fired.
Picture the enterprise contract that says “no training on customer data.” Ask: does the product default match that sentence — including subprocessors?
Why this is an engineering problem
Enterprise buyers increasingly ask a simple question: do you train on our customer data by default? The wrong answer—or the right answer with no gate—becomes a contract and product failure in the same week.
No-training is a default-off control plane, not a prompt instruction. Contract text without a gated flag is poetry. A flag without egress denial is decoration.
| Question | What evidence answers it |
|---|---|
| What was the default for this tenant class? | Tenant provisioning: training_opt_in=false at create |
| Did UI, contract, and backend agree? | Contract/DPA hash ↔︎ admin setting ↔︎ egress policy snapshot |
| Could anyone turn training on silently? | Append-only setting history with actor, reason, scope |
| Did subprocessors / model hosts honor the same rule? | Flow-down blocks + vendor config attestation ids |
| Can the customer see what was promised? | Customer-visible setting (or read-only status) where the deal promised visibility |
Field rule — put this on the release checklist: No-training is a default-off control plane, not a prompt instruction. Contract text without a gated flag is poetry. A flag without egress denial is decoration.
Rubber-stamp “enterprise mode” that reuses consumer improvement toggles fails the congruence test the same way privacy policies fail when pixels disagree (LE-41). Claiming “perfect deletion from weights” after content was used to train is a separate overclaim—don’t ship it.
Side A — What loses
Don’t ship this. If your current build matches Side A, stop the release train and fix it with counsel.
What goes wrong: Consumer SKU ships with “Improve the model with your conversations” on by default. Sales upgrades the logo to Enterprise and pastes a DPA that forbids training on Customer Content. The admin console either has no training control, or shows a toggle that defaults on, or shows off while the model-host account still has training/improvement enabled. Support tells diligence “we never train on enterprise data” while a shared improvement pipeline still ingests tenant prompts. When a customer asks for proof, the team screenshots today’s UI—no history, no DPA hash, no vendor config export.
Why this matters in court / before a regulator:
- Contract ↔︎ product drift. MSA/DPA says one thing; tenant default says another. Diligence and FTC § 5 narratives both start from that gap.
- Cosmetic admin. Toggle writes local state; inference egress and fine-tune jobs ignore it.
- Silent opt-in. A global feature flag, migration, or “new model preview” flips training on without tenant-scoped consent and audit.
- Subprocessor leak. Primary vendor is “off”; an embedded model API or logging sink still contributes to training corpora.
- Evidence vacuum. No append-only history → can’t prove past state for a dispute window.
- Overclaim. Marketing promises unlearning / guaranteed purge from weights—unprovable and dangerous.
Lawyer lens — what I’d ask on the call: You’ll be asked what the customer was told, what the DPA required, and what the system actually did. A sales email isn’t a control. Don’t invent a statute that “bans all training”; document why your default-off gates exist under contract, confidentiality, and privacy congruence.
Engineer lens: If training_opt_in=false in the admin API while the model-host project still has data_for_training=true, the product is lying by design.
Any hit means you don’t ship yet.
Non-compliance checklist (red flags)
- Enterprise tenants inherit consumer “help improve AI” default on
- DPA / MSA forbids training; product has no matching gate
- Admin shows Off; backend / vendor console shows On
- Enable path with no scope warning, no actor, no reason code
- No customer-visible status where the deal or help center promised one
- Subprocessors / model hosts not bound by the same default-off rule
- Setting changes overwrite prior rows (no append-only history)
- “We deleted it from the model weights” claims in UI or marketing
- Intimate or regulated customer content routed into “de-identified improvement” aggregates without counsel-approved design
Side B — What works better (LE-31)
Fixed building blocks
- Default off by tenant class. Provisioning sets
training_opt_in=falsefor enterprise / DPA-covered tenants. Consumer improvement opt-in must not silently apply.
- Contract binding. Store
contract_version_id/dpa_hash(or equivalent) with the tenant setting so diligence can pair clause text to control state.
- Vendor / model-host config gates. Egress and training-contribution paths deny when off. CI or contract tests assert UI ↔︎ backend ↔︎ vendor flag congruence.
- Warned enable path. Turning on (only where counsel allows) shows scope, subprocessors, and reversibility limits; requires admin role; writes audit row. Prefer dual-control for regulated tenants.
- Customer-visible setting where promised. If sales/help/DPA say the customer can see or control training use, the admin surface exposes status (and control) honestly—not a hidden ops flag.
- Append-only audit + export. Setting history (who/when/old/new/reason), egress policy snapshots, vendor attestation ids—exportable for customer and counsel.
Method notes no-training stacks commonly encode
Control plane: Tenant record carries training_opt_in (bool, default false for enterprise), training_scope (none | limited_improvement | … as counsel defines), contract_version_id, dpa_hash, vendor_config_attestation_id. Writes go through a single settings service; feature flags that bypass it are release blockers.
Egress deny: When off, pipelines that would contribute customer content to training, fine-tune, or vendor “improvement” corpora fail closed. Logging sinks used for product analytics are purpose-limited and must not be re-labeled as training feeds without a setting change.
Congruence tests: Automated checks compare admin API state, runtime policy snapshot, and vendor-side training flags. Drift opens a severity ticket and can fail deploy for enterprise SKUs.
Enable UX: Modal states that enabling may allow use of customer content to improve models (scope counsel owns); lists material subprocessors; notes that turning off later does not guarantee removal from already-trained weights. Confirm requires typed acknowledgment or dual admin where policy says so.
Audit export: Customer-admin and counsel packs include setting timeline, related contract/DPA identifiers, and policy snapshots—secrets omitted.
Compliance checklist (green flags)
- New enterprise tenant →
training_opt_in=falsewithout manual cleanup
- UI Off ⇒ backend Off ⇒ vendor training contribution Off (tested)
- Enable requires privileged role + warning + audit row
- Customer-visible status matches internal flag where promised
- Append-only history survives admin mistakes
- Subprocessor flow-down / attestation recorded
- Export reconstructs flag state for a past date
- No “unlearn from weights” guarantee in product copy
Template: Lawyer / Engineer card
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
| Lawyer | Engineer |
|---|---|
| What did the MSA/DPA promise about training / improvement use? | Is training_opt_in default false for that tenant class at provision? |
| Can we prove UI, contract, and backend agreed on date T? | Do we store dpa_hash / contract_version_id with setting history and egress snapshots? |
| Who may opt a tenant into training, and with what disclosure? | Warned enable path; privileged actor; reason code; optional dual-control? |
| Are subprocessors and model hosts in scope of the same promise? | Flow-down blocks + vendor_config_attestation_id; CI congruence? |
| Is the customer-facing setting honest where we advertised control/visibility? | Admin status/control not a cosmetic mirror of a hidden ops flag? |
| Can diligence or dispute export the timeline without Slack archaeology? | Audit export: setting history, policy snapshots, attestation ids? |
| Are we overclaiming deletion from model weights? | Product copy forbids unlearning guarantees? |
Interface / code / data — one-page checklists
Run these as acceptance seeds — not as informal hunches. If you can’t export the Data row, you didn’t finish.
Interface (must-show): Admin training/improvement status defaulting Off for enterprise; link or reference to DPA/MSA clause themes counsel approves; enable warning covering scope and subprocessors; visible audit log of setting changes; customer-visible control or read-only status where the commercial promise includes it.
Interface (must-not): Hidden consumer-tier “improve our AI” inherited into enterprise; toggle that looks Off while contribution continues; enable without warning; “guaranteed purge from weights” copy; silent migration that flips tenants On.
Code: training_opt_in default false for enterprise provision; settings service is source of truth; egress / training-contribution jobs deny when false; congruence tests UI ↔︎ API ↔︎ vendor config; privileged enable with reason; block feature-flag bypasses; fail closed on unknown vendor training state.
Data: tenant_ai_settings (tenant_id, training_opt_in, training_scope, contract_version_id, dpa_hash, vendor_config_attestation_id, updated_at); tenant_ai_setting_events append-only (actor_id, old_value, new_value, reason, at); egress_policy_snapshots; export jobs producing training_flag_audit_export_id. Retention: contract / dispute horizon counsel sets; legal-hold flag when needed.
Ops: Diligence runbook uses the export pack; severities for congruence drift; renewals re-bind dpa_hash when contracts change; incident review when any enterprise tenant was On unexpectedly.
Soft practice themes (educational only)
Orientation only—not a shipping rule and not a substitute for counsel’s memo on your facts.
- Align contract text, admin default, and runtime egress—one story.
- Default off for DPA-covered / enterprise tenants; opt-in is exceptional and auditable.
- Customer-visible controls only where promised—and then they must be real.
- Don’t promise cryptographic or weight-level deletion you can’t demonstrate.
- Treat model hosts and improvement sinks as in-scope vendors, not invisible infrastructure.
- This chapter never asserts that a given configuration “wins” a regulatory matter.
Try this on your product tomorrow
Screenshots and exports beat opinions.
- Provision a fresh enterprise tenant. Is
training_opt_infalse without a human fix?
- Set admin to Off. Inspect model-host / vendor training flags—do they match?
- Attempt enable: is there a scope warning, actor, and append-only event?
- Export audit for last 90 days. Can counsel see every change?
- Ask sales what customers were told they can “see” about training—does the admin UI match?
- Trace one subprocessor path: can customer content still reach an improvement corpus when Off?
Where this goes next
Keep the loop moving — Law → Interface → Code → Data → Counsel sign-off.
AI surface inventory — Chapter 6D (LE-64); shadow AI egress — Chapter 6E (LE-65). Pair chatbot / agent surfaces (LE-30, LE-38, Chapter 6) so enterprise sessions inherit the same default-off story.
Privacy congruence (LE-41, Chapter 4) when training promises appear in public notices. Synthetic labeling (LE-32) and generative filters (LE-17) when the same tenant publishes model outputs.
Operating-model release: counsel signs Interface → Code → Data before “we never train on your data” ships in enterprise marketing.
This chapter is for education and discussion. It is not legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
Chapter 27 — Worked Example: Synthetic Media Labeling (Lost vs Fixed)
Pattern family: Synthetic media labeling & provenance (LE-32); pairs with generative filters (LE-17), USCO authorship evidence (LE-40), and intimate deepfake intakes (LE-11)
Legal anchors: Soft orientation only. EU AI Act Art. 50 transparency themes for synthetic / manipulated content where Union-facing systems are in scope (transparency in force as of 2 Aug 2026 for covered obligations—confirm matter facts; marking / implementation grace themes under Art. 111 style schedules through later 2026 windows—re-check primary text before citing dates in a matter); product-policy labeling for AI-generated or AI-altered media; US TAKE IT DOWN / NCII themes when intimate deepfakes are involved (LE-11)—labels do not replace statutory removal intakes. FTC Act § 5 deception themes when synthetic media is presented as unaltered human capture. Art. 50 isn’t a U.S. labeling statute.
As of September 2026: Confirm Art. 50 applicability, marking grace, and your deployment geography before you treat labels as “done.”
Why this memo exists
Label what you generate when the law or platform rules require it. Log the label decision.
The story in one glance
The product generates faces and voice clones. Outputs ship to the feed with no label. Provenance metadata is stripped on resize. Terms say “some content may be AI-generated.” Downstream platforms and users can’t tell.
What loses — don’t ship this: Terms-only disclosure; labels that die on export; face/voice swaps that clear the synthetic flag; no publish gate when labeling is required.
What works better — build this with counsel: labels that travel with the asset; provenance metadata on render and export; publish gates when policy requires a mark; evidence of label state at ship time.
Picture a generated clip about to post. Ask: is the synthetic label persistent and machine-readable — or only a soft watermark someone can crop away?
Why this is an engineering problem
Synthetic and AI-altered media needs labels that travel with the asset—not a footnote buried in Terms.
When your product generates or heavily alters media, users and downstream platforms need to know what they are looking at. Labels, provenance metadata, and publish gates beat a ToS poem every time.
Pair with generative filters (LE-17) and intimate deepfake intakes (LE-11) when those risks appear.
| Layer | What transparency themes ask | Typical miss |
|---|---|---|
| Generation | Mark AI-generated / manipulated outputs in scope | Flag only in creator draft, never on viewer |
| Provenance | Machine-readable signal that survives distribution where feasible | Transcode strips metadata; screenshot kills the only mark |
| Person depictions | Clear disclosure when real-person likeness is synthetically presented | “Looks real” feed with no deepfake-style notice |
| Upload path | Detect or self-declare synthetic uploads | Trust the uploader’s silence |
| Intimate harm | Parallel statutory removal path | Label-only response to NCII / TIDA facts |
Field rule — put this on the release checklist: Label before share when policy or applicable transparency themes require it. Provenance without a visible label fails humans; a visible label that can be removed while the bytes stay up fails the duty. Labels are not a substitute for takedown clocks.
Side A — What loses
Don’t ship this. If your current build matches Side A, stop the release train and fix it with counsel.
What goes wrong: Creative tools generate image/audio/video. Publish posts to the main feed with no “AI-generated / AI-altered” badge. Optional C2PA or similar metadata is written in the studio, then the public rendition pipeline re-encodes without it. Chatbots that emit media omit persistent AI notices. Uploaders can drop deepfake-style clips with no self-declare and no detector quarantine. After a journalist flags a clip, ops adds a label retroactively—the share graph and embeds already circulated the unlabeled version. Intimate deepfakes get a “misleading media” tag instead of the TIDA/NCII intake.
Why this matters in court / before a regulator:
- Post-share labeling. The harm window is amplification without notice; fixing the canonical page later doesn’t rewind embeds.
- Metadata-only marks. Removable or stripped provenance without a durable UI signal fails viewers who never inspect bytes.
- Geography blindness. Serving EU users with US-only “we might label someday” posture ignores Art. 50 themes where in scope.
- Likeness gap. Real-person synthetic depictions without disclosure fuel deception and publicity narratives—and may need LE-17 filters, not only badges.
- Intake collapse. Treating NCII as a labeling bug misses LE-11 clocks.
- Detectors that never gate. Scores logged but never gating publish or quarantine.
Lawyer lens — what I’d ask on the call: You need evidence of when a label was shown (disclosure_impressions), whether publish was gated, and whether intimate paths were segregated. Don’t invent that a badge “satisfies Art. 50” for every modality—map obligations to system class and content type with counsel.
Engineer lens: If synthetic_flag=true in the asset DB but the viewer component never renders a badge, and the CDN rendition drops provenance headers, you built a database column—not labeling.
Any hit means you don’t ship yet.
Non-compliance checklist (red flags)
- AI-generated media on public surfaces with no visible synthetic / AI-altered label where policy requires one
- Label applied only after report or only in creator-private draft
- Provenance metadata stripped on transcode / social card generation
- Real-person deepfake-style depictions without disclosure
- Upload path with neither self-declare nor detector quarantine
- Intimate synthetic imagery handled only as “misinformation”
- US-only labeling while product serves in-scope EU users
- Chat/agent media omitting persistent AI notice (LE-38 / Art. 50 chatbot themes where applicable)
- Marketing “fully Art. 50 compliant” without a control map
Side B — What works better (LE-32)
Fixed building blocks
- Synthetic flag at source. Known generative / alter tools set
synthetic_flag(+model_version, tool id) automatically—creators can’t opt out of truthfulness.
- Visible label on viewer surfaces. Badge / caption / watermark themes counsel approves; locale-aware copy where Art. 50 applies; impression logged.
- Provenance metadata. Write and preserve machine-readable provenance through publish renditions where the stack can; treat strip-on-upload as a severity.
- Publish gates. Where policy requires a label, publish APIs refuse unlabeled synthetic; high detector scores → quarantine + human queue.
- Upload self-declare + detectors. Optional honest declare; ensemble detectors for undeclared synthetic; fail toward review on high scores.
- Person-depiction disclosure. Extra notice when policy says real-person synthetic likeness is shown.
- Parallel harm paths. Intimate / NCII hits → LE-11 intake; copyright → LE-15; don’t merge into “add a label.”
- Evidence.
synthetic_flag, provenance refs, detector scores, disclosure impressions, publish-gate decisions, model_version.
Method notes labeling stacks commonly encode
Generation path: Studio and API generators stamp assets and child renditions. Edit operations that materially alter reality (face-swap, voice-clone, full generative fill) keep or escalate the flag—cosmetic filters may stay unlabeled per counsel policy, but face/voice swaps don’t silently clear the flag.
Viewer: Feed, detail, embed, and download/preview surfaces read synthetic_flag and render the label without requiring “advanced details.” Hiding the label behind a menu fails the conspicuousness theme.
Publish gate: publish requires label_satisfied=true when synthetic_flag and policy template say so. Bypass only via counsel-role exception with reason—logged.
Failure mode control — label-after-share: Jobs that discover unlabeled synthetic already public must (a) apply label, (b) record remediation_at, (c) open incident if shares exceeded threshold—prevention remains the release gate; remediation isn’t the design center.
Chatbot / agent media: Persistent AI interaction notice (LE-38) plus media-level synthetic marks when the bot emits image/audio/video.
Compliance checklist (green flags)
- Generator →
synthetic_flag+ versions without creator opt-out of truth
- Viewer badge visible without “more” tap on mobile
- Provenance survives primary public rendition
- Publish blocked when label required but missing
- High detector score → quarantine, not silent post
- Person-depiction disclosure where policy requires
- Intimate hits open TIDA/NCII path in parallel
- Disclosure impressions exportable by asset and surface
Template: Lawyer / Engineer card
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
| Lawyer | Engineer |
|---|---|
| Which modalities and geos need visible synthetic / manipulated-content marks? | Is synthetic_flag set at generation and enforced at publish? |
| Where Art. 50 applies, is transparency copy approved for this system class? | Locale-aware label; no hide-after-first-view dark pattern? |
| Do real-person synthetic depictions get distinct disclosure? | Person-depiction notice wired on likeness-synthetic paths? |
| Is labeling confused with TIDA/NCII removal? | Separate menus/schemas; label ≠ 48-hour clock? |
| Can we prove a viewer saw a label before amplification? | disclosure_impressions with surface, locale, at? |
| Does provenance survive distribution? | Rendition pipeline preserves metadata; strip alerts? |
| What happens when unlabeled synthetic is already public? | Remediation job + incident—not “fixed because we labeled later” as the only control? |
Interface / code / data — one-page checklists
Run these as acceptance seeds — not as informal hunches. If you can’t export the Data row, you didn’t finish.
Interface (must-show): Visible synthetic / AI-generated / AI-altered label on viewer surfaces where policy or applicable transparency themes require; chatbot AI notice where interactive AI is in scope; deepfake-style disclosure for real-person depictions per policy; upload self-declare option; quarantine / appeal messaging for detector holds; links to intimate-image reporting when content may be NCII.
Interface (must-not): Label only in creator draft or after viral report; badge buried under overflow menus; removable sticker while bytes stay unmarked in embeds; “misinformation” tag as the only response to intimate deepfakes; claims that a watermark alone “satisfies all global AI laws.”
Code: Auto-flag on known generative/alter tools; publish gate requires label satisfaction; provenance write + preserve on renditions; upload detectors → quarantine on high scores; wire intimate classifications to LE-11; fail closed when flag true and label component missing; CI asserts label component on synthetic viewer templates.
Data: media_assets (asset_id, synthetic_flag, alter_type, model_version, provenance_uri); detector_scores; disclosure_impressions (surface, locale, asset_id, at); publish_gate_events; remediation_events (label_after_share cases). Retention: policy + dispute horizon; minimize biometric embeddings per counsel.
Ops: Monitor label-after-share rate as a regression metric; Art. 50 / policy matrix owned by counsel; parallel staffing for TIDA vs labeling queues.
Soft practice themes (educational only)
Orientation only—not a shipping rule and not a substitute for counsel’s memo on your facts.
- Mark synthetic / manipulated content when required—UI first, metadata as complement.
- Art. 50 themes are EU-facing / system-class specific—map, don’t slogan.
- Labels don’t satisfy TAKE IT DOWN, DMCA, or CSAM duties.
- Distinct from USCO authorship diaries (LE-40): labeling is viewer transparency; authorship evidence is registration process fact.
- Distinct from pre-publish IP/likeness filters (LE-17): filters refuse or queue risky outputs; labels disclose what still ships.
- Don’t invent that any one watermark standard is mandated worldwide.
Try this on your product tomorrow
Screenshots and exports beat opinions.
- Generate media → publish → open the public viewer on a 390px viewport. Is the label visible without scrolling or “more”?
- Inspect the public rendition bytes/headers—did provenance survive?
- Attempt publish with
synthetic_flag=trueand label suppressed—does the API refuse?
- Upload an undeclared synthetic sample—quarantine or human queue?
- File an intimate deepfake-style report—does it land in TIDA/NCII, not only “add AI label”?
- Export disclosure impressions for one asset across feed, embed, and detail.
Where this goes next
Keep the loop moving — Law → Interface → Code → Data → Counsel sign-off.
Pair generative copyright / publicity filters (LE-17) so risky likeness/IP outputs never rely on a badge alone. USCO human-authorship evidence (LE-40, Chapter 15) when the same studio needs registration diaries. Chatbot guardrails (LE-38, Chapter 6) for interactive transparency. Trust & safety stack (LE-36) when synthetic media is UGC at scale. Intimate imagery → LE-11 / Chapter 5.
This chapter is for education and discussion. It is not legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
Chapter 28 — Worked Example: Generative Copyright / Publicity Filters (Lost vs Fixed)
Pattern family: Pre-publish generative copyright & publicity / likeness filters (LE-17); distinct from USCO human-authorship evidence (LE-40) and from DMCA reactive notice intake (LE-15)
Legal anchors: Soft orientation only. Output-infringement and right-of-publicity / NIL risk themes when generative features emit near-copies, celebrity likeness/voice, or brand-confusing marks; California publicity exemplars and peer state themes; intimate deepfakes → TAKE IT DOWN / NCII (LE-11) rather than “IP filter only”; USCO practice limits on claiming AI output as human-authored belong in LE-40, not in this filter chapter. DMCA § 512 remains the reactive harbor process for hosted material—filters are proactive product gates, not a substitute for notice-and-takedown. FTC § 5 themes when marketing claims “IP-safe AI.” No invented holdings; no promised safe harbor from filtering alone.
As of September 2026: Confirm publicity, trademark, and platform AUP posture for your facts; pair labels (LE-32) when outputs still publish.
Why this memo exists
Filters aren’t perfect. Document thresholds, human review hooks, and what you block vs escalate.
The story in one glance
Users upload a celebrity still—“make them say …”—or ask for a living artist’s style. A short English blocklist is the only guard. Outputs publish instantly. Marketing says “IP-safe AI.” The first serious review is a DMCA email.
What loses — don’t ship this: keyword-only filters; animate-this-photo with no likeness gate; no human queue for high scores; filters treated as a DMCA substitute.
What works better — build this with counsel: prompt + output + upload-likeness filters; refusal UX with reason codes; human review on the edge; provenance and filter-hit evidence; DMCA intake kept parallel for hosted UGC.
Picture a prompt that asks for a living celebrity’s face singing a chart hit. Ask: which filter refuses — copyright, publicity, or both — before render spends the GPU?
Why this is an engineering problem
Generative features get into trouble when users can mint near-copies, celebrity likeness, or intimate deepfakes—and the only guard is a short English blocklist.
Pre-publish filters are product gates. They aren’t a USCO authorship diary (LE-40), and they aren’t a substitute for DMCA notice-and-takedown (LE-15) when material is already hosted.
Wire prompt, upload, and output filters; keep a human queue for high scores; remember filters refuse before amplification—DMCA still responds to notices.
| Job | Pattern | Question it answers |
|---|---|---|
| Pre-publish risk gate | LE-17 (this chapter) | Should this output ship given likeness / IP risk themes? |
| Authorship process evidence | LE-40 | What did the human select, arrange, or modify for registration counsel? |
| Reactive notice intake | LE-15 | On a valid © notice, can we disable identified material expeditiously? |
Field rule — put this on the release checklist: Filters refuse or queue before amplification. Authorship diaries record human contribution. DMCA responds to notices. Shipping one as a substitute for another fails all three stories.
Filters also don’t replace continuous NIL monitoring (LE-37) after publish, or TIDA clocks for intimate deepfakes.
Side A — What loses
Don’t ship this. If your current build matches Side A, stop the release train and fix it with counsel.
What goes wrong: The product offers image/video/voice generation. Users upload celebrity stills (“make them say …”), request living-artist “styles,” or paste trademarked characters. Guards are a short English blocklist (taylor swift, disney) easily bypassed with misspellings or non-English prompts. Outputs publish instantly. No human queue for high similarity scores. AUP exists as a PDF. When a rights holder complains, the only path is a generic support form—or a DMCA form that never saw the generative feature. Marketing: “Our AI is trained to respect copyright.” No filter-hit logs; model_version unknown.
Why this matters in court / before a regulator:
- Keyword-only filters. Likeness and near-copy risk are embedding/vision/audio problems; string equality isn’t a gate.
- Upload animate path. The dangerous input is often the reference photo/audio, not the prompt text.
- No human review. Borderline scores auto-publish; false celebrity hits auto-ban without appeal → both under- and over-enforcement.
- Collapsed duties. Teams point to a DMCA agent as proof they “handle AI IP,” or point to an authorship diary as proof outputs are “clear.”
- Intimate miss. Nonconsensual intimate synthetic media needs LE-11, not a copyright classifier alone.
- Evidence gap. Discovery asks which rule fired; Slack screenshots of “we blocked some stuff” don’t answer.
Lawyer lens — what I’d ask on the call: Publicity and copyright exposure on outputs is fact-specific; filters are risk controls and AUP enforcement—not a license. Don’t tell product that passing a filter means “non-infringing.” Keep § 512 intake staffed for hosted material regardless of how good filters are.
Engineer lens: If POST /generate returns bytes to a public URL without running prompt/output/upload checks against the current policy_ruleset_version, the AUP is decoration.
Any hit means you don’t ship yet.
Non-compliance checklist (red flags)
- Celebrity / brand animate-from-upload with no likeness detector
- English-keyword-only prompt filters
- Auto-publish on high similarity / likeness scores
- No human review queue or SLA for quarantine
- Marketing “IP-safe / infringement-proof AI”
- Filter hits not logged with model_version / ruleset version
- DMCA form used as the only generative-output control
- Authorship diary (LE-40) treated as permission to publish risky likeness
- Intimate deepfake path missing or merged into “copyright”
- Refusal UX with no plain-language reason code
Side B — What works better (LE-17)
Fixed building blocks
- AUP at feature entry. Plain prohibition themes counsel owns (likeness misuse, near-copy of protected works, intimate nonconsent)—accepted/logged before generation credits flow.
- Prompt filters. Multilingual / normalized checks + policy embeddings—not English keywords alone.
- Output filters. Image/audio/video scorers for near-duplicate / character / brand risk per allowlist of detectors counsel approved.
- Upload likeness / reference detectors. Face/voice/reference-image paths scored before generate; high risk → refuse or quarantine.
- Human review queue. Mid-band scores → reviewer with reason codes; publish blocked until decision.
- Refusal UX. User-visible plain reason class (likeness / IP-risk / policy)—no model lecture that invents law.
- Provenance + labels. Surviving outputs that are synthetic still carry LE-32 marks where required.
- Evidence. Prompt/output hashes, filter hits, scores,
policy_ruleset_version,model_version, reviewer_id, action.
- Parallel intakes. Hosted UGC still exposes LE-15 DMCA; intimate → LE-11; don’t close those forms because filters exist.
- Config CI. Release asserts filters enabled for generative surfaces; can’t ship with detectors “temporarily” off in prod.
Method notes filter stacks commonly encode
Pre-publish pipeline: Input normalize → prompt policy → (if upload) likeness/reference score → generate in isolated buffer → output score → decision (allow / refuse / human_queue). Public CDN URL minted only on allow (or allow-after-review).
Human queue: Priority by score and surface (ads > public feed > private draft). Reviewer actions append-only; auto-expire quarantine without decision is a severity (fail closed or extend hold per policy—counsel picks; silent publish isn’t an option).
Distinct from LE-40: Passing filters doesn’t set claim_all_human or build a registration pack. Distinct from LE-15: a filter refuse isn’t a § 512 notice; a filter miss still needs expeditious removal when a valid notice arrives.
Intimate overlay: If classifiers (or reviewers) hit nonconsensual intimate synthetic media, open LE-11 workflow; don’t stop at “publicity block.”
Compliance checklist (green flags)
- Upload-likeness and output scorers on generative publish paths
- Multilingual / normalized prompt policy—not keyword-only
- Human queue for mid/high uncertainty with logged decisions
- Refusal reason codes user-visible and exportable
policy_ruleset_version+model_versionon every hit
- CI fails if generative prod config has filters disabled
- DMCA and TIDA intakes still live and separate
- No “IP-safe AI” claim in CMS without counsel exception
- Synthetic label still applied when allow + synthetic (LE-32)
Template: Lawyer / Engineer card
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
| Lawyer | Engineer |
|---|---|
| Which likeness / IP risk classes are in product policy for this feature? | Are prompt, output, and upload-reference checks enforced server-side before public URL mint? |
| Are we overclaiming “IP-safe” in marketing? | CMS / claim gate fails contradictory copy? |
| When is human review required vs auto-refuse? | Score bands → human_queue with SLA; no silent publish on hold expiry? |
| How is this different from USCO authorship evidence? | Filter pipeline does not write registration “all human” claims? |
| How is this different from DMCA intake? | § 512 forms and clocks still staffed in parallel? |
| Intimate deepfake vs celebrity parody edge—who decides? | Classifier routing to LE-11 vs publicity queue; reviewer taxonomy versioned? |
| Can we reconstruct why an output shipped or died six months later? | Export: hashes, scores, ruleset_version, reviewer_id, action? |
Interface / code / data — one-page checklists
Run these as acceptance seeds — not as informal hunches. If you can’t export the Data row, you didn’t finish.
Interface (must-show): AUP summary at generative feature entry; refusal screen with plain reason codes; “in review” state for quarantined gens; appeal / support path for false blocks where policy allows; persistent AI / synthetic disclosure on allowed outputs (LE-32); links to copyright notice (LE-15) and intimate-image report (LE-11) from safety menus—not buried inside the generator only.
Interface (must-not): One-click “animate any face” with no warning or detector; keyword block messages that teach bypasses; “copyright approved ✓” badges on outputs; DMCA-only help text for generative likeness harms; authorship-diary UI presented as a license to publish.
Code: Server-side prompt/output/upload filters; public asset mint only after decision=allow; human queue service; config CI asserts filters on; intimate class → LE-11 hook; rate-limit repeat refuse evasion; never trust client-only blocklists.
Data: generation_requests (prompt_hash, upload_ref_hash, model_version, at); filter_hits (stage, score, rule_ids, policy_ruleset_version); moderation_reviews (reviewer_id, decision, reason_code, at); refused_outputs / allowed_output_ids. Minimize raw prompts in hot logs; ACL vault if retention needed. Retention: dispute / AUP horizon counsel sets.
Ops: Weekly false-positive / false-negative sampling; ruleset versioning with counsel sign-off; don’t “turn off filters for the launch livestream.”
Soft practice themes (educational only)
Orientation only—not a shipping rule and not a substitute for counsel’s memo on your facts.
- Proactive filters reduce risk; they do not replace § 512, TIDA, or registration counsel.
- LE-17 ≠ LE-40 ≠ LE-15—teach the three-column distinction in release reviews.
- Publicity / NIL and copyright are related but not identical queues.
- Intimate nonconsensual synthetic media is a removal-clock problem first.
- Marketing claims about IP safety need substantiation—or deletion.
- This chapter never asserts that a given filter stack “avoids infringement.”
Try this on your product tomorrow
Screenshots and exports beat opinions.
- Upload a well-known public-figure still and ask for a speaking video—refuse or human queue?
- Bypass English names with transliteration / description-only prompts—do scorers still fire?
- Generate privately, then publish—does the publish API re-check, or trust the draft?
- Disable filters in a staging config that mirrors prod—does CI catch it?
- Open DMCA and TIDA entry points—still separate from the generator refusal screen?
- Export one refused and one allowed generation: hashes, scores, ruleset_version present?
Where this goes next
Keep the loop moving — Law → Interface → Code → Data → Counsel sign-off.
Embodied perception / TAO (training vs output) — Chapter 28B (LE-59) — sensors/provenance vs commercial performance gates. Synthetic labels (LE-32) for outputs that still ship. USCO authorship diaries (LE-40, Chapter 15) for human contribution evidence—not as a publish license. DMCA intake (LE-15, Chapter 9) for reactive hosted © notices. Continuous NIL monitoring (LE-37) after day-0 filters. Creator NIL grants (LE-29 / Chapter 13) when the likeness is a contracted creator rather than a random celebrity scrape. Trust & safety ensemble (LE-36) when generative UGC is only one abuse class among many.
This chapter is for education and discussion. It is not legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
Chapter 28B — Worked Example: Embodied Perception & TAO (Training vs Output)
Pattern family: Embodied perception / TAO (Training & Output) gates for humanoid and embodied AI — distinguish perception & learning inputs from reproduction / commercial-exploitation outputs (LE-59). Sits after generative copyright / publicity filters (LE-17; Chapter 28) and beside USCO human authorship (LE-40; Chapter 15), synthetic labeling (LE-32; Chapter 27), agentic commerce (LE-43…47; Chapters 6 / 6B), and NIL / likeness (LE-29; Chapter 13).
Legal anchors (themes): Copyright and neighboring rights themes for inputs (sensors, world models, training on observed scenes, scraped or captured audiovisual) versus outputs (copying protected works, commercial performance of copyrighted content, publicity / NIL / voice). USCO human-authorship practice (LE-40) — who authored what the product claims. Generative filter themes (LE-17). Synthetic-media labeling (LE-32). Right-of-publicity / NIL themes (LE-29 / LE-37). Agentic consequential-act human-in-the-loop (LE-44). No invented federal “TAO safe harbor” statute. Frame TAO as a design pattern for product counsel advocating and implementing gates while the law evolves.
As of September 2026: Re-check copyright, publicity, and any embodied-AI guidance with counsel before anyone briefs “training is always fair use” or “sensors are always free.” Design as if a Training/perception ≠ Output/exploitation split were the compliance target — without claiming that split is enacted law.
Why this memo exists
Embodied systems with sensors and onboard models need a training-vs-output story counsel can defend.
When the product perceives the physical world, consent and retention get sharper. Inventory capture; gate upload.
The story in one glance
Picture a humanoid on a retail floor.
Cameras and mics build a world model from the aisle. Overnight the model trains on what it saw. In the morning Marketing asks it to sing a chart hit at a demo booth, mimic a celebrity greeter, and replay a shopper’s private conversation as a cute demo clip.
Product’s first instinct is one sentence: It’s just learning from the world — like a person.
That sentence collapses two engines.
Perception and training inputs raise one set of IP / privacy / evidence questions. Reproduction and commercial-exploitation outputs raise another. Courts, agencies, and counterparties may treat them differently as the law moves. Your stack should already inventory, log provenance, filter outputs, and gate commercial performance — whether or not a federal safe harbor with that name ever ships.
Walk the demo booth request with two columns on a whiteboard: what it may learn vs what it may perform. Ask: does the stack enforce that split — or only a slogan in a slide?
This chapter walks that line the mentor way: sensors first, provenance next, output filters and commercial gates before the demo, human-in-the-loop (HITL) for consequential acts, and an evidence schema counsel can export. Teaching reconstructions only.
Plain English — the TAO Safe Harbor mindset (not a statute)
TAO here means Training & Output — a teaching label, not a citation.
| Leg | What it covers (themes) | Design pressure |
|---|---|---|
| T — Training / perception | Sensors, lidar, audio, proprioception, world-model updates, offline training on observed scenes | Inventory modalities; provenance logs; purpose limits; retention; lawful basis / notice themes where they apply |
| A — Advocacy / architecture | Product counsel arguing the split while law evolves | Encode the split in gates before a holding arrives; do not wait for a slogan |
| O — Output / exploitation | Generated speech, song, dance, replay, commercial performance, likeness/voice mimicry, near-copies of protected works | Copyright / TM / publicity filters; commercial-performance gates; HITL; refuse “demo exception” folklore |
Field rule — put this on the release checklist: Training/perception ≠ Output exploitation. Design as if that split were the compliance target. Do not tell the board you already have a federal TAO safe harbor.
Remember: a Law Engineer is a licensed attorney with software and product expertise. Engineers build inventories and gates under that counsel’s oversight.
What counsel is asking the product to do (themes)
Orient to eight design pressures. Counsel owns the final map for your facts and jurisdictions.
- Inventory sensors and data modalities. Camera, mic, depth, touch, telemetry, third-party feeds — each row: purpose, retention, training-eligible flag, counsel class.
- Training provenance logs. What went into a training run or world-model update; hashes / batch ids; policy version; exclusion lists.
- Purpose separation. Perception for navigation/safety isn’t automatically a license to train a commercial entertainment model — encode purpose tags.
- Output filters (© / TM / likeness / voice). Reuse generative filter themes (LE-17); intimate deepfakes route to TIDA/NCII (LE-11 / LE-12), not “IP only.”
- Commercial-performance gates. Public demo, paid event, broadcast, or in-store performance of copyrighted repertoire / celebrity persona needs an explicit license or refuse.
- Human-in-the-loop for consequential acts. Binding deals, payments, physical acts with foreseeable harm (LE-44 adjacency).
- Human authorship evidence when you claim copyright. Diaries and contribution logs (LE-40) — not a publish license.
- Label synthetic outputs when they ship (LE-32). Don’t hide embodied generation as “just a recording.”
Exceptions aren’t footnotes. DMCA reactive notices (LE-15) don’t replace proactive output gates. Enterprise “no training on customer data” (LE-31) is a sibling contract pattern for B2B — map it when embodied units enter customer premises.
Review this with counsel and eng on the same call. If Side A matches production, you’re still in the memo-to-coders handoff.
Side A — What loses (“sensors = free; demo = fair use”)
What goes wrong: Every camera stream lands in one lake labeled training_ok. No modality inventory.
Marketing scripts the robot to perform a hit song and greet shoppers in a celebrity voice. Engineering says “we only trained; we didn’t copy.” Legal has no export of which scenes entered last week’s fine-tune.
HITL is a Slack emoji. After a cease-and-desist, nobody can separate perception logs from performance logs.
Why this matters in court / before a regulator: Input risk and output risk are different machines. Collapsing them into “AI learns like people” is advocacy without evidence. Commercial performance of protected works and publicity/NIL claims don’t disappear because a sensor was involved upstream. A missing provenance log turns every training run into a discovery science project.
Lawyer lens — what I’d ask on the call: You need a modality inventory, a purpose map, and an output/performance gate memo — not a vibe that “training is always safe.”
Engineer lens: If perform / speak / replay can fire without output_filter_status and commercial_license_id (or explicit refuse), you shipped a demo slogan. If training jobs accept any sensor topic without training_eligible, you shipped a lake with a liability hose.
Any hit means you don’t ship yet.
Non-compliance checklist (red flags)
- No sensor / modality inventory; one undifferentiated training lake
- “Training is fair use / always allowed” staff macros with no counsel memo
- Commercial song, script, or celebrity voice performance with no license gate
- Output filters only on the cloud API — onboard embodied path bypasses them
- World-model updates with no provenance / policy version
- HITL skipped for physical or payment-consequential acts
- Claiming USCO authorship with no human-contribution diary (LE-40)
- Synthetic embodied output unlabeled where LE-32 would require a label
- Invented citation to a “federal TAO safe harbor” in decks or ToS
Side B — What works better (inventory → provenance → filter → performance gate)
What works better: Counsel publishes a TAO design memo: perception/training classes vs output/exploitation classes — framed as target architecture, not enacted harbor.
Product maintains a sensor & modality inventory with purpose and training_eligible. Training and world-model jobs refuse batches without provenance.
Generation and performance paths share LE-17-family filters plus a commercial_performance_gate. HITL required for consequential acts.
Evidence export joins modality → training_run → output_event → license_or_refuse. Staff training: Design as if TAO split were the compliance target — never invent a statute.
Fixed user story: Demo request arrives → classify as output/performance → filter ©/TM/likeness → license check → HITL if consequential → allow or refuse with exportable row. Separately: nightly training → only training_eligible modalities → provenance log → policy version pinned.
Compliance checklist (green flags)
- Sensor/modality inventory live; high-risk rows counsel-signed
- Training jobs require provenance +
training_eligible
- Output / performance paths can’t bypass filters
- Commercial performance refuses without license or counsel waiver id
- HITL on consequential embodied acts (LE-44 themes)
- Synthetic labels where required (LE-32)
- Authorship claims backed by LE-40 evidence when asserted
- No “federal TAO safe harbor enacted” language in product or marketing
Template: Lawyer / Engineer card
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
| Lawyer | Engineer |
|---|---|
| Which modalities may train which models — and under what purpose limits? | Does each sensor topic carry training_eligible + purpose tag enforced at ingest? |
| Can we prove what entered a training run or world-model update? | Do training_runs join batch ids, hashes, policy_version, exclusions? |
| Is this act perception, training, or commercial output/performance? | Is act_class set before perform/speak/replay APIs unlock? |
| Do output filters cover © near-copies, marks, likeness, and voice? | Shared filter service on cloud and onboard paths — no bypass? |
| Is there a license for commercial performance of repertoire / persona? | Does commercial_performance_gate require license_id or hard refuse? |
| When must a human confirm before the body acts? | HITL gate on consequential_act enum (LE-44 adjacency)? |
| Are we overclaiming a nonexistent TAO statute? | CI / copy lint bans “TAO safe harbor” as enacted-law claims? |
Interface / code / data — one-page checklists
Run these as acceptance seeds — not as informal hunches. If you can’t export the Data row, you didn’t finish.
Interface (must-show): Operator consoles that separate perceive / train controls from perform / publish controls; clear refuse reasons when filters or licenses block a demo; synthetic labels on generated media where required; HITL confirm UX for consequential acts.
Interface (must-not): One “AI magic” button that trains and performs without classification; celebrity-voice presets without license state; marketing claims that “federal law safe-harbors all robot training.”
Code: modality_inventory + counsel sign-off; ingest enforces training_eligible; training_run provenance required; act_class on output APIs; shared output filters; commercial_performance_gate; HITL for consequential acts; copy-lint against enacted-harbor overclaim.
Data: sensor_modality_inventory; perception_events (purpose, retention_class); training_runs / world_model_updates (batch, hash, policy_version, exclusions); output_events (filter scores, ruleset_version); commercial_performance_gates (license_id or refuse_code); hitl_confirmations; optional authorship_diary_refs (LE-40).
Lost vs fixed (scene card)
| Lost | Fixed | |
|---|---|---|
| Opening move | “It learns like a person” | Classify act: perceive / train / output / perform |
| Sensors | One training lake | Modality inventory + purpose + eligibility |
| Training | No provenance | Batch / hash / policy_version logs |
| Demo song / voice | Ship for the booth | Filter + commercial license gate or refuse |
| Consequential act | Autonomy default | HITL (LE-44 themes) |
| Proof | Slack archaeology | Exportable TAO evidence join |
| Counsel deck | “We have a TAO safe harbor” | “We design to the TAO split target — law evolving” |
Try this on your product tomorrow
Screenshots and exports beat opinions.
- List every sensor and data modality on one embodied SKU. Mark
training_eligibleyes/no with a purpose.
- Pick last week’s training job — can you export what went in?
- Attempt a commercial song or celebrity-voice performance in staging without a license id — does the API refuse?
- Confirm onboard and cloud generation share the same filter ruleset version.
- Trigger a consequential act (payment, unlock, physical push) — is HITL mandatory?
- Search decks/ToS for “TAO safe harbor” as enacted law — delete or rewrite as design-target language.
- If you claim copyright in an output, open the LE-40 diary path — or stop claiming.
Where this goes next
Keep the loop moving — Law → Interface → Code → Data → Counsel sign-off.
- Generative © / publicity filters — Chapter 28 (LE-17) — sibling output gates for non-embodied surfaces.
- Synthetic media labeling — Chapter 27 (LE-32).
- USCO human authorship — Chapter 15 (LE-40).
- NIL / likeness licenses — Chapter 13 (LE-29); continuous monitoring LE-37.
- Agentic HITL / mandates — Chapters 6 / 6B (LE-43…47).
- Enterprise no-training defaults — Chapter 26 (LE-31) when units enter customer premises.
- Pattern Map LE-59 — Chapter 32.
Field rule — put this on the release checklist: Perception may feed a model. Performance still needs a license story — and a log.
This chapter is for education and discussion. It isn’t legal advice. Re-check primary authorities for your facts and jurisdiction before you ship. TAO is a teaching design pattern — not a citation to an enacted federal safe harbor.
This chapter is for education and discussion. It is not legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
Chapter 29 — Worked Example: Automated Trust & Safety Moderation Stack (Lost vs Fixed)
Pattern family: Automated trust & safety moderation stack (LE-36)—classifier ensemble + human queues + policy-as-code taxonomy + appeal + audit; not a substitute for DMCA (LE-15), TAKE IT DOWN / NCII (LE-11), or other statutory intakes
Legal anchors: Soft orientation only. Platform ToS / AUP enforcement at scale; knowledge and response documentation themes when policies address illegal or high-risk UGC; FOSTA-adjacent sex-trafficking facilitation risk themes for covered services (design and knowledge narratives—not a claim that any particular classifier satisfies FOSTA); CSAM → preserve + NCMEC CyberTip path (18 U.S.C. § 2258A themes) as a mandatory parallel when facts fit; NCII / TAKE IT DOWN clocks (LE-11) stay separate; § 512 notice process (LE-15) stays separate. State AG and FTC unfairness themes when enforcement is arbitrary, unexplained, or silently model-drifted. No invented “safe harbor by ML” doctrine.
As of September 2026: Confirm CSAM reporting duties, TIDA process maturity, and your policy taxonomy version before treating automation as “coverage.”
Why this memo exists
Trust & Safety is queues, SLAs, and appeals — not one “Report” button feeding every legal class into the same blob.
Moderation is a product with evidence needs. Decisions need actors, reasons, and exportable trails.
The story in one glance
A classifier ensemble auto-removes posts. Nobody can explain which policy fired. Appeals are a void. Statutory intakes (DMCA, TAKE IT DOWN) share the same black-box queue. Audit asks for a disposition; ops has a confidence score.
What loses — don’t ship this: taxonomy-free auto-mod; no human queue for edge scores; appeals without an actor; statutory doors collapsed into “AI safety.”
What works better — build this with counsel: policy-as-code taxonomy; classifier → queue → appeal → audit; separate doors for DMCA / NCII / CSAM; exportable disposition with policy version.
Picture a viral pile-on hitting the queue. Ask: do classifiers, human review, and appeals share one evidence pack — or three tools that don’t talk?
Why this is an engineering problem
An automated Trust & Safety stack without a real taxonomy is a black box with a kill switch. You’ll struggle to explain why one post died and another lived.
This chapter is the moderation operating system: classifier ensemble, human queues, policy-as-code taxonomy, appeal, and audit. It’s not a substitute for DMCA (LE-15), TAKE IT DOWN / NCII (LE-11), or other statutory intakes—those keep their own doors.
| Concern | What good stacks prove | Typical miss |
|---|---|---|
| Taxonomy | Each action maps to a written policy class + version | Vibes-based “remove harmful” |
| Knowledge | When the system scored / queued / noticed content | Undated Slack deletes |
| Response | What action, by whom, under which rule | Auto-purge with no row |
| Statutory parallel | DMCA / TIDA / CSAM paths unmerged | One form to rule them all |
| Appeal | Eligible user challenges with SLA | Ghost bans with no notice |
| Drift | Model/ruleset changes evaluated before prod | Silent weekly weight drop |
Field rule — put this on the release checklist: Classifiers propose priority. Policy-as-code + humans dispose inside authorized bands. Statutory intakes remain first-class doors—automation may assist; it must not absorb them.
Side A — What loses
Don’t ship this. If your current build matches Side A, stop the release train and fix it with counsel.
What goes wrong: A single “Report content” funnel. CSAM, nonconsensual intimate imagery, copyright, hate, and spam share one schema. A vendor model auto-removes at score ≥ 0.7 with no written mapping to policy sections. Shadowbans apply without user notice. Appeals are a Twitter DM to a founder. Model upgrades deploy Friday night; false-positive rates double; nobody can diff model_version. DMCA agents exist on paper but agents tell reporters “our AI already handles IP.” Intimate-image victims are told to “use the report button” and wait in the same queue as spam. CSAM hits are “deleted hard” with no preserve / CyberTip workflow.
Why this matters in court / before a regulator:
- Merged intakes. Statutory elements and clocks differ; a shared inbox destroys proof and SLAs.
- Auto-remove outside policy. If the model’s ontology ≠ the public rules, enforcement is arbitrary.
- Missing CSAM path. Deletion without preserve + report themes is a compliance failure mode—not “extra safety.”
- Undocumented knowledge. Litigation and regulators ask what you knew and when; scores without durable logs are amnesia.
- Appeals without a real path. Strikes that affect livelihood with no challenge path fuel unfairness narratives.
- Silent drift. Yesterday’s allow is tomorrow’s ban with no ruleset version bump.
Lawyer lens — what I’d ask on the call: Automation can support ToS enforcement and triage; it doesn’t create a general immunity. Keep § 512, § 223a / NCII, and § 2258A workflows legally distinct. Document why auto-actions fall inside published policy.
Engineer lens: If DELETE FROM posts runs from a raw model score without policy_class_id, ruleset_version, and an allowlisted action enum, you shipped a random number generator with root.
Any hit means you don’t ship yet.
Non-compliance checklist (red flags)
- One report form / one queue for copyright + NCII + CSAM + spam
- Auto-remove categories not listed in written, versioned policy
- No
model_version/ruleset_versionon decisions
- Shadowban / suppress without audit controls and counsel policy
- No appeal path for eligible enforcement actions
- CSAM: delete-only; no preserve + CyberTip id
- TIDA/DMCA tickets aged in the “AI moderation” backlog
- Eval harness absent; prod model swaps unreviewed
- Inconsistent appeal SLAs by revenue
Side B — What works better (LE-36)
Fixed building blocks
- Policy-as-code taxonomy. Versioned classes (spam, malware, hate, non-statutory IP AUP, etc.) with allowed auto-actions and human-required bands—counsel signs each ruleset version.
- Report UX by taxonomy. User-facing reasons map to classes; separate entry points (or unmistakable first-step forks) for copyright (LE-15), intimate imagery (LE-11), and CSAM—never “other” as the only CSAM path.
- Ensemble → priority queues. Scores prioritize; humans decide at thresholds policy sets; auto-remove only for classes explicitly authorized.
- CSAM fail-closed. Suspected CSAM → preserve (limited) + NCMEC CyberTip workflow + specialized queue—not generic delete.
- Appeal path. Eligible strikes: notice, reason class, appeal form, SLA, outcome log.
- Audit log.
model_version, scores,policy_class_id,ruleset_version, reviewer_id, action, content_snapshot_ref, appeal_id, CyberTip ids.
- Drift control. Offline eval gate before promoting models; canary + rollback; parity tests against golden sets including minority-language and edge cases.
- Public enforcement ladder summary. Users can understand warn → restrict → terminate themes without reading the model card.
Method notes moderation stacks commonly encode
Decision service: Input content refs → feature extraction → ensemble scores → proposed_action constrained by ruleset allowlist → either execute (auto band) or enqueue (human band). Unknown class → human, never auto-purge.
Human ops: Priority = f(severity class, score, virality, reporter type). Reviewer UI shows policy snippet for the class (not a free-text “whatever feels right”). Dual-control for mass actions.
Statutory routers:
- Copyright elements detected / user selects © → LE-15 ticket schema + clocks.
- Intimate nonconsent → LE-11 48-hour themes.
- CSAM → preserve + CyberTip; law-enforcement export path ACL’d.
Automation may pre-fill or prioritize; it must not replace forms or clocks.
Appeals: State machine open → under_review → upheld / overturned / modified; overturn restores content only if still lawful under other policies; notify user.
Shadowban / visibility filters: If used at all, treat as high-risk actions—policy authorization, audit, and measurable limits—not a silent default for inconvenient speech.
Compliance checklist (green flags)
- Taxonomy versioned; counsel sign-off artifact stored
- Auto-action enum ⊆ policy allowlist for that class
- Separate public doors for DMCA / TIDA / CSAM
- Suspected CSAM → CyberTip id recorded
- Appeals SLA measured and met for eligible actions
- Every enforcement row has model/ruleset versions + snapshot ref
- Model promotion blocked on failed eval gate
- Export pack reconstructs knowledge → response timeline
Template: Lawyer / Engineer card
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
| Lawyer | Engineer |
|---|---|
| Which policy classes may auto-remove without a human? | Is proposed_action constrained by ruleset allowlist—not raw score? |
| Are DMCA, TIDA/NCII, and CSAM intakes unmerged? | Distinct schemas, menus, clocks, and routers? |
| Can we show what we knew and when for a piece of content? | Durable scores, queue times, reviewer actions, snapshot refs? |
| Is there an appeal path proportional to strike impact? | Appeal state machine with SLA metrics? |
| Who signs ruleset / model promotions? | Counsel + safety owners on version bump; eval gate in CI/CD? |
| CSAM: preserve + report, not delete-and-forget? | CyberTip workflow ids; ACL’d LE export? |
| Are shadowbans authorized and auditable? | Shadow actions logged and policy-scoped—or prohibited? |
Interface / code / data — one-page checklists
Run these as acceptance seeds — not as informal hunches. If you can’t export the Data row, you didn’t finish.
Interface (must-show): Report taxonomy with clear forks to statutory intakes; reporter status for non-CSAM where offered; notice of enforcement with reason class; appeal entry for eligible actions; public summary of enforcement ladder; ops consoles showing queue SLA and policy snippet per class.
Interface (must-not): Single undifferentiated “Report”; CSAM only under “Other”; auto-ban messages with no reason class; appeal that only exists in a help-center novel; user-facing “the AI decided” with no policy anchor.
Code: Ensemble scoring service; ruleset-constrained auto-actions; human queue priorities; statutory routers; CSAM preserve + CyberTip; appeal state machine; eval gate on model/ruleset promote; shadow-action audit hooks; fail closed on taxonomy miss.
Data: moderation_events (content_id, scores, model_version, policy_class_id, ruleset_version, proposed_action, final_action, reviewer_id, at); content_snapshot_refs; appeals; cybertip_reports; links to dmca_notices / tida_requests when routed. Retention: safety + legal horizon; minimize sensitive media access via ACL and short-lived URLs.
Ops: On-call for CSAM/TIDA SLAs separate from spam; weekly drift review; never staff statutory queues only with “the model will catch it.”
Soft practice themes (educational only)
Orientation only—not a shipping rule and not a substitute for counsel’s memo on your facts.
- Automation scales ToS enforcement; it does not replace statutory notice regimes.
- Document knowledge and response—amnesia is a design flaw.
- CSAM reporting duties are not optional product polish.
- Appeals and consistent taxonomies reduce arbitrary-enforcement narratives.
- Keep FOSTA, § 512, and TIDA analyses with counsel—don’t let an ML vendor pitch “compliance complete.”
- This chapter never asserts that a given ensemble “satisfies” any statute.
Try this on your product tomorrow
Screenshots and exports beat opinions.
- Open Report from a media page—can you reach DMCA, intimate-image, and CSAM/abuse paths without guessing?
- Force a high spam score in staging—does auto-remove only fire if the ruleset allowlists it?
- Promote a new model weights file—does an eval gate block on failed golden-set thresholds?
- Issue a strike—does the user get a reason class and an appeal entry when eligible?
- Simulate suspected CSAM in a secure test harness—preserve + CyberTip path, not hard-delete-only?
- Export one content_id’s full moderation timeline for counsel.
Where this goes next
Keep the loop moving — Law → Interface → Code → Data → Counsel sign-off.
AI decision logs / criteria versions / CoT containment / Legal retrieval — Chapter 6F (LE-66) deepens logging without replacing this stack. TIDA consent ledger — Chapter 5B (LE-61).
DMCA intake (LE-15, Chapter 9) and repeat-infringer (LE-16) remain parallel. TAKE IT DOWN / AV (LE-11 / LE-10, Chapter 5) for intimate and age gates.
Generative filters (LE-17) and synthetic labels (LE-32) feed classes into this stack but don’t replace it. Chatbot safety (LE-38) when the “content” is a turn-by-turn agent.
Anti-piracy fingerprinting (LE-35) when rights-holder matching is in scope—still not a § 512 substitute. Operating model: counsel signs taxonomy versions like code releases.
This chapter is for education and discussion. It is not legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
Chapter 30 — Worked Example: Multi-Jurisdictional Privacy UX Pack (Lost vs Fixed)
Pattern family: Multi-jurisdictional privacy UX pack (LE-42)—geo/profile-driven notice, consent, and rights templates; congruence with policy ↔︎ tag scanner (LE-41), notice-at-collection / rights UX (LE-06), sale/share / GPC (LE-07), and cookie/SDK gating (LE-08)
Legal anchors: Soft orientation only. Region-aware packaging of distinct legal machines: EU/UK transparency + consent themes for non-essential cookies/trackers (GDPR Arts. 13/14; ePrivacy-style consent) versus California / US state notice-at-collection, sale/share opt-out, and GPC honor themes (CCPA/CPRA / 11 C.C.R. § 7025-style signals)—don’t conflate Accept-all consent with DNS-Share. FTC Act § 5 deception when the banner region, the policy schedule, and live tags disagree. Dark-pattern bans on unequal reject/accept prominence where those rules apply. One global banner isn’t “GDPR + CPRA done.”
As of September 2026: Confirm state privacy amendments, GPC expectations, and EU/UK cookie guidance for your facts before freezing template ids.
Why this memo exists
Multi-jurisdiction privacy UX asks a product question: which privacy pack runs where, and can you prove it?
Jurisdiction is a product input. One global banner that lies about rights is worse than a boring correct one.
The story in one glance
One cookie banner serves the world. Bright Accept All, tiny Reject. California visitors still see “Please consent.” GPC arrives; ads still fire. EEA first paint shows marketing hosts before any choice. Diligence gets a Figma of today’s modal.
What loses — don’t ship this: one global banner; GPC ignored; WebViews strip the CMP; geo-only resolver; policy PDF and network tab disagree.
What works better — build this with counsel: region/profile resolver selects a template; EU/UK consent gates non-essential loaders; CA/US centers notice + Do Not Sell/Share + GPC; tag gateway honors both; congruence scanner keeps schedules honest.
Picture a user in California, another in the EEA, and a third on a VPN. Ask: which region pack actually ran — and can you prove it?
Why this is an engineering problem
One cookie banner can’t honestly serve every privacy machine your users live under. U.S. state opt-out themes and EU/UK consent themes are different legal engines—even when the pixels look the same.
Consent-to-process and sale/share-opt-out are different architectures wearing the same “privacy popup” costume. This chapter packs the multi-jurisdictional UX: geo (or account) routing, notice that matches live tags, GPC / sale-share honor, and a congruence scanner so the policy PDF and the network tab stop disagreeing.
| Machine | Typical geos (illustrative) | What the UX must do | Wrong costume |
|---|---|---|---|
| Consent / non-essential gate | EEA/UK (and peers counsel maps) | No non-essential tags until category permission; equal-prominence reject where required | CA-style “Do Not Sell” only |
| Sale/share opt-out + GPC | CA and other US states with sale/share / signal rules | DNS-Share / Limit Use entry; honor Sec-GPC; suppress CCBA vendors |
Forcing Accept-all before browsing |
| Notice + rights | Broadly, with local content | Notice at/before collection; know/delete/correct (and peers) portal | Banner without rights fulfillment backend |
| Congruence | Everywhere you make statements | Live SDKs match policy schedule | Pretty CMP + secret pixels |
Field rule — put this on the release checklist: Resolve region/profile → template_id → gates. US opt-out ≠ EU consent. If the tag gateway can’t honor both
consent_stringandgpc_honoredper template, the pack is a skin.
Pair always with LE-41: a correct banner over an undisclosed pixel inventory is still a congruence failure (Chapter 4).
Side A — What loses
Don’t ship this. If your current build matches Side A, stop the release train and fix it with counsel.
What goes wrong: Product ships one CMP config globally. Copy is a hybrid: “We value your privacy. Accept All to continue.” Reject All is a text link. California users must Accept to dismiss, then hunt for Do Not Sell in the footer. Sec-GPC: 1 arrives; ads still fire. EEA first paint HAR shows marketing hosts before any choice. Mobile app uses a different SDK set; in-app WebView loads the site without the CMP bridge. Geo-IP alone mis-assigns travelers and VPN users with no profile overlay. Localization vendors translate Accept but leave Reject in English. Diligence asks for evidence; the team provides a Figma of the banner.
Why this matters in court / before a regulator:
- Conflated machines. Consent banners in opt-out jurisdictions (and vice versa) create both dark-pattern and deception narratives.
- Pre-consent noise. Non-essential tags in the first burst break the EU/UK story regardless of later clicks.
- GPC claimed but not enforced. Preference center claims honor while the gateway never suppresses.
- Geo-only resolver. Ignores account profile region, billing address policy, or user-selected locale rules counsel may require.
- Channel split. Web CMP ≠ app SDK init ≠ server-side CAPI.
- Evidence vacuum. No
template_id, consent string, or GPC event tied to the session inventory snapshot.
Lawyer lens — what I’d ask on the call: You need to explain which template applied, why, and what was suppressed. A universal banner screenshot doesn’t answer a CPPA or EDPB-style inquiry. Don’t invent that geo-IP alone is mandated or sufficient.
Engineer lens: If bootstrap.js injects marketing pixels before reading region template output—and before GPC middleware—the CMP modal is animation.
Any hit means you don’t ship yet.
Non-compliance checklist (red flags)
- One global Accept-all banner for all geos
- Reject harder than Accept where symmetry is required
- Non-essential hosts in pre-interaction HAR (consent regions)
- GPC present but sale/share vendors still load
- DNS-Share UI while share-for-ads continues (LE-07)
- Notice-at-collection missing at first PI collection (LE-06)
- App / WebView / server-side paths outside the pack
- Geo-IP only; no documented resolver policy
- Localization drift (controls missing in some languages)
- No export of region, template_id, consent_string, gpc_honored
- Policy schedule ≠ live register (LE-41 red)
Side B — What works better (LE-42)
Fixed building blocks
- Region / profile resolver. Inputs counsel defines (IP geo, account region, shipping/billing, explicit locale—priority documented). Output:
template_id+region_code.
- Template pack. Separate templates at minimum for: (a) consent-gate regions, (b) US sale/share + GPC regions, (c) notice-only / lighter-touch regions as counsel maps—not one hybrid modal.
- Consent template behaviors (LE-08). Categories; Reject All ≈ Accept All prominence where required; no non-essential pre-checks; reopen “Cookie settings.”
- Opt-out template behaviors (LE-07). DNS-Share / Limit Use entry; preference center shows GPC honored; no account wall for device-level signal effect.
- Notice + rights (LE-06). Notice link/content at first collection; rights portal with verification and clocks—banner isn’t fulfillment.
- Tag gateway. Wrapper/edge: load non-essential only if template+consent allow; if GPC/DNS suppress, block the same vendor set end-to-end.
- Congruence (LE-41). Register → policy schedule → CMP allowlist; CI/runtime diffs.
- Evidence. region, template_id, consent_string / categories, gpc_honored, DNS impressions, cmp_version, inventory snapshot id.
Method notes privacy UX packs commonly encode
Resolver policy (documented): Example theme—prefer account privacy_region when set; else request geo; allow user correction in settings; log resolver_source. Avoid silent “Accept because we thought you were in Nevada” when profile says Berlin.
Template table: template_id → {banner_component, gate_mode: consent|opt_out|notice, gpc_required, equal_reject, vendor_allowlist_ref, rights_entrypoints}.
Edge / app bridge: Middleware reads Sec-GPC and template; sets sale_share_opt_out before tag bootstrap. Native SDK init reads the same flags via consent bridge—WebView must not bypass.
Cross-chapter congruence:
- LE-08 owns wrappers and kill switches.
- LE-07 owns GPC/DNS suppress identity.
- LE-06 owns notice content and rights tickets.
- LE-41 owns inventory ↔︎ policy truth.
LE-42 is the packaging and selection layer—not a fourth conflicting CMP.
Compliance checklist (green flags)
- Resolver emits
template_id; UI and gateway consume the same id
- Consent-region HAR quiet for non-essential pre-choice
- Opt-out-region: DNS-Share + GPC suppress without mandatory Accept
- Reject / Accept prominence per template rules
- App, WebView, server-side CAPI on the same bridge
- Rights portal reachable and ticketed (LE-06)
- Congruence scanner green for the policy version shown
- Exportable evidence row per session/decision
Template: Lawyer / Engineer card
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
| Lawyer | Engineer |
|---|---|
| Which geos/profiles map to consent-gate vs sale/share-opt-out templates? | Is template_id selected by a documented resolver and enforced in the tag gateway? |
| Are we showing Accept-all where the law machine is opt-out (or the reverse)? | Separate banner components—not one hybrid with hidden links? |
| Does GPC suppress the same vendors as DNS-Share? | Edge sets sale_share_opt_out before bootstrap; wrappers honor it? |
| Is notice-at-collection present when PI first collects? | Notice component tied to collection surfaces; impressions logged? |
| Can rights requests meet statutory clocks? | LE-06 ticket workflows with deadlines—not banner-only? |
| Do mobile and WebView tell the same story as desktop? | Consent bridge shared; WebView cannot load naked marketing HTML? |
| Can we prove what a user in region R saw on date T? | Export: region, template_id, consent_string, gpc_honored, cmp_version, inventory snapshot? |
Interface / code / data — one-page checklists
Run these as acceptance seeds — not as informal hunches. If you can’t export the Data row, you didn’t finish.
Interface (must-show): Region-appropriate banner/template; equal-prominence Reject where the consent template requires it; DNS-Share / Limit Use entry on opt-out templates; preference center reflecting GPC honor; notice-at-collection link/content; Cookie/privacy settings reopen; rights portal entry; language parity for material controls.
Interface (must-not): One global Accept-all; reject buried; consent paywall where opt-out is the machine; account required to effect GPC; footer “Do Not Sell” while the only real control is a disconnected CMP; translated Accept with missing Reject.
Code: Resolver → template_id; tag gateway branches on gate_mode; consent wrappers if (!allow(vendor)) return; GPC middleware; shared app/web bridge; kill switch < minutes; LE-41 CI diffs; fail tests when template and gateway disagree.
Data: privacy_ux_events (region, resolver_source, template_id, consent_string, categories, gpc_signal, gpc_honored, dns_impression, cmp_version, at); links to vendor_inventory_snapshots / congruence_diffs; rights tickets from LE-06. Retention: regulatory inquiry horizon counsel sets.
Ops: Template matrix owned jointly by privacy counsel + eng; localization QA on controls (not marketing fluff only); traveler/VPN edge cases documented; never “ship EU banner everywhere to be safe” without checking US dark-pattern and confusion costs—map, don’t blindly maximize.
Soft practice themes (educational only)
Orientation only—not a shipping rule and not a substitute for counsel’s memo on your facts.
- US opt-out ≠ EU consent—teach the two machines in every release review.
- LE-42 packages LE-06 / 07 / 08; LE-41 keeps them honest against live tags.
- One global banner is a failure mode, not a simplification win.
- Evidence is region + template + signals + inventory—not a screenshot.
- Don’t invent that a particular CMP vendor is legally required.
- This chapter never asserts that a given template pack “achieves GDPR/CPRA compliance.”
Try this on your product tomorrow
Screenshots and exports beat opinions.
- Fresh browser profile from an EEA test egress—HAR before click: any marketing host? Reject vs Accept prominence?
- CA profile with
Sec-GPC: 1—do sale/share vendors stay quiet without Accept-all?
- Flip account
privacy_regioncontrary to IP—does resolver policy behave as documented?
- Open the same flow in mobile WebView—CMP bridge present or naked pixels?
- File a deletion request—does LE-06 ticketing start, or does the banner absorb the ask?
- Export one session: template_id, consent/GPC fields, and inventory snapshot id aligned to the public policy version?
Where this goes next
Keep the loop moving — Law → Interface → Code → Data → Counsel sign-off.
Deep dive congruence scanner and vendor register (LE-41, Chapter 4). Sale/share and GPC mechanics (LE-07). Cookie/SDK wrappers (LE-08). Notice and rights fulfillment (LE-06). COPPA / under-13 overlays (LE-09) when child-directed modes empty the non-essential inventory. Enterprise AI no-training promises (LE-31) when privacy notices also discuss model improvement. Operating model: counsel signs template matrix versions the same way engineering signs gateway builds.
This chapter is for education and discussion. It is not legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
Chapter 31 — Operating Model
Audience: General counsel / product counsel, eng leads, release managers, Law Engineers.
As of September 2026.
The problem in plain English
Let’s talk staffing and release gates — who owns legal meaning before production.
Code is policy because I’ve seen judges read the product, not the press release. Counsel signs meaning; eng ships gates under that ownership.
Why an operating model exists
Friday afternoon. The release train is boarding. Staging looks green. Growth wants the flag on. Counsel has a memo from last month. Engineering has a screen that changed yesterday. Nobody can say who owns the gate.
You have walked the method loop (Chapter 1) and a stack of worked examples. This chapter answers a different question: who owns the gate when the release train is about to leave?
A beautiful pattern that never hits a release checklist is decoration. Law Engineering only works when a lawyer + engineer pair shares the same four truths: what the user sees, what the API refuses, what evidence is stored, and who may flip production on.
Code is policy because I have seen judges read the product, not the press release. The stack you ship is the compliance program the user actually got.
Treat this like the “how we ship” chapter. Keep it on the bench next to every LE-tagged ticket.
The Pattern Map (Chapter 32) tells you which teaching chapter to open. The title index (Chapter 33) is the short name list. This chapter is who signs and what can block the merge.
Staffing: lawyer + engineer (minimum viable pair)
You don’t need a fifty-person legaltech org. You need a named pair who won’t ship past each other.
Remember: a Law Engineer is a licensed attorney with software and product expertise. Engineers build the gates under that counsel’s oversight. They are essential colleagues. They aren’t titled Law Engineers.
| Role | Owns | Does not own alone |
|---|---|---|
| Law Engineer / product counsel (licensed attorney) | Legal meaning of the requirement; materiality of Terms/policy changes; copy approval; jurisdiction matrix; “fail closed vs fail open”; sign-off | Writing production code alone; picking frameworks for aesthetics; non-attorneys using the title “Law Engineer” |
| Eng lead / owning squad | Gates, events, schemas, tests, kill switches, deploy brakes, observability | Deciding what “assent,” “sale/share,” or “valid TIDA request” means |
| Product / design | Wireframes at the moment of the legal act; accessibility; equal-prominence choices | Inventing legal theory to unblock a dark pattern |
| Trust & Safety / privacy ops (when in scope) | Queues, SLAs, fulfillment clocks, vendor suppress runbooks | Replacing counsel on covered-platform or harbor analysis |
| Release manager | Checklist enforcement; blocking merge/deploy without sign-off artifact | Waiving legal gates for “just this sprint” |
Minimum pair for any LE-tagged story: one named counsel owner + one named eng owner. If either is missing, the story stays in design — it doesn’t ship.
For high-stakes verticals (adult age verification, intimate-image removal, payments, AI advice-shaped products), add a named ops owner for the queue or vendor path.
Counsel sign-off
Sign-off isn’t a Slack emoji. It’s a recorded artifact tied to a version—so discovery and civil investigative demands meet something boring and complete instead of a scavenger hunt.
What counsel signs
- Law cue — the engineering-relevant requirement in one testable sentence (from the teaching chapter or your internal card).
- Interface — wireframes or production-equivalent screens at the legal act (including mobile breakpoints).
- Code gates — list of endpoints/jobs that must refuse without the event.
- Evidence pack — fields that will be exportable on demand.
- Materiality / re-consent — whether a document or disclosure change requires re-assent.
- Fail posture — fail closed (block the act) vs fail open (allow with ticket) — counsel chooses; eng implements.
- Agentic / AI paths — explicit confirmation that no probabilistic path bypasses deterministic gates (see below).
Sign-off artifact (minimum fields)
| Field | Example |
|---|---|
pattern_ids |
LE-01, LE-03 |
product_surface |
checkout_ios, billing_web |
doc_or_template_versions |
Terms 2026-09-14, ROSCA disclosure d-14 |
counsel_id / timestamp |
Attorney initials + UTC |
eng_owner / commit or release id |
SHA or release train |
exceptions |
legal_exception_id or none |
revisit_trigger |
Statute effective date, vendor change, new geo |
Store it where release tooling can query it (ticket custom field, signed markdown in repo, or GRC tool). Discovery is easier when the artifact is boring and complete.
Release gates
Treat Law Engineering gates like security gates: merge and deploy can fail them. If a legal-act story can merge without a pattern tag or sign-off path, you have a wish—not a gate.
Before merge (CI / review)
| Gate | Pass condition |
|---|---|
| Pattern tagged | Story/PR lists LE ids or “no legal act” rationale |
| Assent / disclosure components | Required UI components present in experiment allowlist (no silent A/B removal) |
| Vendor / tag register | New pixels/SDKs on approved register or legal_exception_id (LE-08 / LE-41) |
| Acceptance tests | Given/When/Then seeds for the pattern’s Code row are green |
| Eval harness (AI) | Jailbreak / refusal suites green where LE-30 / LE-38 apply |
Before production traffic
| Gate | Pass condition |
|---|---|
| Counsel sign-off artifact | Present for this surface + version |
| Evidence write path | Staging export of the evidence pack succeeds |
| Kill switch | Documented vendor/feature kill switch tested |
| SLA clocks | If TAKE IT DOWN / DMCA / rights / breach clocks apply, deadline math verified on server time |
| Agentic checklist | No tool may “agree,” “buy,” “opt in,” or “cancel” without the deterministic gate (below) |
Hotfix / rollback
Legal defects (missing assent, Global Privacy Control ignored, cancel dead-end, age-verification bypass) are sev-legal: roll back or kill-switch first; debate copy later. Don’t leave a noncompliant surface up while “we file a ticket.”
How to evolve patterns when the law changes
The guide is living on purpose. When the statute, the AG letter, or the product surface moves, you don’t rewrite a novel—you run a small change protocol.
- Detect — statute effective date, vacated/replaced rule, new AG guidance, or published opinion that shifts an engineering takeaway. Stamp an As-of date on the teaching note.
- Orient — counsel updates the Law cue in one testable sentence. If the opinion is new or narrow, say what is verified vs UNVERIFIED pending memo—don’t stretch an unpublished or pleading-stage point into a shipping rule.
- Diff the stack — which UI surfaces, gates, and evidence fields break? Open eng tickets from the Law cue, not from a long email.
- Version — bump disclosure/Terms/
template_idas needed; setrequires_reconsentwhen material (formation, arbitration, pricing, privacy sharing).
- Re-test — re-run acceptance tests; refresh sign-off artifact.
- Publish — update the teaching chapter note and your edition stamp; retire stale copy in the consent management platform / CMS.
Example (subscriptions, as of September 2026): FTC 2024 Negative Option Rule amendments were vacated; design stays on ROSCA § 8403 + FTC Act § 5 + state automatic-renewal law (see Chapter 3). When a new NPRM/final rule lands, update LE-03/LE-04 and re-sign checkout — don’t keep shipping to vacated text.
Example (adult age verification): Free Speech Coalition v. Paxton (2025) upheld Texas H.B. 1181 under intermediate scrutiny — it does not auto-validate every state statute or every vendor method. State matrix + method sign-off stay mandatory (LE-10).
Don’t ship probabilistic assent
Agents, chatbots, and “buy for me” flows are accelerating. That’s exciting for product. It’s dangerous for legal acts.
Duties that require notice + assent, express consent, opt-out honor, or human confirmation remain deterministic. The model can draft. The gate disposes.
Hard rules
| Rule | Meaning in the stack |
|---|---|
| No silent assent | A model may not check “I agree,” accept Terms, or bind the company by tool-call side effect. |
| No inferred cancel / no inferred opt-in | Natural-language “sure, cancel” must map to a recorded cancel API with user-visible confirm where the pattern requires it — or hand off to a human in the loop (HITL). |
| Propose ≠ dispose | Large language models draft and recommend. Gates dispose: terms_acceptance, consent_event_id, sale_share_opt_out, hitl_confirm_id, av_status=passed. |
| Server-side truth | Client or agent claims (accepted=true) are ignored without a one-time UI/HITL event token validated server-side. |
| Disclosure is a component | “AI is not advice” / chatbot transparency lives in the persistent UI (LE-30 / LE-38), not only in Terms. |
| Eval before release | Prompt-injection and “agree for the user” jailbreaks fail closed in CI for agentic surfaces. |
Anti-patterns (block these)
- Checkout agent that taps Pay after paraphrasing Terms the user never saw.
- Support bot that “cancels” by opening a ticket without calling the cancel endpoint (LE-03).
- Preference agent that re-enables sale/share after Global Privacy Control without symmetrical affirmative opt-in (LE-07).
- Auto-confirm on high-stakes legal/medical/financial tool calls (LE-30).
Field rule (repeat until muscle memory): Probabilistic systems may propose. Deterministic Law Engineering gates dispose.
Cadence that keeps the library honest
Patterns rot when nobody looks at them. Use a light rhythm so the library stays honest without becoming a second full-time job.
| Cadence | Action |
|---|---|
| Each legal-act PR | LE tag + tests + sign-off path |
| Each release train | Scan open legal_exception_ids; expire or escalate |
| Quarterly | Congruence scan (LE-41); Global Privacy Control / CMP spot HAR; cancel-path click-count QA |
| On law change | Teaching note + As-of bump (protocol above) |
| On new surface | New LE row or new ui_surface value — do not assume web signup covers iOS WebView |
Handoff to the map and index
You have the operating rules. Next:
Chapter 31B — Code Is Policy & Legal Review Triggers (LE-62) — when counsel must join as design partner; ticket/CI trigger taxonomy.
Chapter 32 — Pattern Map — inviting clusters → which chapter teaches each LE.
Chapter 33 — LE-01…LE-67 title index (short names for tickets).
Your own counsel — matter-specific checklists, schemas, and sign-off when you implement.
When you’re ready to ship a gate, open the teaching chapter from the map, run the method loop, and require counsel sign-off before production traffic.
This chapter is for education and discussion. It is not legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
Chapter 31B — Worked Example: Code Is Policy & Legal Review Triggers
Pattern family: Code is policy / Legal review trigger taxonomy (LE-62). Sits immediately after the operating model (Chapter 31) and before the Pattern Map (Chapter 32).
Legal anchors (themes): Product counsel as design partner, not final checkbox; unfair/deceptive practice themes when UI/offers/billing ship without review; privacy / AI / payments / KYC–AV / marketing regimes that attach at build time; A/B tests that alter rights, price, or disclosures as legal acts; industry claim scenes (dark-pattern cancel, deceptive billing, chatter/impersonation monetization) as generic teaching — no company names.
As of September 2026: Wire triggers to your ticket taxonomy and CI — counsel owns which buckets are blocking vs advisory.
Why this memo exists
Code-is-policy means naming which ticket buckets must stop the release train before production.
If ‘code is policy,’ then certain diffs need counsel eyes before merge. Encode the triggers.
The story in one glance
Legal receiving a calendar invite titled “Quick review — already on staging.”
The build changes cancel UX, adds an AI summarizer on user messages, opens a new analytics SDK, experiments on trial price, and tweaks KYC skip logic for “conversion.” Product wants a thumbs-up emoji before tomorrow’s train.
That’s Legal as ornament.
Code is policy. The gates, defaults, copy, and experiments are the compliance program users actually get. Judges and agencies read the product — not the press release.
Walk your last three “quick review” tickets. Ask: which trigger bucket fired before staging? If the answer is “none — we pinged Legal after merge,” the operating model (Chapter 31) is decoration.
This chapter taxonomizes when counsel must enter as a design partner — and how to encode those triggers in tickets and continuous integration (CI) so the operating model is enforceable.
Plain English — buckets that must wake counsel
Use these trigger buckets. Tune with counsel; don’t treat the list as closed.
| Bucket | Examples that fire review |
|---|---|
| AI | New generative/review surface; model/vendor change; ADM-shaped rankers (LE-64…66) |
| Vendors / data-out | New SDK/pixel/API sending personal data; DPA gaps (LE-08 / LE-67) |
| Launches | New geo, SKU, age-gated vertical, high-risk MCC surface |
| UI / offers | Assent, cancel, consent, fee, trial, scarcity, prechecked boxes |
| Payments / virtual economies | Checkout, tips/match, wallets, loot (LE-26 / LE-54 / LE-63) |
| KYC–AV | Age gates, uploader verification, identity vendors (LE-10 / LE-60 / LE-61) |
| Privacy | New fields, retention, DSAR path changes, sale/share (LE-67) |
| Marketing | Claims, endorsements, match promises, “AI-powered” badges |
| Code changing rights | Feature flags that remove disclosure, shorten cancel, skip notice |
| Claims / threats | Demand letters, AG inquiries, Brand remedial programs — freeze related experiments |
Field rule — put this on the release checklist: If an A/B test can change price, rights, or disclosures, it’s a legal act — not a growth toy.
Remember: a Law Engineer is a licensed attorney with software and product expertise.
Scene cards — generic industry failure shapes (no company names)
Dark-pattern cancel. Experiment “hides” cancel behind extra mazes for 50% of users. ROSCA/ARL themes (LE-03 / LE-04) care about the experienced path — not the control branch counsel saw in Figma.
Deceptive billing. Trial-to-paid copy softens on variant B; chargeback evidence (LE-26) no longer matches what users saw.
Chatter / impersonation monetization. Support or companion chat sells premium “human” intimacy while an AI replies — disclosure and monetization claims fail together (Chapter 6).
These scenes are teaching reconstructions. Encode triggers so variants can’t silently regress the legal act.
Review this with counsel and eng on the same call. If Side A matches production, you’re still in the memo-to-coders handoff.
Side A — What loses (“Legal at the end”)
What goes wrong: Tickets lack legal buckets. CI has security lint, not disclosure lint. Experiments platform allows removing “Cancel anytime” from a variant. Vendor SDK merges without privacy inventory (LE-67). AI ships off-register (LE-64). Counsel sees screenshots after App Store submit. Training says “don’t forget to loop in Legal.”
Why this matters in court / before a regulator: Agencies and plaintiffs try the shipped experience. End-of-line review can’t rewind a thousand sessions.
Lawyer lens — what I’d ask on the call: Publish a trigger taxonomy and refuse thumbs-up without artifact (Chapter 31 sign-off).
Engineer lens: If experiment_allowlist can drop assent components, you automated noncompliance.
Any hit means you don’t ship yet.
Non-compliance checklist (red flags)
- No legal trigger field on tickets
- A/B can remove rights/price/disclosure UI
- Vendor/AI/privacy changes without inventory/register updates
- “Quick review” after staging freeze
- Claims bucket ignored when Brand/AG letters arrive
- Company-name war stories in the wiki instead of generic patterns
Side B — What works better (taxonomy → ticket → CI → partner early)
What works better: Trigger taxonomy in eng handbook + ticket required field (legal_trigger_buckets[]). Blocking buckets need counsel design partner named before implementation.
CI: experiment configs lint against forbidden removals (assent, cancel, AV, GPC). New SDK/AI endpoint fails build without inventory/register ids.
Launches checklist pulls Chapter 31 sign-off. Claims/threats set experiment_freeze flags on related surfaces.
Legal office hours during design, not only launch.
Fixed user story: PM files tip-match campaign → buckets payments + marketing + UI → counsel joins design → heuristics + disclosures (LE-63) → experiment allowlist locks required copy → sign-off → ship.
Compliance checklist (green flags)
- Ticket field requires buckets or “no legal act” rationale
- Blocking buckets assign counsel before coding
- Experiment CI forbids regressing legal-act components
- SDK/AI/privacy freshness gates (LE-64 / LE-67)
- Early design partner ritual for high-risk buckets
- Claims freeze path tested
Template: Lawyer / Engineer card
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
| Lawyer | Engineer |
|---|---|
| Which buckets are blocking vs advisory? | Ticket + CI encode the same list? |
| Can any experiment alter rights/price/disclosures? | Allowlist + lint for required components? |
| When must counsel join design vs only sign-off? | Workflow states: design_partner → build → sign-off? |
| How do AG/Brand claims freeze experiments? | experiment_freeze flag kills related tests? |
| Are war stories anonymized? | Templates use generic Brand / scenes only? |
Interface / code / data — one-page checklists
Run these as acceptance seeds — not as informal hunches. If you can’t export the Data row, you didn’t finish.
Interface: Ticket forms with bucket multi-select; counsel design-partner field; experiment console shows legal locks; freeze banners.
Code: Bucket validation; experiment lint rules; registry checks for vendor/AI; sign-off artifact query on deploy; freeze flags.
Data: legal_trigger_events; experiment_configs + lint results; design_partner_assignments; freeze_events; sign_off links.
Lost vs fixed (scene card)
| Lost | Fixed | |
|---|---|---|
| Legal timing | Day-before emoji | Design partner on trigger |
| A/B | Removes cancel copy | Lint blocks regression |
| AI / SDK | Silent merge | Register/inventory gate |
| Claims | Business as usual | Experiment freeze |
Try this on your product tomorrow
Screenshots and exports beat opinions.
- Open five recent PRs that touched checkout, AI, or SDKs — any legal_trigger buckets?
- In experiment config, attempt to hide cancel or fee disclosure — does CI fail?
- Add a fake analytics SDK host — does build require inventory id?
- Confirm Chapter 31 sign-off artifact is queryable by release tooling.
- Replace any client-named war stories in the eng wiki with generic scenes.
Where this goes next
Keep the loop moving — Law → Interface → Code → Data → Counsel sign-off.
- Operating model / sign-off / release gates — Chapter 31.
- Subsidiary / shared-services launch pack — Chapter 31C (LE-72).
- Pattern Map — Chapter 32; LE index — Chapter 33.
- AI register / privacy inventory — Chapters 6D / 7C.
- Cancel / billing / tips — Chapters 3 / 10 / 16D.
Field rule — put this on the release checklist: Code is policy. If counsel only sees the build when it’s done, you hired a checkbox — not a design partner.
This chapter is for education and discussion. It isn’t legal advice. Industry scenes are generic teaching reconstructions — no company names.
This chapter is for education and discussion. It is not legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
Chapter 31C — Worked Example: Subsidiary & Shared-Services Launch Pack
Pattern family: Subsidiary / shared-services launch pack (LE-72). Sits after code-is-policy legal review triggers (LE-62; Chapter 31B) and the operating model (Chapter 31).
Legal anchors (themes): New vertical or Brand as a separate entity; intercompany services agreement; shared IP / tech license; liability delineation; jurisdiction matrix; launch legal checklist as productized gates — not a corporate-law treatise. Cross-ref legal review triggers (LE-62).
As of September 2026: Teaching reconstructions — generic Brand / Acquirer / KYC vendor. No client names or entity charts from live matters.
Why this memo exists
New entities inherit risk. Don’t launch on vibes — checklist the transfers, brands, processors, and gates.
The story in one glance
Growth green-lighting “Brand Vertical B” on the same production cluster as Brand A.
Same ToS URL. Same payout merchant ID. Same privacy notice. Same support macros. Corp says “we’ll paper a subsidiary later.” Payments, AV, and KYC still say the parent’s legal name. When a regulator or Acquirer asks which entity faces users in Geo X, nobody can answer from the stack.
Walk the launch checklist as if a regulator asked “which legal entity faces the user in Geo X?” tonight. If the stack still hard-codes the parent’s name, you aren’t ready.
Launch a vertical as a separate entity only when the pack ships: entity registry, intercompany services, IP/tech license, liability map, jurisdiction matrix, and gated checklist — wired to LE-62 launch triggers.
Plain English — productized launch gates
| Gate | Meaning |
|---|---|
| Entity registry | legal_entity_id, jurisdictions, DBA, registered agent refs |
| Intercompany services | Versioned services agreement (ops, eng, support, G&A) |
| Shared IP / tech license | What subsidiary may use; brand/mark rules (LE-77 adjacency) |
| Liability delineation | Which entity faces users, payees, Acquirer, KYC vendor |
| Jurisdiction matrix | Geo → entity → ToS/privacy/AV/payments profile |
| Launch checklist | Blocking tickets until counsel sign-off artifacts exist |
Field rule — put this on the release checklist: If the app still hard-codes the parent’s legal name everywhere, you launched a skin — not a subsidiary.
Remember: a Law Engineer is a licensed attorney with software and product expertise.
Review this with counsel and eng on the same call. If Side A matches production, you’re still in the memo-to-coders handoff.
Side A — What loses (“same stack, new logo”)
What goes wrong: New logo and domain; identical entity strings in checkout, privacy, and creator agreements. No intercompany services paper. Shared databases without a data-processing story between entities. Acquirer MID still parent-only. Launch checklist is a Notion page nobody blocks on. LE-62 launch bucket unchecked.
Any hit means you don’t ship yet.
Non-compliance checklist (red flags)
- Hard-coded parent legal name in UX
- No
legal_entity_idon contracts / payouts / notices
- Missing intercompany + IP license versions
- Jurisdiction matrix only in counsel’s head
- Acquirer / KYC vendor not updated to entity
- Launch without LE-62 launch-bucket sign-off
Side B — What works better (registry → matrix → gates → ship)
What works better: legal_entities registry. Intercompany services + IP/tech license as versioned artifacts with hashes.
Liability delineation memo summarized into machine-readable facing_roles (user-facing, payee-facing, processor-facing). Jurisdiction matrix drives which ToS/privacy/AV/payments pack the edge serves.
Launch checklist items are blocking ticket states under LE-62 launches bucket. Agreement factory (LE-76) and payee diligence (LE-73) emit the correct entity.
Brand/trademark usage (LE-77) scopes marks per entity.
Compliance checklist (green flags)
legal_entity_idon UX strings, contracts, payouts
- Intercompany + IP license versions on file
- Jurisdiction matrix encoded
- Acquirer / KYC vendor aligned
- LE-62 launch triggers blocking
- Support macros entity-aware
Template: Lawyer / Engineer card
Lawyer column = legal meaning. Engineer column = what must be true in the stack.
| Lawyer | Engineer |
|---|---|
| Which entity faces users in each geo? | Matrix → runtime legal_entity_id? |
| Are intercompany services + IP license signed? | Artifact ids + hashes in launch checklist? |
| Who is liable to Acquirer / payees? | MID / payee contracts match facing_roles? |
| What ToS/privacy pack ships per entity? | Edge selects pack by matrix? |
| Is this a launch legal act under LE-62? | Ticket bucket launches blocking? |
Interface / code / data
Interface: Correct legal name / address / contact in checkout, privacy, creator/affiliate footers; geo-appropriate pack; no parent-name bleed.
Code: entity registry; matrix resolver; launch checklist gate; string catalogs keyed by entity; LE-62 CI for launch tickets.
Data: legal_entities; intercompany_agreements; ip_tech_licenses; jurisdiction_matrix; launch_checklist_events; facing_roles.
Lost vs fixed
| Lost | Fixed | |
|---|---|---|
| Identity | Parent name everywhere | Entity-aware strings |
| Paper | “Later” | Versioned intercompany + IP |
| Geo | Guesswork | Jurisdiction matrix |
| Release | Soft Notion list | LE-62 blocking gates |
Try this on your product tomorrow
Screenshots and exports beat opinions.
- Load Vertical B checkout in Geo X — which legal name appears?
- Is
legal_entity_idon the latest creator agreement emit?
- Open launch ticket — is
launchesbucket required + counsel assigned?
- Confirm Acquirer MID / KYC vendor account matches facing entity.
- Export pack: entity row + intercompany hash + matrix slice + sign-off.
Where this goes next
Keep the loop moving — Law → Interface → Code → Data → Counsel sign-off.
- Legal review triggers — Chapter 31B (LE-62).
- Operating model — Chapter 31.
- Agreement factory — Chapter 2C (LE-76).
- Brand / trademark usage — Chapter 17B (LE-77).
- Pattern Map LE-72 — Chapter 32.
Field rule — put this on the release checklist: A subsidiary launch is a gated product release — entity, paper, matrix, and strings ship together.
This chapter is for education and discussion. It isn’t legal advice or a corporate formation treatise. No client entity charts appear in this teaching reconstruction.
This chapter is for education and discussion. It is not legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
Chapter 32 — Pattern Map (LE-01…LE-77)
As of September 2026.
The problem in plain English
— LE ids to teaching chapters.
This is your quick pointer bench. Find the pattern; open the chapter; run the loop.
Welcome to the map
You don’t have to memorize every LE identifier.
This chapter is a thin, inviting index—not a wall of dense cards and not a substitute for the teaching chapters. Use it the way you use a transit map: find the line (LE id), see which station (chapter) teaches it, then ride there for the lost/fixed story.
Each LE-nn is a named Law Engineering pattern. The worked examples earlier in this guide teach the ones that matter most in the field. Come back here when a ticket mentions an LE id and you need the right chapter fast.
Use with your counsel—not as matter advice.
How to read this map
- Find the LE id your ticket touches.
- Open the reader chapter that teaches it (worked example or method chapter).
- Walk the lost/fixed story with Interface / Code / Data in mind.
- Require counsel sign-off before the gate opens in production (Chapter 31).
Stuck? Start with the cluster that matches your product surface this quarter—formation, privacy, age/Trust & Safety, copyright, marketing, or security/payments/AI—then follow the chapter links.
Cluster A — Formation, subscriptions & price honesty
| LE | Title (short) | Taught in |
|---|---|---|
| LE-01 | Binding online terms (clickwrap / sign-in-wrap) | Ch 2 Formation UX |
| LE-02 | Arbitration / class waiver presentation | Ch 2 (with LE-01) |
| LE-03 | ROSCA / negative option / easy cancel | Ch 3 |
| LE-04 | California ARL | Ch 3 |
| LE-05 | Price transparency / drip / free trial → paid | Ch 3 |
| LE-68 | Subscriber dispute architecture (arb/class/LoL/waiver/indemnity) | Ch 2B |
| LE-76 | Agreement factory (populate + e-sign) | Ch 2C |
Cluster B — Privacy notice, tags, geo packs & COPPA
| LE | Title (short) | Taught in |
|---|---|---|
| LE-06 | CCPA/CPRA notice at collection + rights UX | Ch 4 / Ch 30 |
| LE-07 | Sale / share / GPC opt-out signals | Ch 4 |
| LE-08 | Cookie / SDK / pixel consent & vendor gating | Ch 4 |
| LE-09 | COPPA age gate / under-13 block | Ch 11 (adjacent Ch 5) |
| LE-41 | Privacy policy ↔︎ live tag / SDK congruence | Ch 4 |
| LE-42 | Multi-jurisdictional privacy UX pack | Ch 30 |
| LE-53 | CIPA session replay / chat / content analytics — prior consent | Ch 4B |
| LE-67 | Privacy engineering threshold inventory (11 inputs) | Ch 7C |
Cluster C — Age, intimate imagery, producer records & T&S
| LE | Title (short) | Taught in |
|---|---|---|
| LE-10 | State adult-content age verification | Ch 5 / Ch 11 |
| LE-11 | TAKE IT DOWN Act notice-and-removal | Ch 5 |
| LE-61 | TIDA consent ledger & anti-weaponization | Ch 5B |
| LE-12 | State NCII / revenge-porn reporting | Ch 20 |
| LE-13 | FOSTA-SESTA trafficking risk UX & logging | Adjacent Ch 5 / Ch 29 (counsel depth) |
| LE-58 | Section 230 design line (see also Cluster D / Ch 9B) | Ch 9B |
| LE-14 | § 2257 / 2257A producer recordkeeping | Ch 21 |
| LE-60 | Adult UGC × card-network participant controls (see also Cluster F / Ch 10B) | Ch 10B |
| LE-36 | Automated trust & safety moderation stack | Ch 29 |
| LE-75 | Content advisories & ratings UX | Ch 5C |
Cluster D — Copyright, fingerprinting & generative IP
| LE | Title (short) | Taught in |
|---|---|---|
| LE-15 | DMCA notice / counter-notice intake | Ch 9 |
| LE-58 | Section 230 design line (own speech vs third-party) | Ch 9B |
| LE-16 | Repeat infringer / repeat NCII abuser policy | Ch 18 |
| LE-17 | Generative copyright / publicity filters | Ch 28 |
| LE-59 | Embodied perception / TAO (training vs output) | Ch 28B |
| LE-35 | Automated anti-piracy / fingerprinting | Ch 19 |
| LE-40 | Human authorship evidence (USCO) | Ch 15 |
Cluster E — Marketing, messaging, affiliates & dating ads
| LE | Title (short) | Taught in |
|---|---|---|
| LE-18 | FTC endorsement / affiliate #ad disclosures | Ch 8 |
| LE-19 | Affiliate onboarding KYC gates | Ch 8 (see also Ch 8B/8C) |
| LE-20 | CAN-SPAM commercial email | Ch 24 |
| LE-21 | TCPA / SMS consent | Ch 12 |
| LE-22 | Dating fake-profile / scam ad controls | Ch 25 |
| LE-52 | Influencer program operating system | Ch 17 |
| LE-54 | Contests / loot boxes / NFT pay-to-reveal (chance mechanics) | Ch 16B |
| LE-57 | Accessible checkout / ADA Title III | Ch 16C |
| LE-63 | Tips / matching / incentive self-dealing | Ch 16D |
| LE-73 | Unified payee diligence schema (individual vs business) | Ch 8B |
| LE-74 | Cash referral → KYC trigger | Ch 8C |
| LE-77 | Brand / trademark usage for creators & affiliates | Ch 17B |
Cluster F — Security clocks, payments, AI product & agents
| LE | Title (short) | Taught in |
|---|---|---|
| LE-23 | Breach detection → counsel → notice clocks | Ch 22 |
| LE-24 | SCA/ECPA response playbooks in product | Ch 7 |
| LE-55 | Logging & ESI — store vs create | Ch 7B |
| LE-25 | Ransomware / OFAC payment screening | Ch 23 |
| LE-26 | Checkout disclosures & chargeback evidence | Ch 10 |
| LE-27 | High-risk MCC / adult billing flags | Ch 10 |
| LE-28 | Creator / contractor onboarding (clickwrap + KYC) | Ch 13 (see also Ch 8B) |
| LE-29 | NIL / likeness license for platform marketing | Ch 13 |
| LE-30 | “AI is not advice” + HITL gates | Ch 6 |
| LE-31 | Enterprise AI: no-training-on-customer-data default | Ch 26 |
| LE-32 | Synthetic media labeling | Ch 27 |
| LE-59 | Embodied perception / TAO (training vs output) | Ch 28B |
| LE-33 | Crypto / fintech KYC–KYB–AML (productized) | Adjacent Ch 8 / Ch 13 / Ch 17 (counsel depth) |
| LE-34 | Ongoing AML / sanctions monitoring (payouts) | Adjacent Ch 8 / Ch 17 / Ch 23 (counsel depth) |
| LE-37 | Continuous NIL / likeness / AI-output monitoring | Adjacent Ch 13 / Ch 17 / Ch 28 (counsel depth) |
| LE-38 | Character / CS chatbot guardrails | Ch 6 |
| LE-39 | Payment fraud prevention engineering | Ch 10 |
| LE-60 | Adult UGC × card-network participant controls | Ch 10B |
| LE-64 | AI surface inventory / model–vendor register | Ch 6D |
| LE-65 | Shadow AI / personal LLM egress | Ch 6E |
| LE-66 | AI decision logs / criteria / CoT containment | Ch 6F |
| LE-69 | AI Terms ↔︎ product disclosure congruence | Ch 6G |
| LE-70 | Conversational co-pilot skin (HITL/PVS) | Ch 6H |
| LE-62 | Code is policy / legal review triggers | Ch 31B |
| LE-72 | Subsidiary / shared-services launch pack | Ch 31C |
| LE-43 | Dual consent / bot-prohibition pre-flight | Ch 6B |
| LE-44 | Consequential-bind human confirm | Ch 6B |
| LE-45 | Agent terms ledger + materiality circuit-breakers | Ch 6B / Ch 14 |
| LE-46 | Payment mandate / verified-principal auth | Ch 6B |
| LE-47 | Machine-readable site policy consume (+ publish) | Ch 14 |
| LE-56 | Scraping / CFAA gates (scrape-in & scrape-out) | Ch 14B |
| LE-48 | Authenticity claims + rebottle / nominative TM | Ch 16 |
| LE-49 | Final-sale hygiene / made-to-order RMA | Ch 16 |
| LE-50 | Reference pricing / compare-at / sale labels | Ch 16 |
| LE-51 | Loyalty / rewards / promo abuse + clawback | Ch 16 |
Quick LE → chapter lookup
Need a number fast? Scan this grid, then open the cluster table above for the short title.
| LE | Ch | LE | Ch | LE | Ch | LE | Ch |
|---|---|---|---|---|---|---|---|
| 01 | 2 | 14 | 21 | 27 | 10 | 40 | 15 |
| 02 | 2 | 15 | 9 | 28 | 13 | 41 | 4 |
| 03 | 3 | 16 | 18 | 29 | 13 | 42 | 30 |
| 04 | 3 | 17 | 28 | 30 | 6 | 43 | 6B |
| 05 | 3 | 18 | 8 | 31 | 26 | 44 | 6B |
| 06 | 4/30 | 19 | 8 | 32 | 27 | 45 | 6B/14 |
| 07 | 4 | 20 | 24 | 33 | * | 46 | 6B |
| 08 | 4 | 21 | 12 | 34 | * | 47 | 14 |
| 09 | 11 | 22 | 25 | 35 | 19 | 48 | 16 |
| 10 | 5/11 | 23 | 22 | 36 | 29 | 49 | 16 |
| 11 | 5 | 24 | 7 | 37 | * | 50 | 16 |
| 12 | 20 | 25 | 23 | 38 | 6 | 51 | 16 |
| 13 | * | 26 | 10 | 39 | 10 | 52 | 17 |
| 53 | 4B | 54 | 16B | 55 | 7B | 56 | 14B |
| 57 | 16C | 58 | 9B | 59 | 28B | 60 | 10B |
| 61 | 5B | 62 | 31B | 63 | 16D | 64 | 6D |
| 65 | 6E | 66 | 6F | 67 | 7C | 68 | 2B |
| 69 | 6G | 70 | 6H | 71 | 13B | 72 | 31C |
| 73 | 8B | 74 | 8C | 75 | 5C | 76 | 2C |
| 77 | 17B |
*Counsel-depth / adjacent chapters noted in the cluster tables. Release gates and staffing: Chapter 31. Short titles only: Chapter 33.
This chapter is for education and discussion. It is not legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.
Chapter 33 — Appendix: LE-01…LE-77 Index
The problem in plain English
Here’s the LE title index — pattern id to name.
Use it when a ticket mentions an LE id and you need the teaching home fast.
You made it to the short list.
This appendix is the title index for patterns LE-01…LE-77—names you can scan in a kickoff or paste into a ticket. When you need the teaching story (lost vs fixed, Interface / Code / Data), flip to Chapter 32 — Pattern Map and open the chapter it points to.
A Law Engineer (licensed attorney with software/product expertise) owns what each title means for your facts. Use with your counsel—not as a substitute for matter advice.
| ID | Title |
|---|---|
| LE-01 | Binding Online Terms (Clickwrap / Sign-in-Wrap) |
| LE-02 | Arbitration / Class Waiver Presentation |
| LE-03 | ROSCA / Negative Option / Easy Cancel |
| LE-04 | California Automatic Renewal Law (ARL) |
| LE-05 | Price Transparency / Drip Pricing / Free Trial → Paid |
| LE-06 | CCPA/CPRA Notice at Collection + Rights UX |
| LE-07 | Sale / Share / GPC Opt-Out Signals |
| LE-08 | Cookie / SDK / Pixel Consent & Vendor Gating |
| LE-09 | COPPA Age Gate / Under-13 Block |
| LE-10 | State Adult-Content Age Verification |
| LE-11 | TAKE IT DOWN Act Notice-and-Removal |
| LE-12 | NCII / Revenge-Porn Reporting (State + ToS) |
| LE-13 | FOSTA-SESTA Trafficking Risk UX & Logging |
| LE-14 | § 2257 / 2257A Producer Recordkeeping |
| LE-15 | DMCA Notice / Counter-Notice Intake |
| LE-16 | Repeat Infringer / Repeat NCII Abuser Policy |
| LE-17 | Generative Copyright / Publicity Filters |
| LE-18 | FTC Endorsement / Affiliate #Ad Disclosures |
| LE-19 | Affiliate Onboarding KYC Gates |
| LE-20 | CAN-SPAM Commercial Email |
| LE-21 | TCPA / SMS Consent |
| LE-22 | Dating Fake-Profile / Scam Advertising Controls |
| LE-23 | Breach Detection → Counsel → Notice Clocks |
| LE-24 | SCA/ECPA Response Playbooks in Product |
| LE-25 | Ransomware / OFAC Payment Screening |
| LE-26 | Checkout Disclosures & Chargeback Evidence |
| LE-27 | High-Risk MCC / Adult Billing Compliance Flags |
| LE-28 | Creator / Contractor Onboarding (Clickwrap + KYC) |
| LE-29 | NIL / Likeness License for Platform Marketing |
| LE-30 | “AI Is Not Advice” + Human-in-the-Loop Gates |
| LE-31 | Enterprise AI: No-Training-on-Customer-Data Default |
| LE-32 | Synthetic Media Labeling (EU Art. 50 + Product Policy) |
| LE-33 | Crypto / Fintech KYC–KYB–AML Program (Productized) |
| LE-34 | Ongoing AML / Sanctions Monitoring for Payouts & Affiliates |
| LE-35 | Automated Anti-Piracy / Fingerprinting Pipeline |
| LE-36 | Automated Trust & Safety Moderation Stack |
| LE-37 | Continuous NIL / Likeness / AI-Output Monitoring |
| LE-38 | Character / CS Chatbot Guardrails |
| LE-39 | Payment Fraud Prevention Engineering |
| LE-40 | Human Authorship Evidence Trail for USCO Registration |
| LE-41 | Privacy Policy ↔︎ Live Tag / SDK Congruence Scanner |
| LE-42 | Multi-Jurisdictional Privacy UX Pack |
| LE-43 | Dual Consent / Bot-Prohibition Pre-Flight |
| LE-44 | Consequential-Bind Human Confirm |
| LE-45 | Agent Terms Ledger + Materiality Circuit-Breakers |
| LE-46 | Payment Mandate / Verified-Principal Auth for Agent Spend |
| LE-47 | Machine-Readable Site Policy Consume (+ Optional Publish) |
| LE-48 | Authenticity Claims + Independent Rebottle / Nominative TM ID |
| LE-49 | Final-Sale Hygiene / Made-to-Order RMA |
| LE-50 | Reference Pricing / Compare-At / Sale Labels |
| LE-51 | Loyalty / Rewards / Promo Abuse + Clawback |
| LE-52 | Influencer Program Operating System |
| LE-53 | CIPA Session Replay / Chat / Content Analytics — Prior Consent |
| LE-54 | Contests / Loot Boxes / NFT Pay-to-Reveal (Chance Mechanics) |
| LE-55 | Logging & ESI — Store vs Create |
| LE-56 | Scraping / CFAA Gates (Scrape-In & Scrape-Out) |
| LE-57 | Accessible Checkout / ADA Title III |
| LE-58 | Section 230 Design Line (Own Speech vs Third-Party) |
| LE-59 | Embodied Perception / TAO (Training vs Output) |
| LE-60 | Adult UGC × Card-Network Participant Controls |
| LE-61 | TIDA Consent Ledger & Anti-Weaponization |
| LE-62 | Code Is Policy / Legal Review Triggers |
| LE-63 | Tips, Matching & Incentive Self-Dealing |
| LE-64 | AI Surface Inventory & Model Register |
| LE-65 | Shadow AI & Personal LLM Egress |
| LE-66 | AI Decision Logs, Criteria & CoT Containment |
| LE-67 | Privacy Engineering Threshold Inventory |
| LE-68 | Subscriber Dispute Architecture (Arb / Class / LoL / Waiver / Indemnity) |
| LE-69 | AI Terms ↔︎ Product Disclosure Congruence |
| LE-70 | Conversational Co-Pilot Skin (HITL / PVS / No Impersonation) |
| LE-71 | Custom Creator Deal OS |
| LE-72 | Subsidiary / Shared-Services Launch Pack |
| LE-73 | Unified Payee Diligence Schema (Individual vs Business) |
| LE-74 | Cash Referral → KYC Triggers |
| LE-75 | Content Advisories & Ratings UX |
| LE-76 | Agreement Factory (Populate + E-Sign) |
| LE-77 | Brand / Trademark Usage for Creators & Affiliates |
This chapter is for education and discussion. It is not legal advice. Re-check primary authorities for your facts and jurisdiction before you ship.