You are taking over 11.broker: one Cloudflare Worker (`11-broker`) that is the site, the job desk and the API of a broker that works across industries. Most brokers stay in one industry; a real deal often crosses several (a ranch sale is land, a herd and a haul). 11.broker runs such a deal as one job with one set of terms. The lines today are real estate, insurance, animals (horses and livestock), shipping, business sales, mortgages, vehicles, boats and produce, plus "something else" by request. Securities are left out. A new line is one entry in src/lines.js with its takes, leaves, steps, rules (each linked to its source) and credentials, plus its address in public/sitemap.xml. The source is the repository ccorliss/11.broker. Pushing to `main` runs `npm test` and deploys. Keep the repository's own patterns over anything said in a chat. Rules that must hold 1. Never say or imply that 11.broker holds a license. Where each license stands is said only by the credentials register, which the desk keeps (D1 `credentials`, `settings`). Every line starts as "Opening" and is switched to "Open" by the desk. A statement about a law or a regulator carries a link to that law or regulator and is read at the source before it is written (src/lines.js). 2. A job has a number anyone may know (11-K7P4QX) and each person on it has a 22-character key. Only the SHA-256 of a key is kept, so a key is shown once. What one side writes to the desk is never shown to the other side, and neither side sees the other's contact details. The quote is for the side that opened the job. 3. Terms: every change is a new version with a new fingerprint (SHA-256 of job number, version and body). A signature belongs to one version and never carries over. When the broker acts for both sides, each side agrees to that in writing as it signs. How the broker is paid, and by whom, is on the terms both sides sign. 4. Text from anywhere but the source goes into a page as text: `esc` for markup and attribute values, `webUrl` for anything that becomes a link (src/text.js). Pages carry no inline style and no inline script. The policy is `default-src 'none'` with this site's own files only, nothing from another origin, and every page is sent `no-transform`. 5. Social Security numbers and card numbers are refused, not stored (src/intake.js, `sensitive`). No secret is written in the repository or in a chat. The desk's key is the Worker secret DESK_KEY. 6. Each functional part has a place in the bar at the top of every page. Pages speak as the product: plain words, sentence case, no notes on how they were made, no other projects, nothing personal. A button says what it does. 7. The look (DESIGN.md): a white sheet on a gray desk with a canary copy and a pink copy behind it. Canary is always side A, pink is always side B, blue is the stamp and the focus ring, and status is never told by colour alone. Where a number is a free choice it is made of ones: 11px unit, 1.1px lines, type in steps of 1.1, a 1111px page, .11s. 8. The schema changes only by adding a file to migrations/ (never by editing one that has been deployed), then `npm run generate`. The Worker applies what is missing on its first request. What exists Pages: / (the question "What needs brokering?" with a job sheet that lights the lines a description touches), /lines and /lines/ (what a line takes and leaves, the steps of a job, what backs it, the rules it follows), /how, /credentials (the register), /start (the form), /track, /api (the reference). A job's page /job/: stage, quote, the terms as a sheet with a signing block for each side, checklist, notes, private link, withdraw. The desk /desk (jobs by stage), /desk/job/ (stage, people and their links, quote, terms, checklist, notes to both sides or one or none), /desk/credentials (each credential's status, number, holder and where to check it; add a credential such as one state's license; open or close a line), /desk/export.json. API: GET /api/lines, /api/credentials, /api/health; POST /api/jobs; GET /api/jobs/ and POST .../notes, .../sign, .../withdraw with the job's key as a bearer token; /openapi.json; /llms.txt. Six stages: Received, Scoped, Terms out, Signed, Underway, Closed; a job can also be Declined or Withdrawn. Issuing terms moves a job to Terms out and the second signature moves it to Signed. Files: src/lines.js (the lines, stages, credentials, the words a description is read for), src/store.js (D1), src/intake.js (what may be sent, and what is done with it), src/auth.js (numbers, keys, cookies, the desk), src/pages.js, src/jobpage.js, src/desk.js, src/api.js, src/worker.js (routes, headers), public/ (site.css, site.js, fonts, icons, robots.txt, llms.txt), migrations/, test/check.mjs (every route), test/behave.mjs (the pages in a browser), test/shot.mjs (screenshots), scripts/generate.mjs, scripts/images.mjs. On Cloudflare: Worker `11-broker` with custom domains 11.broker and www.11.broker, D1 database `11-broker`, a rate limiter (11 a minute an address for opening a job and for trying a key), static assets from public/, Workers Builds on push to main. Next, in order 1. Mail. Give the domain a mailbox (Email Routing), show it in the footer (CONTACT_EMAIL), and take a request by email: an email() handler that opens a job from a message. 2. Tell people. NOTIFY_WEBHOOK already sends one line to the desk; add mail to the people on a job when its stage changes, terms are issued or a note is for them. 3. The desk's door. Sign-in for named people in place of one shared key, and who did what on each job. 4. Files on a job: bill of sale, bill of lading, proof of delivery, inspection reports, kept in R2 and shown with previews. 5. Documents made from the terms: a bill of sale, a rate confirmation, ready to print. 6. Licenses by state: a line open in one state and opening in another. 7. A check that a person is sending the form, if programs start to. How to judge your work It is at least on par when `npm test` and `npm run test:browser` pass, the change has its own address in the top bar, nothing in rule 1 or rule 2 has leaked, and the pages still read as one product on a phone and on a desktop. End with one line: what changed and why.