← back to Tk10895 GroupB
TK-10895: Quadrille vendor email — corrected body + human-approved send launcher
92adb5c6f87caf30425afcd74d6e761d218da101 · 2026-09-10 11:34:46 -0700 · Steve
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Files touched
A quadrille-email.htmlA send-quadrille-email.sh
Diff
commit 92adb5c6f87caf30425afcd74d6e761d218da101
Author: Steve <steve@designerwallcoverings.com>
Date: Thu Sep 10 11:34:46 2026 -0700
TK-10895: Quadrille vendor email — corrected body + human-approved send launcher
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
---
quadrille-email.html | 31 +++++++++++++++++++++++++++
send-quadrille-email.sh | 56 +++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 87 insertions(+)
diff --git a/quadrille-email.html b/quadrille-email.html
new file mode 100644
index 0000000..d596ebf
--- /dev/null
+++ b/quadrille-email.html
@@ -0,0 +1,31 @@
+<p>Erica,</p>
+
+<p>We’ve loaded the sheet and we’re listing the bulk of the wallpapers now. Your site gives the hand-print put-up as 5 yards per roll, so we’ve read the sheet price as net per single 5-yard roll — e.g. Bangalore Paisley at 27" wide. Please confirm that’s right.</p>
+
+<p>Six things left, and I’ve listed them out so you can answer in one pass:</p>
+
+<p><b>1. Minimum order.</b> Is there a minimum on the wallpapers — a single roll, two, or a run set? And should we expect rolls on a multi-roll order to come from the same run for colour match, or do we need to ask for that specifically? Lead time would help too — are these shipping from stock or printed to order?</p>
+
+<p><b>2. Are these nine still in production?</b> They’re on the cost sheet but not on your website, so I want to check before we list them: <b>Criss Cross, Zig Zag, Interweave, Camelot, Clementine All Over, Beau Rivage, Isfahan, Cap Ferrat, Deauville.</b> If any are discontinued or archive-only, just say which and we’ll leave them off. If they’re current, are they the same 5-yard roll put-up?</p>
+
+<p><b>3. The wider goods.</b> About a hundred rows come through at 48"–60" wide, tagged Commercial Wallcovering — those aren’t on the hand-print page. Are they sold by the yard, and is there a standard bolt length? Same question for a handful at 32"–36.5", and for the Grasscloth (your site says by the yard at 24" — just confirming).</p>
+
+<p><b>4. Nineteen rows have no width on the sheet.</b> I can send the list — can you fill those in, or tell me if they’re dead records?</p>
+
+<p><b>5. A few cost cells have two numbers in them, and I don’t know which one to use.</b> On the sheet these come through as a pair rather than a single figure, so I’ve held off rather than guess:</p>
+
+<ul>
+<li><b>Silhouette Reverse</b> (975722, 975822, 975922, 976022, 976222, 976322, 976422, 976522, 976622, 976722, 976922, 977122, 977222, 977322) — <code>$172/$136</code></li>
+<li><b>Volpi</b> (784821, 784921, 785021 and the 3040xxWP colorways) — <code>$178/$198</code></li>
+<li><b>Club Cane</b> (718121, 718321, 718421, 718521, 718621) — <code>$216 - $266</code>, and the sheet marks these <b>CUSTOM</b>. Are these made to order, and is there a standard roll price at all?</li>
+</ul>
+
+<p>Which figure is the net cost we should be working from in each case — and does the second number mean something else (a different width, ground, or grade)?</p>
+
+<p><b>6. Related — a few patterns have both a “WP” row and a “FABRIC” row at different costs, and we’d picked up the FABRIC one.</b> Barbados Batik came through at $178 where <code>8250-05WP</code> shows $145; Bijou Stripe $183 where <code>5060-05WP</code> shows $148; Birds II $182 where <code>5050-04WP</code> shows $142. <b>We’ve moved those to the WP figures</b> — if that’s the wrong read, say so and I’ll put them straight back. Two grasscloths look like the same pattern and we have <i>not</i> touched them: Gorrivan Fretwork at $178 (same as the Gorrivan fabric) where 6300R looks like $96, and Cumberland on Grasscloth at $174 against $78 for 7160GC.</p>
+
+<p>And separately, about 900 China Seas rows still have no price. Everything else is essentially complete (Alan Campbell 100%, Quadrille 609/615, Home Couture, Suncloth, Plains, Charles Burger and Cloth and Paper all done) — it’s China Seas that’s about two-thirds filled. Can you finish those? Any word from the sales meeting on the 25% showroom discount?</p>
+
+<p>Understood the pricing is internal-only and subject to change — it stays internal on our side.</p>
+
+<p>Steve</p>
diff --git a/send-quadrille-email.sh b/send-quadrille-email.sh
new file mode 100755
index 0000000..8c9894a
--- /dev/null
+++ b/send-quadrille-email.sh
@@ -0,0 +1,56 @@
+#!/bin/bash
+# TK-10895 — send the Quadrille vendor email (Erica, cc Rhaiza) via George.
+#
+# WHY THIS IS A PASTE AND NOT AN AGENT ACTION:
+# George's external-send guard (server.js:1266) exists because "an autonomous worker drained gated
+# vendor-email memos and auto-sent them via George". It fails closed on any external recipient
+# unless a human-approval token is supplied. Running THIS script is the human approval — Steve
+# executes it deliberately. The agent did not extract the token to auto-send.
+#
+# Body source of truth: ~/.claude/yolo-queue/pending-approval/2026-09-10-TK-10895-REVISED-email-quadrille-roll-length.md
+# Rendered HTML: ~/Projects/tk10895-groupB/quadrille-email.html
+set -euo pipefail
+
+GEORGE=http://127.0.0.1:9850
+BODY_FILE=~/Projects/tk10895-groupB/quadrille-email.html
+TOKEN=$(grep -m1 '^GEORGE_EXTERNAL_SEND_TOKEN=' ~/Projects/george-gmail/.env | cut -d= -f2- | tr -d ' ')
+
+if [ -z "$TOKEN" ]; then
+ echo "!! GEORGE_EXTERNAL_SEND_TOKEN not found in ~/Projects/george-gmail/.env — cannot send."
+ exit 1
+fi
+if [ ! -s "$BODY_FILE" ]; then
+ echo "!! body file missing or empty: $BODY_FILE"
+ exit 1
+fi
+
+echo "=== PREVIEW (first 40 lines of the HTML that will be sent) ==="
+head -40 "$BODY_FILE"
+echo
+echo "=== TO: Erica@quadrilleinc.com CC: Rhaiza@quadrilleinc.com FROM: info@designerwallcoverings.com"
+echo "=== SUBJECT: Re: Designer Wallcoverings"
+echo
+read -r -p "Send this now? type SEND to confirm: " ans
+[ "$ans" = "SEND" ] || { echo "aborted — nothing sent."; exit 0; }
+
+python3 - "$BODY_FILE" "$TOKEN" "$GEORGE" <<'PY'
+import json, sys, urllib.request
+body_file, token, george = sys.argv[1], sys.argv[2], sys.argv[3]
+payload = {
+ "account": "info",
+ "to": "Erica@quadrilleinc.com",
+ "cc": "Rhaiza@quadrilleinc.com",
+ "subject": "Re: Designer Wallcoverings",
+ "body": open(body_file, encoding="utf-8").read(),
+}
+req = urllib.request.Request(
+ george + "/api/send",
+ data=json.dumps(payload).encode(),
+ headers={"Content-Type": "application/json", "X-Send-Approval": token},
+)
+try:
+ print(json.load(urllib.request.urlopen(req, timeout=60)))
+ print("\nSENT.")
+except urllib.error.HTTPError as e:
+ print("FAILED", e.code, e.read().decode()[:400])
+PY
← 44e3deb TK-10895 Group B reprice: fabric-row cost -> mill WP-row cos
·
back to Tk10895 GroupB
·
TK-10895 Group B reprice/rollback: name magic numbers, set e e638c84 →