# Castle Vendor Content: guardrails

Every row in `library/master.csv` and `fr/master-fr.csv` must pass these rules. Both files are generated from `library/concepts.mjs`. `node tools/build.mjs` checks the rules a machine can check and refuses to build if any fail. The rest are human checks at approval.

**Core idea:** The brand makes it. The member makes it work here. The vendor plays the supporting role. The hero is the member's store, town and counter staff.

## Vendor and claims
1. **Written vendor approval before anything goes live.** That covers logos, product imagery and any brand mention in a co-op ad. `vendor_approval_status` defaults to `pending`, and `status` defaults to `draft`. *(machine)*
2. **Use only the vendor's own published wording** for specs, R-values, fire ratings, wind ratings and warranties. The library itself makes no such claims, and the build blocks the obvious terms. *(machine + human)*
3. **One brand per row, written into the copy.** Each brand gets its own row (`CVC-ROOF-R01-IKO`, `CVC-ROOF-R01-GAF`). The copy must name that brand and no other library brand. A member only receives rows for brands they're confirmed to carry (`member-brands.json`, `confirmed:true`). Never guess. *(machine)*
4. **Brand name as text only** until the vendor approves logo use. Shoot any product wrapper with the logo turned away until approval is on file.
5. **No offers, prices, stock counts, delivery-time promises or star ratings** unless the member has confirmed them in writing. *(human)*

## Power tools
6. **Power tool content goes only to members the vendor authorizes to sell online** (DeWalt, Makita, Stanley Black & Decker). Power tools rows are split out into `library/tools.AUTHORIZED-ONLINE-RESELLERS-ONLY.csv`, and every power tools slot in the calendar is labelled the same way. A member without that authorization never receives these rows. *(machine flag, human check of the authorization)*

## Rights
7. **Music comes from commercial or licensed libraries only.** Log the track ID and licence in `music_source`. No trending audio lifted from the app. Outro cards run silent.
8. **Record a rights expiry for any stock footage or photo** in `rights_expiry`. Anything past expiry is pulled.
9. **Get a signed release for every real person shown.** A minor needs a guardian release.
9a. **AI scene footage (Higgsfield) is allowed** for rooms, weather, streets and generic people. Never AI-generate the product, a vendor logo, a finished job, or a member's real store or staff. Generate fresh for each member (one clip is never shared) and log the job ID in `rights_expiry`. Use Meta's AI label when a clip is photorealistic. *(Zak 2026-09-30)*
10. **Reels run 10 seconds max:** about 7s of content, then a 3s silent outro card.

## Language
11. **Quebec members get the French version before anything publishes.** Claude drafts it, and the member (the client) reviews and approves it, the same approver as rule 15. Only then does `caption_fr_status` become `approved`. Members outside Quebec get English only.
12. **The white label says "WC3" or "Web Conductors Command Centre" everywhere clients can see it.** The platform name never appears. Replacement works on word boundaries, so HIGHLAND stays HIGHLAND. *(machine, negative-tested)*
13. **Member voice, plain speech.** No em dashes, no hype stacks and no "In today's world" openers. *(machine for em dashes)*

## Consent and publishing
14. **CASL consent on any lead capture tied to a post.** If `{URL}` or a link sticker lands on a form, that form carries express consent language.
15. **Staff draft the post. A named approver at the member publishes it.** Each member picks review-first (the default) or autopilot. Autopilot only ever pulls rows that are `approved` with vendor approval `approved`.
16. **`{StaffName}` is someone who agreed in writing to be named.**

## Co-op placement log
18. **Every post that names a brand gets one row in `coop/placement-log.csv`** (member, asset, brand, date, link, vendor approval reference). That log is the proof-of-performance behind each vendor co-op claim. No log row means no claim.

## Variety (the Meta rule)
17. **The brief syndicates. The artwork never does.** 300 members posting the same render is the template-clone pattern that got a real Meta account suspended. Each member's execution is rebuilt from its own photos and footage, in its own colours and composition, using one of the hook alternates in the template. Tokens alone don't count as variety.
