[object Object]

← 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

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&rsquo;ve loaded the sheet and we&rsquo;re listing the bulk of the wallpapers now. Your site gives the hand-print put-up as 5 yards per roll, so we&rsquo;ve read the sheet price as net per single 5-yard roll &mdash; e.g. Bangalore Paisley at 27&quot; wide. Please confirm that&rsquo;s right.</p>
+
+<p>Six things left, and I&rsquo;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 &mdash; 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 &mdash; are these shipping from stock or printed to order?</p>
+
+<p><b>2. Are these nine still in production?</b> They&rsquo;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&rsquo;ll leave them off. If they&rsquo;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&quot;&ndash;60&quot; wide, tagged Commercial Wallcovering &mdash; those aren&rsquo;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&quot;&ndash;36.5&quot;, and for the Grasscloth (your site says by the yard at 24&quot; &mdash; just confirming).</p>
+
+<p><b>4. Nineteen rows have no width on the sheet.</b> I can send the list &mdash; can you fill those in, or tell me if they&rsquo;re dead records?</p>
+
+<p><b>5. A few cost cells have two numbers in them, and I don&rsquo;t know which one to use.</b> On the sheet these come through as a pair rather than a single figure, so I&rsquo;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) &mdash; <code>$172/$136</code></li>
+<li><b>Volpi</b> (784821, 784921, 785021 and the 3040xxWP colorways) &mdash; <code>$178/$198</code></li>
+<li><b>Club Cane</b> (718121, 718321, 718421, 718521, 718621) &mdash; <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 &mdash; and does the second number mean something else (a different width, ground, or grade)?</p>
+
+<p><b>6. Related &mdash; a few patterns have both a &ldquo;WP&rdquo; row and a &ldquo;FABRIC&rdquo; row at different costs, and we&rsquo;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&rsquo;ve moved those to the WP figures</b> &mdash; if that&rsquo;s the wrong read, say so and I&rsquo;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) &mdash; it&rsquo;s China Seas that&rsquo;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 &mdash; 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 →