← back to Draft Viewer
Snapshot every tracked draft body to disk — deletion is no longer irreversible
b443b7c41ddd233ac143e154a0ce372d141e719c · 2026-09-10 08:55:49 -0700 · Steve Abrams
com.steve.george-drain-old-drafts calls Gmail drafts.delete, which has no Trash,
so every decision on TK-11231 was previously one-way. 27/27 live drafts are now
captured on disk, including both info@ drafts on the ~4-day permanent-delete fuse.
Caught two bugs in the snapshot itself before trusting it:
- The two George routes name the body field differently (/api/messages/:id ->
body, /api/info/messages/:id -> bodyHtml/bodyText). Reading only `body`
returned '' for all 5 info@ drafts with a 200 OK.
- 'Wrote a file' was being counted as 'saved'. An empty body now counts as a
failure, so the report cannot read green while capturing nothing.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Files touched
A data/bodies/info__1a005fc3ff6c56ff.jsonA data/bodies/info__1a006aa890e66af3.jsonA data/bodies/info__1a015db4fe26802c.jsonA data/bodies/info__1a059922f619b980.jsonA data/bodies/info__1a06d1ef99f846d1.jsonA data/bodies/steve-office__19f3d1a86a49b8c6.jsonA data/bodies/steve-office__19f3e1c8c8a01b4d.jsonA data/bodies/steve-office__19f3e20f58596b3e.jsonA data/bodies/steve-office__19f906c4a8f0e8fe.jsonA data/bodies/steve-office__19ff677a456e1e61.jsonA data/bodies/steve-office__19ff677c9748dd70.jsonA data/bodies/steve-office__19ff677d1895b6f4.jsonA data/bodies/steve-office__19ff67c1ef9c846b.jsonA data/bodies/steve-office__19ff67c288b79265.jsonA data/bodies/steve-office__19ff67c334844485.jsonA data/bodies/steve-office__19ff67c3b9d347b7.jsonA data/bodies/steve-office__19ff67c4e29d46c2.jsonA data/bodies/steve-office__19ff67c543906d8f.jsonA data/bodies/steve-office__19ff67c5f7a58198.jsonA data/bodies/steve-office__19ff67c6cc0dc4e4.jsonA data/bodies/steve-office__19ff67c7686cc8dc.jsonA data/bodies/steve-office__19ff67c7ca93d3ee.jsonA data/bodies/steve-office__1a059915205816a2.jsonA data/bodies/steve-office__1a06d2ea705dddd3.jsonA data/bodies/steve-office__1a06d55e4f511b8e.jsonA data/bodies/steve-office__1a06d5e2baaf3149.jsonA data/bodies/steve-office__1a06d5e530b2ec40.jsonA data/imminent.jsonA data/snapshot-report.jsonA snapshot.mjs
Diff
commit b443b7c41ddd233ac143e154a0ce372d141e719c
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Thu Sep 10 08:55:49 2026 -0700
Snapshot every tracked draft body to disk — deletion is no longer irreversible
com.steve.george-drain-old-drafts calls Gmail drafts.delete, which has no Trash,
so every decision on TK-11231 was previously one-way. 27/27 live drafts are now
captured on disk, including both info@ drafts on the ~4-day permanent-delete fuse.
Caught two bugs in the snapshot itself before trusting it:
- The two George routes name the body field differently (/api/messages/:id ->
body, /api/info/messages/:id -> bodyHtml/bodyText). Reading only `body`
returned '' for all 5 info@ drafts with a 200 OK.
- 'Wrote a file' was being counted as 'saved'. An empty body now counts as a
failure, so the report cannot read green while capturing nothing.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
---
data/bodies/info__1a005fc3ff6c56ff.json | 31 +++++++
data/bodies/info__1a006aa890e66af3.json | 31 +++++++
data/bodies/info__1a015db4fe26802c.json | 29 +++++++
data/bodies/info__1a059922f619b980.json | 29 +++++++
data/bodies/info__1a06d1ef99f846d1.json | 32 ++++++++
data/bodies/steve-office__19f3d1a86a49b8c6.json | 27 +++++++
data/bodies/steve-office__19f3e1c8c8a01b4d.json | 27 +++++++
data/bodies/steve-office__19f3e20f58596b3e.json | 27 +++++++
data/bodies/steve-office__19f906c4a8f0e8fe.json | 27 +++++++
data/bodies/steve-office__19ff677a456e1e61.json | 28 +++++++
data/bodies/steve-office__19ff677c9748dd70.json | 28 +++++++
data/bodies/steve-office__19ff677d1895b6f4.json | 28 +++++++
data/bodies/steve-office__19ff67c1ef9c846b.json | 28 +++++++
data/bodies/steve-office__19ff67c288b79265.json | 28 +++++++
data/bodies/steve-office__19ff67c334844485.json | 28 +++++++
data/bodies/steve-office__19ff67c3b9d347b7.json | 28 +++++++
data/bodies/steve-office__19ff67c4e29d46c2.json | 28 +++++++
data/bodies/steve-office__19ff67c543906d8f.json | 28 +++++++
data/bodies/steve-office__19ff67c5f7a58198.json | 28 +++++++
data/bodies/steve-office__19ff67c6cc0dc4e4.json | 28 +++++++
data/bodies/steve-office__19ff67c7686cc8dc.json | 28 +++++++
data/bodies/steve-office__19ff67c7ca93d3ee.json | 28 +++++++
data/bodies/steve-office__1a059915205816a2.json | 27 +++++++
data/bodies/steve-office__1a06d2ea705dddd3.json | 30 +++++++
data/bodies/steve-office__1a06d55e4f511b8e.json | 30 +++++++
data/bodies/steve-office__1a06d5e2baaf3149.json | 30 +++++++
data/bodies/steve-office__1a06d5e530b2ec40.json | 30 +++++++
data/imminent.json | 22 +++++
data/snapshot-report.json | 7 ++
snapshot.mjs | 102 ++++++++++++++++++++++++
30 files changed, 902 insertions(+)
diff --git a/data/bodies/info__1a005fc3ff6c56ff.json b/data/bodies/info__1a005fc3ff6c56ff.json
new file mode 100644
index 0000000..ffa0074
--- /dev/null
+++ b/data/bodies/info__1a005fc3ff6c56ff.json
@@ -0,0 +1,31 @@
+{
+ "board": {
+ "id": "1a005fc3ff6c56ff",
+ "account": "info",
+ "cls": "imminent",
+ "to": "sales@bmwallpaper.com",
+ "subject": "Sample Follow-Up — Outstanding Memos (Acct On File) — Designer Wallcoverings",
+ "why": "Agent-composed sample follow-up, outstanding memos, account on file.",
+ "age_days_at_2026_09_10": 26,
+ "live": true,
+ "bucket": "imminent"
+ },
+ "message": {
+ "id": "1a005fc3ff6c56ff",
+ "threadId": "1a005fc3ff6c56ff",
+ "labelIds": [
+ "DRAFT"
+ ],
+ "snippet": "From job: node · Aug 15, 2026, 8:13 AM We are following up because we have not received the following samples from 10 days ago. Hopefully we removed any disco items internally from this list before",
+ "subject": "Sample Follow-Up — Outstanding Memos (Acct On File) — Designer Wallcoverings",
+ "from": "Designer Wallcoverings <info@designerwallcoverings.com>",
+ "to": "sales@bmwallpaper.com",
+ "cc": "",
+ "date": "Sat, 15 Aug 2026 08:13:32 -0700",
+ "bodyHtml": "<div style=\"font-family:ui-monospace,Menlo,monospace;font-size:10px;letter-spacing:.10em;text-transform:uppercase;color:#7a766f;padding:8px 12px;background:rgba(212,160,74,0.08);border-left:3px solid #d4a04a;margin-bottom:18px;border-radius:2px\"><strong style=\"color:#d4a04a\">From job:</strong> node <span style=\"color:#a8a39c\">·</span> Aug 15, 2026, 8:13 AM</div><div style=\"font-family:Arial,Helvetica,sans-serif;font-size:14px;color:#222;line-height:1.5\">\n<p>We are following up because we have not received the following samples from 10 days ago.<br>\nHopefully we removed any disco items internally from this list before asking again.</p>\n<hr style=\"border:none;border-top:1px solid #ccc\">\n<p><strong>Our account number is On File</strong></p>\n<p>We ordered 1 memo sample of each item below:</p>\n<p><strong>Manufacturer Number</strong></p>\n<hr style=\"border:none;border-top:1px solid #ccc\">\n<p style=\"line-height:1.7\">\nFD280-10<br>\nBX10180<br>\nH172NG5083<br>\nS300NQ8242<br>\nS300NQ8243<br>\nS176NQ8341<br>\nG0174NQ8330\n</p>\n<hr style=\"border:none;border-top:1px solid #ccc\">\n<p>Ship to the address below.</p>\n<p><strong>Sidemark: Samples ASAP</strong></p>\n<p>\nDesigner Wallcoverings<br>\n15442 Ventura Blvd. #102<br>\nSherman Oaks, CA 91403<br>\n1-888-373-4564\n</p>\n<p>We truly appreciate the help.</p>\n<p>Best Regards,<br>Showroom Manager</p>\n</div>",
+ "bodyText": "<div style=\"font-family:ui-monospace,Menlo,monospace;font-size:10px;letter-spacing:.10em;text-transform:uppercase;color:#7a766f;padding:8px 12px;background:rgba(212,160,74,0.08);border-left:3px solid #d4a04a;margin-bottom:18px;border-radius:2px\"><strong style=\"color:#d4a04a\">From job:</strong> node <span style=\"color:#a8a39c\">·</span> Aug 15, 2026, 8:13 AM</div><div style=\"font-family:Arial,Helvetica,sans-serif;font-size:14px;color:#222;line-height:1.5\">\n<p>We are following up because we have not received the following samples from 10 days ago.<br>\nHopefully we removed any disco items internally from this list before asking again.</p>\n<hr style=\"border:none;border-top:1px solid #ccc\">\n<p><strong>Our account number is On File</strong></p>\n<p>We ordered 1 memo sample of each item below:</p>\n<p><strong>Manufacturer Number</strong></p>\n<hr style=\"border:none;border-top:1px solid #ccc\">\n<p style=\"line-height:1.7\">\nFD280-10<br>\nBX10180<br>\nH172NG5083<br>\nS300NQ8242<br>\nS300NQ8243<br>\nS176NQ8341<br>\nG0174NQ8330\n</p>\n<hr style=\"border:none;border-top:1px solid #ccc\">\n<p>Ship to the address below.</p>\n<p><strong>Sidemark: Samples ASAP</strong></p>\n<p>\nDesigner Wallcoverings<br>\n15442 Ventura Blvd. #102<br>\nSherman Oaks, CA 91403<br>\n1-888-373-4564\n</p>\n<p>We truly appreciate the help.</p>\n<p>Best Regards,<br>Showroom Manager</p>\n</div>",
+ "attachments": [],
+ "internalDate": "1786806812000",
+ "body": "<div style=\"font-family:ui-monospace,Menlo,monospace;font-size:10px;letter-spacing:.10em;text-transform:uppercase;color:#7a766f;padding:8px 12px;background:rgba(212,160,74,0.08);border-left:3px solid #d4a04a;margin-bottom:18px;border-radius:2px\"><strong style=\"color:#d4a04a\">From job:</strong> node <span style=\"color:#a8a39c\">·</span> Aug 15, 2026, 8:13 AM</div><div style=\"font-family:Arial,Helvetica,sans-serif;font-size:14px;color:#222;line-height:1.5\">\n<p>We are following up because we have not received the following samples from 10 days ago.<br>\nHopefully we removed any disco items internally from this list before asking again.</p>\n<hr style=\"border:none;border-top:1px solid #ccc\">\n<p><strong>Our account number is On File</strong></p>\n<p>We ordered 1 memo sample of each item below:</p>\n<p><strong>Manufacturer Number</strong></p>\n<hr style=\"border:none;border-top:1px solid #ccc\">\n<p style=\"line-height:1.7\">\nFD280-10<br>\nBX10180<br>\nH172NG5083<br>\nS300NQ8242<br>\nS300NQ8243<br>\nS176NQ8341<br>\nG0174NQ8330\n</p>\n<hr style=\"border:none;border-top:1px solid #ccc\">\n<p>Ship to the address below.</p>\n<p><strong>Sidemark: Samples ASAP</strong></p>\n<p>\nDesigner Wallcoverings<br>\n15442 Ventura Blvd. #102<br>\nSherman Oaks, CA 91403<br>\n1-888-373-4564\n</p>\n<p>We truly appreciate the help.</p>\n<p>Best Regards,<br>Showroom Manager</p>\n</div>"
+ }
+}
\ No newline at end of file
diff --git a/data/bodies/info__1a006aa890e66af3.json b/data/bodies/info__1a006aa890e66af3.json
new file mode 100644
index 0000000..1a3a80c
--- /dev/null
+++ b/data/bodies/info__1a006aa890e66af3.json
@@ -0,0 +1,31 @@
+{
+ "board": {
+ "id": "1a006aa890e66af3",
+ "account": "info",
+ "cls": "imminent",
+ "to": "matt.schoffman@kravet.com",
+ "subject": "Re: Sample Follow-Up — Outstanding Memos (Acct 10087117) — Designer Wallcoverings",
+ "why": "A named Kravet rep already sent us tracking; our confirmation reply was never sent.",
+ "age_days_at_2026_09_10": 25.9,
+ "live": true,
+ "bucket": "imminent"
+ },
+ "message": {
+ "id": "1a006aa890e66af3",
+ "threadId": "1a006aa890e66af3",
+ "labelIds": [
+ "DRAFT"
+ ],
+ "snippet": "From job: node · Aug 15, 2026, 11:23 AM Hi Matt, Thank you for the tracking! Quick confirmation on the four that show delivered — 2019101.34.0, 2019101.313.0, F1562/04.CAC.0 and F1562/02.CAC.0: were",
+ "subject": "Re: Sample Follow-Up — Outstanding Memos (Acct 10087117) — Designer Wallcoverings",
+ "from": "Designer Wallcoverings <info@designerwallcoverings.com>",
+ "to": "matt.schoffman@kravet.com",
+ "cc": "",
+ "date": "Sat, 15 Aug 2026 11:23:54 -0700",
+ "bodyHtml": "<div style=\"font-family:ui-monospace,Menlo,monospace;font-size:10px;letter-spacing:.10em;text-transform:uppercase;color:#7a766f;padding:8px 12px;background:rgba(212,160,74,0.08);border-left:3px solid #d4a04a;margin-bottom:18px;border-radius:2px\"><strong style=\"color:#d4a04a\">From job:</strong> node <span style=\"color:#a8a39c\">·</span> Aug 15, 2026, 11:23 AM</div><div style=\"font-family:Arial,Helvetica,sans-serif;font-size:14px;color:#222;line-height:1.5\">\n<p>Hi Matt,</p>\n<p>Thank you for the tracking! Quick confirmation on the four that show delivered — 2019101.34.0, 2019101.313.0, F1562/04.CAC.0 and F1562/02.CAC.0: were those shipped to our Sherman Oaks office, or drop-shipped directly to the client? We just want to be sure we have the samples in hand before we close them out on our end.</p>\n<p>Also, the two ALTHEA items (Cotton P. Citron and Linen Pr. Citron) are still outstanding for us — could you check on those?</p>\n<p>Thank you!</p>\n<p>Best regards,<br>Designer Wallcoverings<br>1-888-373-4564</p>\n</div>",
+ "bodyText": "<div style=\"font-family:ui-monospace,Menlo,monospace;font-size:10px;letter-spacing:.10em;text-transform:uppercase;color:#7a766f;padding:8px 12px;background:rgba(212,160,74,0.08);border-left:3px solid #d4a04a;margin-bottom:18px;border-radius:2px\"><strong style=\"color:#d4a04a\">From job:</strong> node <span style=\"color:#a8a39c\">·</span> Aug 15, 2026, 11:23 AM</div><div style=\"font-family:Arial,Helvetica,sans-serif;font-size:14px;color:#222;line-height:1.5\">\n<p>Hi Matt,</p>\n<p>Thank you for the tracking! Quick confirmation on the four that show delivered — 2019101.34.0, 2019101.313.0, F1562/04.CAC.0 and F1562/02.CAC.0: were those shipped to our Sherman Oaks office, or drop-shipped directly to the client? We just want to be sure we have the samples in hand before we close them out on our end.</p>\n<p>Also, the two ALTHEA items (Cotton P. Citron and Linen Pr. Citron) are still outstanding for us — could you check on those?</p>\n<p>Thank you!</p>\n<p>Best regards,<br>Designer Wallcoverings<br>1-888-373-4564</p>\n</div>",
+ "attachments": [],
+ "internalDate": "1786818234000",
+ "body": "<div style=\"font-family:ui-monospace,Menlo,monospace;font-size:10px;letter-spacing:.10em;text-transform:uppercase;color:#7a766f;padding:8px 12px;background:rgba(212,160,74,0.08);border-left:3px solid #d4a04a;margin-bottom:18px;border-radius:2px\"><strong style=\"color:#d4a04a\">From job:</strong> node <span style=\"color:#a8a39c\">·</span> Aug 15, 2026, 11:23 AM</div><div style=\"font-family:Arial,Helvetica,sans-serif;font-size:14px;color:#222;line-height:1.5\">\n<p>Hi Matt,</p>\n<p>Thank you for the tracking! Quick confirmation on the four that show delivered — 2019101.34.0, 2019101.313.0, F1562/04.CAC.0 and F1562/02.CAC.0: were those shipped to our Sherman Oaks office, or drop-shipped directly to the client? We just want to be sure we have the samples in hand before we close them out on our end.</p>\n<p>Also, the two ALTHEA items (Cotton P. Citron and Linen Pr. Citron) are still outstanding for us — could you check on those?</p>\n<p>Thank you!</p>\n<p>Best regards,<br>Designer Wallcoverings<br>1-888-373-4564</p>\n</div>"
+ }
+}
\ No newline at end of file
diff --git a/data/bodies/info__1a015db4fe26802c.json b/data/bodies/info__1a015db4fe26802c.json
new file mode 100644
index 0000000..51d1690
--- /dev/null
+++ b/data/bodies/info__1a015db4fe26802c.json
@@ -0,0 +1,29 @@
+{
+ "board": {
+ "id": "1a015db4fe26802c",
+ "account": "info",
+ "subject": "Request: current 2026 wholesale cost list — Newmor",
+ "why": "superseded — bundled 5 lines into one cold ask",
+ "age": "Aug 18",
+ "live": true,
+ "bucket": "delete"
+ },
+ "message": {
+ "id": "1a015db4fe26802c",
+ "threadId": "1a015db4fe26802c",
+ "labelIds": [
+ "DRAFT"
+ ],
+ "snippet": "From job: node · Aug 18, 2026, 10:11 AM Hi Jill, Hope you're well. We're refreshing the Newmor program on our site and want to make sure our pricing reflects your current numbers. Could you",
+ "subject": "Request: current 2026 wholesale cost list — Newmor (+ full LBI Boyd line card)",
+ "from": "Designer Wallcoverings <info@designerwallcoverings.com>",
+ "to": "jill@lbiboyd.com",
+ "cc": "",
+ "date": "Tue, 18 Aug 2026 10:11:29 -0700",
+ "bodyHtml": "<div style=\"font-family:ui-monospace,Menlo,monospace;font-size:10px;letter-spacing:.10em;text-transform:uppercase;color:#7a766f;padding:8px 12px;background:rgba(212,160,74,0.08);border-left:3px solid #d4a04a;margin-bottom:18px;border-radius:2px\"><strong style=\"color:#d4a04a\">From job:</strong> node <span style=\"color:#a8a39c\">·</span> Aug 18, 2026, 10:11 AM</div><p>Hi Jill,</p>\n<p>Hope you're well. We're refreshing the Newmor program on our site and want to make sure our pricing reflects your current numbers.</p>\n<p>Could you send your most recent <strong>2026 wholesale cost list for Newmor</strong>? A per-SKU spreadsheet (CSV or Excel) with the pattern/color code and net wholesale cost per unit (per yard or per roll, whichever you quote) would be ideal.</p>\n<p>While you're at it, if it's easy, we'd also appreciate the current cost lists for the other lines you rep for us — <strong>Colour & Design, Naturale 54, DeNovo Wall, and Atomic 50</strong> — so we can true everything up in one pass.</p>\n<p>And please confirm our current trade/dealer discount and any freight terms. (I have a note from you that no tariffs are due on Newmor orders — please confirm that still holds, and flag any line where tariffs now apply.)</p>\n<p>Thanks so much — happy to hop on a quick call if that's easier.</p>\n<p>Best,<br>\nSteve Abrams<br>\nDesigner Wallcoverings<br>\n(888) 373-4564 · DesignerWallcoverings.com</p>",
+ "bodyText": "<div style=\"font-family:ui-monospace,Menlo,monospace;font-size:10px;letter-spacing:.10em;text-transform:uppercase;color:#7a766f;padding:8px 12px;background:rgba(212,160,74,0.08);border-left:3px solid #d4a04a;margin-bottom:18px;border-radius:2px\"><strong style=\"color:#d4a04a\">From job:</strong> node <span style=\"color:#a8a39c\">·</span> Aug 18, 2026, 10:11 AM</div><p>Hi Jill,</p>\n<p>Hope you're well. We're refreshing the Newmor program on our site and want to make sure our pricing reflects your current numbers.</p>\n<p>Could you send your most recent <strong>2026 wholesale cost list for Newmor</strong>? A per-SKU spreadsheet (CSV or Excel) with the pattern/color code and net wholesale cost per unit (per yard or per roll, whichever you quote) would be ideal.</p>\n<p>While you're at it, if it's easy, we'd also appreciate the current cost lists for the other lines you rep for us — <strong>Colour & Design, Naturale 54, DeNovo Wall, and Atomic 50</strong> — so we can true everything up in one pass.</p>\n<p>And please confirm our current trade/dealer discount and any freight terms. (I have a note from you that no tariffs are due on Newmor orders — please confirm that still holds, and flag any line where tariffs now apply.)</p>\n<p>Thanks so much — happy to hop on a quick call if that's easier.</p>\n<p>Best,<br>\nSteve Abrams<br>\nDesigner Wallcoverings<br>\n(888) 373-4564 · DesignerWallcoverings.com</p>",
+ "attachments": [],
+ "internalDate": "1787073089000",
+ "body": "<div style=\"font-family:ui-monospace,Menlo,monospace;font-size:10px;letter-spacing:.10em;text-transform:uppercase;color:#7a766f;padding:8px 12px;background:rgba(212,160,74,0.08);border-left:3px solid #d4a04a;margin-bottom:18px;border-radius:2px\"><strong style=\"color:#d4a04a\">From job:</strong> node <span style=\"color:#a8a39c\">·</span> Aug 18, 2026, 10:11 AM</div><p>Hi Jill,</p>\n<p>Hope you're well. We're refreshing the Newmor program on our site and want to make sure our pricing reflects your current numbers.</p>\n<p>Could you send your most recent <strong>2026 wholesale cost list for Newmor</strong>? A per-SKU spreadsheet (CSV or Excel) with the pattern/color code and net wholesale cost per unit (per yard or per roll, whichever you quote) would be ideal.</p>\n<p>While you're at it, if it's easy, we'd also appreciate the current cost lists for the other lines you rep for us — <strong>Colour & Design, Naturale 54, DeNovo Wall, and Atomic 50</strong> — so we can true everything up in one pass.</p>\n<p>And please confirm our current trade/dealer discount and any freight terms. (I have a note from you that no tariffs are due on Newmor orders — please confirm that still holds, and flag any line where tariffs now apply.)</p>\n<p>Thanks so much — happy to hop on a quick call if that's easier.</p>\n<p>Best,<br>\nSteve Abrams<br>\nDesigner Wallcoverings<br>\n(888) 373-4564 · DesignerWallcoverings.com</p>"
+ }
+}
\ No newline at end of file
diff --git a/data/bodies/info__1a059922f619b980.json b/data/bodies/info__1a059922f619b980.json
new file mode 100644
index 0000000..fc711bd
--- /dev/null
+++ b/data/bodies/info__1a059922f619b980.json
@@ -0,0 +1,29 @@
+{
+ "board": {
+ "id": "1a059922f619b980",
+ "account": "info",
+ "subject": "Width spec request — 2 discontinued Maya Romanoff patterns",
+ "why": "DUPLICATE of the steve-office copy, 2 min apart",
+ "age": "Aug 31",
+ "live": true,
+ "bucket": "delete"
+ },
+ "message": {
+ "id": "1a059922f619b980",
+ "threadId": "1a059922f619b980",
+ "labelIds": [
+ "DRAFT"
+ ],
+ "snippet": "From job: node · Aug 31, 2026, 1:45 PM Hi, Quick spec question on two older Maya Romanoff patterns we still carry — both look to be discontinued on your site, so I can't pull the roll width from",
+ "subject": "Width spec request — 2 discontinued Maya Romanoff patterns",
+ "from": "Designer Wallcoverings <info@designerwallcoverings.com>",
+ "to": "",
+ "cc": "",
+ "date": "Mon, 31 Aug 2026 13:45:47 -0700",
+ "bodyHtml": "<div style=\"font-family:ui-monospace,Menlo,monospace;font-size:10px;letter-spacing:.10em;text-transform:uppercase;color:#7a766f;padding:8px 12px;background:rgba(212,160,74,0.08);border-left:3px solid #d4a04a;margin-bottom:18px;border-radius:2px\"><strong style=\"color:#d4a04a\">From job:</strong> node <span style=\"color:#a8a39c\">·</span> Aug 31, 2026, 1:45 PM</div>Hi,\n\nQuick spec question on two older Maya Romanoff patterns we still carry — both look to be discontinued on your site, so I can't pull the roll width from the product pages:\n\n1. Cozy Bed Fellow — Honey (item MR-CC-1506-H)\n2. Cozy Nestle — Beige (item MR-CZ-2511)\n\nCould you send me the roll width (untrimmed, in inches) for each? That's the only field I'm missing to finish our catalog records.\n\nThanks very much,\nSteve Abrams\nDesigner Wallcoverings",
+ "bodyText": "<div style=\"font-family:ui-monospace,Menlo,monospace;font-size:10px;letter-spacing:.10em;text-transform:uppercase;color:#7a766f;padding:8px 12px;background:rgba(212,160,74,0.08);border-left:3px solid #d4a04a;margin-bottom:18px;border-radius:2px\"><strong style=\"color:#d4a04a\">From job:</strong> node <span style=\"color:#a8a39c\">·</span> Aug 31, 2026, 1:45 PM</div>Hi,\n\nQuick spec question on two older Maya Romanoff patterns we still carry — both look to be discontinued on your site, so I can't pull the roll width from the product pages:\n\n1. Cozy Bed Fellow — Honey (item MR-CC-1506-H)\n2. Cozy Nestle — Beige (item MR-CZ-2511)\n\nCould you send me the roll width (untrimmed, in inches) for each? That's the only field I'm missing to finish our catalog records.\n\nThanks very much,\nSteve Abrams\nDesigner Wallcoverings",
+ "attachments": [],
+ "internalDate": "1788209147000",
+ "body": "<div style=\"font-family:ui-monospace,Menlo,monospace;font-size:10px;letter-spacing:.10em;text-transform:uppercase;color:#7a766f;padding:8px 12px;background:rgba(212,160,74,0.08);border-left:3px solid #d4a04a;margin-bottom:18px;border-radius:2px\"><strong style=\"color:#d4a04a\">From job:</strong> node <span style=\"color:#a8a39c\">·</span> Aug 31, 2026, 1:45 PM</div>Hi,\n\nQuick spec question on two older Maya Romanoff patterns we still carry — both look to be discontinued on your site, so I can't pull the roll width from the product pages:\n\n1. Cozy Bed Fellow — Honey (item MR-CC-1506-H)\n2. Cozy Nestle — Beige (item MR-CZ-2511)\n\nCould you send me the roll width (untrimmed, in inches) for each? That's the only field I'm missing to finish our catalog records.\n\nThanks very much,\nSteve Abrams\nDesigner Wallcoverings"
+ }
+}
\ No newline at end of file
diff --git a/data/bodies/info__1a06d1ef99f846d1.json b/data/bodies/info__1a06d1ef99f846d1.json
new file mode 100644
index 0000000..2ff804c
--- /dev/null
+++ b/data/bodies/info__1a06d1ef99f846d1.json
@@ -0,0 +1,32 @@
+{
+ "board": {
+ "id": "1a06d1ef99f846d1",
+ "account": "info",
+ "to": "JCarol@lbiboyd.com · cc stephanie@",
+ "vendor": "Newmor / LBI Boyd",
+ "subject": "Newmor pricing — 3 quick questions",
+ "items": 1294,
+ "gap": "1,294 rows · 0 priced · 305 products dark",
+ "created": "2026-09-04T08:52:21",
+ "live": true,
+ "bucket": "ready"
+ },
+ "message": {
+ "id": "1a06d1ef99f846d1",
+ "threadId": "1a06d1ef99f846d1",
+ "labelIds": [
+ "DRAFT"
+ ],
+ "snippet": "From job: node · Sep 4, 2026, 8:52 AM Hi Jill, Three quick ones on Newmor — we're getting the full range listed on our site and pricing is the last piece. Short answers are fine. Net vs list. On",
+ "subject": "Newmor pricing — 3 quick questions",
+ "from": "Designer Wallcoverings <info@designerwallcoverings.com>",
+ "to": "JCarol@lbiboyd.com",
+ "cc": "stephanie@lbiboyd.com",
+ "date": "Fri, 4 Sep 2026 08:52:21 -0700",
+ "bodyHtml": "<div style=\"font-family:ui-monospace,Menlo,monospace;font-size:10px;letter-spacing:.10em;text-transform:uppercase;color:#7a766f;padding:8px 12px;background:rgba(212,160,74,0.08);border-left:3px solid #d4a04a;margin-bottom:18px;border-radius:2px\"><strong style=\"color:#d4a04a\">From job:</strong> node <span style=\"color:#a8a39c\">·</span> Sep 4, 2026, 8:52 AM</div><p>Hi Jill,</p>\n\n<p>Three quick ones on Newmor — we're getting the full range listed on our site and pricing is the last piece. Short answers are fine.</p>\n\n<ol>\n <li><strong>Net vs list.</strong> On the 24th you gave me KOTA Silk / PIAZZA at <em>$30.95 per yard list, $26.31 with your discount</em>. But the quote you sent on 8/12 for NT65-7918 Flora Rose shows $19.95 in a column headed <em>List Price</em> with no discount line. So I want to be sure I'm reading you right — <strong>is $26.31 our net, and should I treat any bare per-yard number you send as list unless you say otherwise?</strong></li>\n\n <li><strong>Cut charges.</strong> That same 8/12 quote had a $5.00/yd cut charge, and you'd mentioned $3.00/yd for anything under a full bolt. <strong>How does that work generally</strong> — when does each apply? I need it in our pricing or we'll be under-quoting partial-bolt orders.</li>\n\n <li><strong>Full-line pricing.</strong> <strong>Is there a current price list for the whole Newmor line you can send</strong> — a price book, a spreadsheet, anything per-SKU? And if you don't have costs broken out on your side, <strong>the list prices plus the discount rate is enough for us to compute it</strong> — whichever is easier for you. If neither exists, just tell me what I should be pricing off and I'll work with that.</li>\n</ol>\n\n<p>Happy to just call if that's faster — whatever's easiest.</p>\n\n<p>Thanks,<br>\nSteve Abrams<br>\nDesigner Wallcoverings<br>\n(888) 373-4564 · DesignerWallcoverings.com</p>",
+ "bodyText": "<div style=\"font-family:ui-monospace,Menlo,monospace;font-size:10px;letter-spacing:.10em;text-transform:uppercase;color:#7a766f;padding:8px 12px;background:rgba(212,160,74,0.08);border-left:3px solid #d4a04a;margin-bottom:18px;border-radius:2px\"><strong style=\"color:#d4a04a\">From job:</strong> node <span style=\"color:#a8a39c\">·</span> Sep 4, 2026, 8:52 AM</div><p>Hi Jill,</p>\n\n<p>Three quick ones on Newmor — we're getting the full range listed on our site and pricing is the last piece. Short answers are fine.</p>\n\n<ol>\n <li><strong>Net vs list.</strong> On the 24th you gave me KOTA Silk / PIAZZA at <em>$30.95 per yard list, $26.31 with your discount</em>. But the quote you sent on 8/12 for NT65-7918 Flora Rose shows $19.95 in a column headed <em>List Price</em> with no discount line. So I want to be sure I'm reading you right — <strong>is $26.31 our net, and should I treat any bare per-yard number you send as list unless you say otherwise?</strong></li>\n\n <li><strong>Cut charges.</strong> That same 8/12 quote had a $5.00/yd cut charge, and you'd mentioned $3.00/yd for anything under a full bolt. <strong>How does that work generally</strong> — when does each apply? I need it in our pricing or we'll be under-quoting partial-bolt orders.</li>\n\n <li><strong>Full-line pricing.</strong> <strong>Is there a current price list for the whole Newmor line you can send</strong> — a price book, a spreadsheet, anything per-SKU? And if you don't have costs broken out on your side, <strong>the list prices plus the discount rate is enough for us to compute it</strong> — whichever is easier for you. If neither exists, just tell me what I should be pricing off and I'll work with that.</li>\n</ol>\n\n<p>Happy to just call if that's faster — whatever's easiest.</p>\n\n<p>Thanks,<br>\nSteve Abrams<br>\nDesigner Wallcoverings<br>\n(888) 373-4564 · DesignerWallcoverings.com</p>",
+ "attachments": [],
+ "internalDate": "1788537141000",
+ "body": "<div style=\"font-family:ui-monospace,Menlo,monospace;font-size:10px;letter-spacing:.10em;text-transform:uppercase;color:#7a766f;padding:8px 12px;background:rgba(212,160,74,0.08);border-left:3px solid #d4a04a;margin-bottom:18px;border-radius:2px\"><strong style=\"color:#d4a04a\">From job:</strong> node <span style=\"color:#a8a39c\">·</span> Sep 4, 2026, 8:52 AM</div><p>Hi Jill,</p>\n\n<p>Three quick ones on Newmor — we're getting the full range listed on our site and pricing is the last piece. Short answers are fine.</p>\n\n<ol>\n <li><strong>Net vs list.</strong> On the 24th you gave me KOTA Silk / PIAZZA at <em>$30.95 per yard list, $26.31 with your discount</em>. But the quote you sent on 8/12 for NT65-7918 Flora Rose shows $19.95 in a column headed <em>List Price</em> with no discount line. So I want to be sure I'm reading you right — <strong>is $26.31 our net, and should I treat any bare per-yard number you send as list unless you say otherwise?</strong></li>\n\n <li><strong>Cut charges.</strong> That same 8/12 quote had a $5.00/yd cut charge, and you'd mentioned $3.00/yd for anything under a full bolt. <strong>How does that work generally</strong> — when does each apply? I need it in our pricing or we'll be under-quoting partial-bolt orders.</li>\n\n <li><strong>Full-line pricing.</strong> <strong>Is there a current price list for the whole Newmor line you can send</strong> — a price book, a spreadsheet, anything per-SKU? And if you don't have costs broken out on your side, <strong>the list prices plus the discount rate is enough for us to compute it</strong> — whichever is easier for you. If neither exists, just tell me what I should be pricing off and I'll work with that.</li>\n</ol>\n\n<p>Happy to just call if that's faster — whatever's easiest.</p>\n\n<p>Thanks,<br>\nSteve Abrams<br>\nDesigner Wallcoverings<br>\n(888) 373-4564 · DesignerWallcoverings.com</p>"
+ }
+}
\ No newline at end of file
diff --git a/data/bodies/steve-office__19f3d1a86a49b8c6.json b/data/bodies/steve-office__19f3d1a86a49b8c6.json
new file mode 100644
index 0000000..aafbd12
--- /dev/null
+++ b/data/bodies/steve-office__19f3d1a86a49b8c6.json
@@ -0,0 +1,27 @@
+{
+ "board": {
+ "id": "19f3d1a86a49b8c6",
+ "account": "steve-office",
+ "subject": "Pricing request — Dr. Feelgood Henna",
+ "why": "WRONG SCOPE — asks 1 SKU, catalog needs 1,470",
+ "age": "Jul 7",
+ "live": true,
+ "bucket": "delete"
+ },
+ "message": {
+ "id": "19f3d1a86a49b8c6",
+ "threadId": "19f3d1a86a49b8c6",
+ "labelIds": [
+ "DRAFT"
+ ],
+ "snippet": "From job: node · Jul 7, 2026, 8:02 AM Hello Reid Witlin team, Could you please confirm our current net / wholesale cost (and any applicable discount) on the following item? Pattern: Dr. Feelgood Henna",
+ "subject": "Pricing request — Dr. Feelgood Henna (dr-feelgood-henna)",
+ "from": "\"Steve Abrams (DW)\" <steve@designerwallcoverings.com>",
+ "to": "samples@rwltd.com",
+ "cc": "",
+ "date": "Tue, 7 Jul 2026 08:02:56 -0700",
+ "body": "<div style=\"font-family:ui-monospace,Menlo,monospace;font-size:10px;letter-spacing:.10em;text-transform:uppercase;color:#7a766f;padding:8px 12px;background:rgba(212,160,74,0.08);border-left:3px solid #d4a04a;margin-bottom:18px;border-radius:2px\"><strong style=\"color:#d4a04a\">From job:</strong> node <span style=\"color:#a8a39c\">·</span> Jul 7, 2026, 8:02 AM</div><p>Hello Reid Witlin team,</p>\n<p>Could you please confirm our current net / wholesale cost (and any applicable discount) on the following item?</p>\n<p> <b>Pattern:</b> Dr. Feelgood Henna<br> <b>Item / SKU:</b> dr-feelgood-henna</p>\n<p>This is for Designer Wallcoverings. Please reference this request in your reply.</p>\n<p>Thank you very much — we appreciate your help!</p>\n<p>Warm regards,<br><br>Designer Wallcoverings — Purchasing<br>steve@designerwallcoverings.com</p>",
+ "attachments": [],
+ "internalDate": "1783436576000"
+ }
+}
\ No newline at end of file
diff --git a/data/bodies/steve-office__19f3e1c8c8a01b4d.json b/data/bodies/steve-office__19f3e1c8c8a01b4d.json
new file mode 100644
index 0000000..3f5b75e
--- /dev/null
+++ b/data/bodies/steve-office__19f3e1c8c8a01b4d.json
@@ -0,0 +1,27 @@
+{
+ "board": {
+ "id": "19f3e1c8c8a01b4d",
+ "account": "steve-office",
+ "subject": "Request: Full Command Wallcovering price list",
+ "why": "DUPLICATE — written 3h after the one above, same day",
+ "age": "Jul 7",
+ "live": true,
+ "bucket": "delete"
+ },
+ "message": {
+ "id": "19f3e1c8c8a01b4d",
+ "threadId": "19f3e1c8c8a01b4d",
+ "labelIds": [
+ "DRAFT"
+ ],
+ "snippet": "From job: node · Jul 7, 2026, 12:44 PM Hello, My name is Steve Abrams, with Designer Wallcoverings & Fabrics — a design-trade showroom and online retailer serving interior designers, architects,",
+ "subject": "Request: Full Command Wallcovering price list — Designer Wallcoverings & Fabrics (trade account)",
+ "from": "\"Steve Abrams (DW)\" <steve@designerwallcoverings.com>",
+ "to": "Customerservice@nationalsolutions.com",
+ "cc": "",
+ "date": "Tue, 7 Jul 2026 12:44:46 -0700",
+ "body": "<div style=\"font-family:ui-monospace,Menlo,monospace;font-size:10px;letter-spacing:.10em;text-transform:uppercase;color:#7a766f;padding:8px 12px;background:rgba(212,160,74,0.08);border-left:3px solid #d4a04a;margin-bottom:18px;border-radius:2px\"><strong style=\"color:#d4a04a\">From job:</strong> node <span style=\"color:#a8a39c\">·</span> Jul 7, 2026, 12:44 PM</div><p>Hello,</p>\n\n<p>My name is Steve Abrams, with <strong>Designer Wallcoverings & Fabrics</strong> — a design-trade showroom and online retailer serving interior designers, architects, and commercial/hospitality clients nationwide.</p>\n\n<p>We actively present and specify the <strong>Command Wallcovering</strong> line for our showroom clients, and we'd like to make sure we're quoting it accurately and competitively. To do that, could you please send us your <strong>complete current price list for the entire Command Wallcovering collection</strong>?</p>\n\n<p>Specifically, it would help us most to receive, for every pattern and colorway (e.g. the CM-series such as the CM105 \"Argonne Silk\" line and all others):</p>\n\n<ul>\n <li><strong>Item / pattern number and color name</strong></li>\n <li><strong>Wholesale / trade (net) price</strong> — and any Minimum Advertised Price (MAP), if one applies</li>\n <li><strong>Unit of measure</strong> (per yard / per roll / per bolt) and roll/bolt dimensions and width</li>\n <li><strong>Current stock / availability status</strong></li>\n <li>Any <strong>minimum order</strong> and standard <strong>lead time</strong></li>\n</ul>\n\n<p>A spreadsheet or CSV of the full line would be ideal, but whatever format you have on hand is fine.</p>\n\n<p>If we're not already set up as a trade account with you, please also let us know what you need to <strong>open (or confirm) our account</strong> and your current ordering and freight terms.</p>\n\n<p>Having your full, current pricing on file lets us serve our showroom clients faster and quote with confidence — we appreciate your help.</p>\n\n<p>Thank you,</p>\n\n<p>\n<strong>Steve Abrams</strong><br>\nDesigner Wallcoverings & Fabrics<br>\n(888) 373-4564<br>\nsteve@designerwallcoverings.com<br>\nwww.DesignerWallcoverings.com\n</p>",
+ "attachments": [],
+ "internalDate": "1783453486000"
+ }
+}
\ No newline at end of file
diff --git a/data/bodies/steve-office__19f3e20f58596b3e.json b/data/bodies/steve-office__19f3e20f58596b3e.json
new file mode 100644
index 0000000..1a55b99
--- /dev/null
+++ b/data/bodies/steve-office__19f3e20f58596b3e.json
@@ -0,0 +1,27 @@
+{
+ "board": {
+ "id": "19f3e20f58596b3e",
+ "account": "steve-office",
+ "subject": "Command Wallcovering — full price list request",
+ "why": "superseded by today's fresh draft",
+ "age": "Jul 7",
+ "live": true,
+ "bucket": "delete"
+ },
+ "message": {
+ "id": "19f3e20f58596b3e",
+ "threadId": "19f3e20f58596b3e",
+ "labelIds": [
+ "DRAFT"
+ ],
+ "snippet": "From job: node · Jul 7, 2026, 12:49 PM Hello, My name is Steve Abrams, with Designer Wallcoverings & Fabrics — a design-trade showroom and online retailer serving interior designers, architects,",
+ "subject": "Command Wallcovering — full price list request (Designer Wallcoverings & Fabrics, trade)",
+ "from": "\"Steve Abrams (DW)\" <steve@designerwallcoverings.com>",
+ "to": "Customerservice@nationalsolutions.com",
+ "cc": "",
+ "date": "Tue, 7 Jul 2026 15:49:35 -0400",
+ "body": "<div style=\"font-family:ui-monospace,Menlo,monospace;font-size:10px;letter-spacing:.10em;text-transform:uppercase;color:#7a766f;padding:8px 12px;background:rgba(212,160,74,0.08);border-left:3px solid #d4a04a;margin-bottom:18px;border-radius:2px\"><strong style=\"color:#d4a04a\">From job:</strong> node <span style=\"color:#a8a39c\">·</span> Jul 7, 2026, 12:49 PM</div><p>Hello,</p>\n\n<p>My name is Steve Abrams, with <strong>Designer Wallcoverings & Fabrics</strong> — a design-trade showroom and online retailer serving interior designers, architects, and commercial/hospitality clients nationwide.</p>\n\n<p>I understand <strong>National Solutions represents the Command Wallcovering line</strong> — which we actively present and specify for our showroom clients. To make sure we're quoting Command accurately and competitively, could you please send us your <strong>complete current price list for the entire Command Wallcovering collection</strong>?</p>\n\n<p>For every pattern and colorway (e.g. the CM-series such as the CM105 \"Argonne Silk\" line, and all others), the most helpful details would be:</p>\n\n<ul>\n <li><strong>Item / pattern number and color name</strong></li>\n <li><strong>Wholesale / trade (net) price</strong> — and any Minimum Advertised Price (MAP), if one applies</li>\n <li><strong>Unit of measure</strong> (per yard / per roll / per bolt), roll/bolt dimensions and width</li>\n <li><strong>Current stock / availability status</strong></li>\n <li>Any <strong>minimum order</strong> and standard <strong>lead time</strong></li>\n</ul>\n\n<p>A spreadsheet or CSV of the full line would be ideal, but whatever format you have on hand is fine.</p>\n\n<p>If we're not already set up to order Command through you, please also let us know what you need to <strong>open (or confirm) our account</strong>, along with your current ordering and freight terms.</p>\n\n<p>Having your full, current pricing on file lets us serve our showroom clients faster and quote Command with confidence. We appreciate your help and look forward to working with you.</p>\n\n<p>Thank you,</p>\n\n<p>\n<strong>Steve Abrams</strong><br>\nDesigner Wallcoverings & Fabrics<br>\n(888) 373-4564<br>\nsteve@designerwallcoverings.com<br>\nwww.DesignerWallcoverings.com\n</p>",
+ "attachments": [],
+ "internalDate": "1783453775000"
+ }
+}
\ No newline at end of file
diff --git a/data/bodies/steve-office__19f906c4a8f0e8fe.json b/data/bodies/steve-office__19f906c4a8f0e8fe.json
new file mode 100644
index 0000000..11f5a7f
--- /dev/null
+++ b/data/bodies/steve-office__19f906c4a8f0e8fe.json
@@ -0,0 +1,27 @@
+{
+ "board": {
+ "id": "19f906c4a8f0e8fe",
+ "account": "steve-office",
+ "subject": "Trade / wholesale pricing request — Vahallan",
+ "why": "superseded by today's fresh draft",
+ "age": "Jul 23",
+ "live": true,
+ "bucket": "delete"
+ },
+ "message": {
+ "id": "19f906c4a8f0e8fe",
+ "threadId": "19f906c4a8f0e8fe",
+ "labelIds": [
+ "DRAFT"
+ ],
+ "snippet": "From job: node · Jul 23, 2026, 12:20 PM Hello Vahallan team, I'm Steve Abrams with Designer Wallcoverings, a to-the-trade wallcovering and fabric retailer. We've been admirers of your hand-",
+ "subject": "Trade / wholesale pricing request — Designer Wallcoverings",
+ "from": "\"Steve Abrams (DW)\" <steve@designerwallcoverings.com>",
+ "to": "info@vahallan.com",
+ "cc": "",
+ "date": "Thu, 23 Jul 2026 12:20:43 -0700",
+ "body": "<div style=\"font-family:ui-monospace,Menlo,monospace;font-size:10px;letter-spacing:.10em;text-transform:uppercase;color:#7a766f;padding:8px 12px;background:rgba(212,160,74,0.08);border-left:3px solid #d4a04a;margin-bottom:18px;border-radius:2px\"><strong style=\"color:#d4a04a\">From job:</strong> node <span style=\"color:#a8a39c\">·</span> Jul 23, 2026, 12:20 PM</div><p>Hello Vahallan team,</p>\n\n<p>I'm Steve Abrams with <strong>Designer Wallcoverings</strong>, a to-the-trade wallcovering and fabric retailer. We've been admirers of your hand-painted line and would love to carry the full Vahallan collection for our designer clientele.</p>\n\n<p>Could you please send over your current <strong>trade / wholesale price list</strong> so we can set up the line correctly on our end? Specifically, for each pattern we'd want to confirm:</p>\n\n<ul>\n <li><strong>Wholesale (net) cost</strong> per unit, and the <strong>unit of sale</strong> (per yard / per roll / per panel / square foot)</li>\n <li>Any <strong>trade discount</strong> off list, and your standard <strong>minimum order</strong></li>\n <li><strong>Roll / panel dimensions</strong> (width and length / coverage per unit)</li>\n <li>Whether pricing is fixed or <strong>custom/quote-based</strong> per project</li>\n <li><strong>Sample / memo</strong> ordering process and cost, and typical <strong>lead time</strong></li>\n</ul>\n\n<p>If you have a dealer or to-the-trade application, we're glad to complete it. And if there's a specific rep or wholesale contact we should be working with, please point us their way.</p>\n\n<p>Thank you — looking forward to featuring the collection.</p>\n\n<p>Warm regards,<br>\nSteve Abrams<br>\nDesigner Wallcoverings<br>\nsteve@designerwallcoverings.com</p>",
+ "attachments": [],
+ "internalDate": "1784834443000"
+ }
+}
\ No newline at end of file
diff --git a/data/bodies/steve-office__19ff677a456e1e61.json b/data/bodies/steve-office__19ff677a456e1e61.json
new file mode 100644
index 0000000..66ac243
--- /dev/null
+++ b/data/bodies/steve-office__19ff677a456e1e61.json
@@ -0,0 +1,28 @@
+{
+ "board": {
+ "id": "19ff677a456e1e61",
+ "account": "steve-office",
+ "subject": "Willem — Lee Jofa Levens Velvet quote ($476.85/yd)",
+ "why": "customer reply, 23 days stale — your call: delete",
+ "age": "Aug 12",
+ "customer": true,
+ "live": true,
+ "bucket": "delete"
+ },
+ "message": {
+ "id": "19ff677a456e1e61",
+ "threadId": "19ff677a456e1e61",
+ "labelIds": [
+ "DRAFT"
+ ],
+ "snippet": "From job: node · Aug 12, 2026, 7:54 AM Hi Willem, Happy to help with the ~16 yards of Lee Jofa Levens Velvet in Navy (DWKK-134995). List is $476.85/yd, and since this is for a client proposal I can set",
+ "subject": "Your Lee Jofa Levens Velvet quote (DWKK-134995)",
+ "from": "\"Steve Abrams (DW)\" <steve@designerwallcoverings.com>",
+ "to": "info@willemhendrik.com",
+ "cc": "",
+ "date": "Wed, 12 Aug 2026 14:54:23 +0000",
+ "body": "<div style=\"font-family:ui-monospace,Menlo,monospace;font-size:10px;letter-spacing:.10em;text-transform:uppercase;color:#7a766f;padding:8px 12px;background:rgba(212,160,74,0.08);border-left:3px solid #d4a04a;margin-bottom:18px;border-radius:2px\"><strong style=\"color:#d4a04a\">From job:</strong> node <span style=\"color:#a8a39c\">·</span> Aug 12, 2026, 7:54 AM</div><p>Hi Willem,</p><p>Happy to help with the ~16 yards of Lee Jofa Levens Velvet in Navy (DWKK-134995). List is $476.85/yd, and since this is for a client proposal I can set you up with trade pricing — no account needed to order.</p><p>Want me to put a formal quote together and hold the yardage for you?</p><p>Best,<br>Steve<br>Designer Wallcoverings</p>",
+ "attachments": [],
+ "internalDate": "1786546463000"
+ }
+}
\ No newline at end of file
diff --git a/data/bodies/steve-office__19ff677c9748dd70.json b/data/bodies/steve-office__19ff677c9748dd70.json
new file mode 100644
index 0000000..ce3d1b2
--- /dev/null
+++ b/data/bodies/steve-office__19ff677c9748dd70.json
@@ -0,0 +1,28 @@
+{
+ "board": {
+ "id": "19ff677c9748dd70",
+ "account": "steve-office",
+ "subject": "Jane — yes you can buy the Merlot pillows",
+ "why": "customer reply, 23 days stale",
+ "age": "Aug 12",
+ "customer": true,
+ "live": true,
+ "bucket": "delete"
+ },
+ "message": {
+ "id": "19ff677c9748dd70",
+ "threadId": "19ff677c9748dd70",
+ "labelIds": [
+ "DRAFT"
+ ],
+ "snippet": "From job: node · Aug 12, 2026, 7:54 AM Hi Jane, You can absolutely purchase the Schumacher Performance Silk Velvet pillows in Merlot — the site just defaults to showing the sample. They're $495.93",
+ "subject": "Yes — you can buy the Merlot pillows (not just samples)",
+ "from": "\"Steve Abrams (DW)\" <steve@designerwallcoverings.com>",
+ "to": "jane@panattoni.com",
+ "cc": "",
+ "date": "Wed, 12 Aug 2026 07:54:33 -0700",
+ "body": "<div style=\"font-family:ui-monospace,Menlo,monospace;font-size:10px;letter-spacing:.10em;text-transform:uppercase;color:#7a766f;padding:8px 12px;background:rgba(212,160,74,0.08);border-left:3px solid #d4a04a;margin-bottom:18px;border-radius:2px\"><strong style=\"color:#d4a04a\">From job:</strong> node <span style=\"color:#a8a39c\">·</span> Aug 12, 2026, 7:54 AM</div><p>Hi Jane,</p><p>You can absolutely purchase the Schumacher Performance Silk Velvet pillows in Merlot — the site just defaults to showing the sample. They're $495.93 each, so three would be $1,487.79 plus shipping.</p><p>Reply with your shipping address and I'll place the order for you directly.</p><p>Best,<br>Steve<br>Designer Wallcoverings</p>",
+ "attachments": [],
+ "internalDate": "1786546473000"
+ }
+}
\ No newline at end of file
diff --git a/data/bodies/steve-office__19ff677d1895b6f4.json b/data/bodies/steve-office__19ff677d1895b6f4.json
new file mode 100644
index 0000000..015184e
--- /dev/null
+++ b/data/bodies/steve-office__19ff677d1895b6f4.json
@@ -0,0 +1,28 @@
+{
+ "board": {
+ "id": "19ff677d1895b6f4",
+ "account": "steve-office",
+ "subject": "Laura — ready to place Wolf Gordon Forge order",
+ "why": "customer reply, 23 days stale",
+ "age": "Aug 12",
+ "customer": true,
+ "live": true,
+ "bucket": "delete"
+ },
+ "message": {
+ "id": "19ff677d1895b6f4",
+ "threadId": "19ff677d1895b6f4",
+ "labelIds": [
+ "DRAFT"
+ ],
+ "snippet": "From job: node · Aug 12, 2026, 7:54 AM Hi Laura, Following up on your note that you'd like to order the Wolf Gordon Forge (Powder). Just tell me the quantity/rooms and I'll get it set up and",
+ "subject": "Ready to place your Wolf Gordon Forge order",
+ "from": "\"Steve Abrams (DW)\" <steve@designerwallcoverings.com>",
+ "to": "laura@trinitycgi.com",
+ "cc": "",
+ "date": "Wed, 12 Aug 2026 07:54:35 -0700",
+ "body": "<div style=\"font-family:ui-monospace,Menlo,monospace;font-size:10px;letter-spacing:.10em;text-transform:uppercase;color:#7a766f;padding:8px 12px;background:rgba(212,160,74,0.08);border-left:3px solid #d4a04a;margin-bottom:18px;border-radius:2px\"><strong style=\"color:#d4a04a\">From job:</strong> node <span style=\"color:#a8a39c\">·</span> Aug 12, 2026, 7:54 AM</div><p>Hi Laura,</p><p>Following up on your note that you'd like to order the Wolf Gordon Forge (Powder). Just tell me the quantity/rooms and I'll get it set up and moving for you.</p><p>Best,<br>Steve<br>Designer Wallcoverings</p>",
+ "attachments": [],
+ "internalDate": "1786546475000"
+ }
+}
\ No newline at end of file
diff --git a/data/bodies/steve-office__19ff67c1ef9c846b.json b/data/bodies/steve-office__19ff67c1ef9c846b.json
new file mode 100644
index 0000000..8f1f0a7
--- /dev/null
+++ b/data/bodies/steve-office__19ff67c1ef9c846b.json
@@ -0,0 +1,28 @@
+{
+ "board": {
+ "id": "19ff67c1ef9c846b",
+ "account": "steve-office",
+ "subject": "Shani — expedited samples",
+ "why": "customer reply, 23 days stale",
+ "age": "Aug 12",
+ "customer": true,
+ "live": true,
+ "bucket": "delete"
+ },
+ "message": {
+ "id": "19ff67c1ef9c846b",
+ "threadId": "19ff67c1ef9c846b",
+ "labelIds": [
+ "DRAFT"
+ ],
+ "snippet": "From job: node · Aug 12, 2026, 7:59 AM Hi Shani, Yes — we can expedite your samples. Just send me the patterns (or your cart) and your shipping address, and I'll rush them out. Best, Steve Designer",
+ "subject": "Expedited samples — happy to rush them",
+ "from": "\"Steve Abrams (DW)\" <steve@designerwallcoverings.com>",
+ "to": "shani@elizabethmartell.com",
+ "cc": "",
+ "date": "Wed, 12 Aug 2026 07:59:17 -0700",
+ "body": "<div style=\"font-family:ui-monospace,Menlo,monospace;font-size:10px;letter-spacing:.10em;text-transform:uppercase;color:#7a766f;padding:8px 12px;background:rgba(212,160,74,0.08);border-left:3px solid #d4a04a;margin-bottom:18px;border-radius:2px\"><strong style=\"color:#d4a04a\">From job:</strong> node <span style=\"color:#a8a39c\">·</span> Aug 12, 2026, 7:59 AM</div><p>Hi Shani,</p><p>Yes — we can expedite your samples. Just send me the patterns (or your cart) and your shipping address, and I'll rush them out.</p><p>Best,<br>Steve<br>Designer Wallcoverings</p>",
+ "attachments": [],
+ "internalDate": "1786546757000"
+ }
+}
\ No newline at end of file
diff --git a/data/bodies/steve-office__19ff67c288b79265.json b/data/bodies/steve-office__19ff67c288b79265.json
new file mode 100644
index 0000000..535bd24
--- /dev/null
+++ b/data/bodies/steve-office__19ff67c288b79265.json
@@ -0,0 +1,28 @@
+{
+ "board": {
+ "id": "19ff67c288b79265",
+ "account": "steve-office",
+ "subject": "Rita — roll count for 368 sq ft bedroom",
+ "why": "customer reply, 23 days stale",
+ "age": "Aug 12",
+ "customer": true,
+ "live": true,
+ "bucket": "delete"
+ },
+ "message": {
+ "id": "19ff67c288b79265",
+ "threadId": "19ff67c288b79265",
+ "labelIds": [
+ "DRAFT"
+ ],
+ "snippet": "From job: node · Aug 12, 2026, 7:59 AM Hi Rita, For a 368 sq ft bedroom in the Hot Diggity Dog tile, I'll calculate the exact roll count (accounting for pattern repeat + trim) and send it over with",
+ "subject": "Roll count for your 368 sq ft bedroom",
+ "from": "\"Steve Abrams (DW)\" <steve@designerwallcoverings.com>",
+ "to": "meankittydesign@gmail.com",
+ "cc": "",
+ "date": "Wed, 12 Aug 2026 07:59:20 -0700",
+ "body": "<div style=\"font-family:ui-monospace,Menlo,monospace;font-size:10px;letter-spacing:.10em;text-transform:uppercase;color:#7a766f;padding:8px 12px;background:rgba(212,160,74,0.08);border-left:3px solid #d4a04a;margin-bottom:18px;border-radius:2px\"><strong style=\"color:#d4a04a\">From job:</strong> node <span style=\"color:#a8a39c\">·</span> Aug 12, 2026, 7:59 AM</div><p>Hi Rita,</p><p>For a 368 sq ft bedroom in the Hot Diggity Dog tile, I'll calculate the exact roll count (accounting for pattern repeat + trim) and send it over with pricing so you can order with confidence. Want me to run that now?</p><p>Best,<br>Steve<br>Designer Wallcoverings</p>",
+ "attachments": [],
+ "internalDate": "1786546760000"
+ }
+}
\ No newline at end of file
diff --git a/data/bodies/steve-office__19ff67c334844485.json b/data/bodies/steve-office__19ff67c334844485.json
new file mode 100644
index 0000000..c1b94f1
--- /dev/null
+++ b/data/bodies/steve-office__19ff67c334844485.json
@@ -0,0 +1,28 @@
+{
+ "board": {
+ "id": "19ff67c334844485",
+ "account": "steve-office",
+ "subject": "Leslie — Fleur de Lis coverage + pricing",
+ "why": "customer reply, 23 days stale",
+ "age": "Aug 12",
+ "customer": true,
+ "live": true,
+ "bucket": "delete"
+ },
+ "message": {
+ "id": "19ff67c334844485",
+ "threadId": "19ff67c334844485",
+ "labelIds": [
+ "DRAFT"
+ ],
+ "snippet": "From job: node · Aug 12, 2026, 7:59 AM Hi Leslie, For 120 sq ft of the Maya Romanoff Fleur de Lis (Beige & Cream), I'll confirm exactly how many rolls you need along with the per-roll coverage",
+ "subject": "Coverage + pricing for the Fleur de Lis",
+ "from": "\"Steve Abrams (DW)\" <steve@designerwallcoverings.com>",
+ "to": "leslieofthelake@gmail.com",
+ "cc": "",
+ "date": "Wed, 12 Aug 2026 07:59:22 -0700",
+ "body": "<div style=\"font-family:ui-monospace,Menlo,monospace;font-size:10px;letter-spacing:.10em;text-transform:uppercase;color:#7a766f;padding:8px 12px;background:rgba(212,160,74,0.08);border-left:3px solid #d4a04a;margin-bottom:18px;border-radius:2px\"><strong style=\"color:#d4a04a\">From job:</strong> node <span style=\"color:#a8a39c\">·</span> Aug 12, 2026, 7:59 AM</div><p>Hi Leslie,</p><p>For 120 sq ft of the Maya Romanoff Fleur de Lis (Beige & Cream), I'll confirm exactly how many rolls you need along with the per-roll coverage and price, then send a quote.</p><p>Best,<br>Steve<br>Designer Wallcoverings</p>",
+ "attachments": [],
+ "internalDate": "1786546762000"
+ }
+}
\ No newline at end of file
diff --git a/data/bodies/steve-office__19ff67c3b9d347b7.json b/data/bodies/steve-office__19ff67c3b9d347b7.json
new file mode 100644
index 0000000..f1556d0
--- /dev/null
+++ b/data/bodies/steve-office__19ff67c3b9d347b7.json
@@ -0,0 +1,28 @@
+{
+ "board": {
+ "id": "19ff67c3b9d347b7",
+ "account": "steve-office",
+ "subject": "Nancy — Lee Jofa Lagoon sample",
+ "why": "customer reply, 23 days stale",
+ "age": "Aug 12",
+ "customer": true,
+ "live": true,
+ "bucket": "delete"
+ },
+ "message": {
+ "id": "19ff67c3b9d347b7",
+ "threadId": "19ff67c3b9d347b7",
+ "labelIds": [
+ "DRAFT"
+ ],
+ "snippet": "From job: node · Aug 12, 2026, 7:59 AM Hi Nancy, Great eye — it was gorgeous in Southern Living! I'll get a sample of the Arley Paper Lagoon Multi by Lee Jofa out to you; just confirm your mailing",
+ "subject": "Your Lee Jofa Lagoon sample",
+ "from": "\"Steve Abrams (DW)\" <steve@designerwallcoverings.com>",
+ "to": "ncsfoster@yahoo.com",
+ "cc": "",
+ "date": "Wed, 12 Aug 2026 07:59:24 -0700",
+ "body": "<div style=\"font-family:ui-monospace,Menlo,monospace;font-size:10px;letter-spacing:.10em;text-transform:uppercase;color:#7a766f;padding:8px 12px;background:rgba(212,160,74,0.08);border-left:3px solid #d4a04a;margin-bottom:18px;border-radius:2px\"><strong style=\"color:#d4a04a\">From job:</strong> node <span style=\"color:#a8a39c\">·</span> Aug 12, 2026, 7:59 AM</div><p>Hi Nancy,</p><p>Great eye — it was gorgeous in Southern Living! I'll get a sample of the Arley Paper Lagoon Multi by Lee Jofa out to you; just confirm your mailing address.</p><p>Best,<br>Steve<br>Designer Wallcoverings</p>",
+ "attachments": [],
+ "internalDate": "1786546764000"
+ }
+}
\ No newline at end of file
diff --git a/data/bodies/steve-office__19ff67c4e29d46c2.json b/data/bodies/steve-office__19ff67c4e29d46c2.json
new file mode 100644
index 0000000..9ace0a2
--- /dev/null
+++ b/data/bodies/steve-office__19ff67c4e29d46c2.json
@@ -0,0 +1,28 @@
+{
+ "board": {
+ "id": "19ff67c4e29d46c2",
+ "account": "steve-office",
+ "subject": "David — Roberto Cavalli RC21003 pricing",
+ "why": "customer reply, 23 days stale",
+ "age": "Aug 12",
+ "customer": true,
+ "live": true,
+ "bucket": "delete"
+ },
+ "message": {
+ "id": "19ff67c4e29d46c2",
+ "threadId": "19ff67c4e29d46c2",
+ "labelIds": [
+ "DRAFT"
+ ],
+ "snippet": "From job: node · Aug 12, 2026, 7:59 AM Hi David, Happy to price the Roberto Cavalli RC21003 for you. I'll pull the current per-roll pricing — how many rolls, and what's the space? Best, Steve",
+ "subject": "Roberto Cavalli RC21003 pricing",
+ "from": "\"Steve Abrams (DW)\" <steve@designerwallcoverings.com>",
+ "to": "davidik@yahoo.com",
+ "cc": "",
+ "date": "Wed, 12 Aug 2026 07:59:29 -0700",
+ "body": "<div style=\"font-family:ui-monospace,Menlo,monospace;font-size:10px;letter-spacing:.10em;text-transform:uppercase;color:#7a766f;padding:8px 12px;background:rgba(212,160,74,0.08);border-left:3px solid #d4a04a;margin-bottom:18px;border-radius:2px\"><strong style=\"color:#d4a04a\">From job:</strong> node <span style=\"color:#a8a39c\">·</span> Aug 12, 2026, 7:59 AM</div><p>Hi David,</p><p>Happy to price the Roberto Cavalli RC21003 for you. I'll pull the current per-roll pricing — how many rolls, and what's the space?</p><p>Best,<br>Steve<br>Designer Wallcoverings</p>",
+ "attachments": [],
+ "internalDate": "1786546769000"
+ }
+}
\ No newline at end of file
diff --git a/data/bodies/steve-office__19ff67c543906d8f.json b/data/bodies/steve-office__19ff67c543906d8f.json
new file mode 100644
index 0000000..90c1cf5
--- /dev/null
+++ b/data/bodies/steve-office__19ff67c543906d8f.json
@@ -0,0 +1,28 @@
+{
+ "board": {
+ "id": "19ff67c543906d8f",
+ "account": "steve-office",
+ "subject": "Andrew — Fidelity Flora NT65 / Glamour CM178",
+ "why": "customer reply, 23 days stale",
+ "age": "Aug 12",
+ "customer": true,
+ "live": true,
+ "bucket": "delete"
+ },
+ "message": {
+ "id": "19ff67c543906d8f",
+ "threadId": "19ff67c543906d8f",
+ "labelIds": [
+ "DRAFT"
+ ],
+ "snippet": "From job: node · Aug 12, 2026, 7:59 AM Hi Andrew, I can source both Fidelity options — Flora NT65 (Rose) and Glamour CM178. I'll confirm availability, lead time, and trade pricing. Shall I quote",
+ "subject": "Fidelity Flora NT65 / Glamour CM178 for your project",
+ "from": "\"Steve Abrams (DW)\" <steve@designerwallcoverings.com>",
+ "to": "andrew@berrybd.com",
+ "cc": "",
+ "date": "Wed, 12 Aug 2026 07:59:31 -0700",
+ "body": "<div style=\"font-family:ui-monospace,Menlo,monospace;font-size:10px;letter-spacing:.10em;text-transform:uppercase;color:#7a766f;padding:8px 12px;background:rgba(212,160,74,0.08);border-left:3px solid #d4a04a;margin-bottom:18px;border-radius:2px\"><strong style=\"color:#d4a04a\">From job:</strong> node <span style=\"color:#a8a39c\">·</span> Aug 12, 2026, 7:59 AM</div><p>Hi Andrew,</p><p>I can source both Fidelity options — Flora NT65 (Rose) and Glamour CM178. I'll confirm availability, lead time, and trade pricing. Shall I quote both, or are you leaning one way?</p><p>Best,<br>Steve<br>Designer Wallcoverings</p>",
+ "attachments": [],
+ "internalDate": "1786546771000"
+ }
+}
\ No newline at end of file
diff --git a/data/bodies/steve-office__19ff67c5f7a58198.json b/data/bodies/steve-office__19ff67c5f7a58198.json
new file mode 100644
index 0000000..10879c0
--- /dev/null
+++ b/data/bodies/steve-office__19ff67c5f7a58198.json
@@ -0,0 +1,28 @@
+{
+ "board": {
+ "id": "19ff67c5f7a58198",
+ "account": "steve-office",
+ "subject": "Jeanette — glass beaded for art project",
+ "why": "customer reply, 23 days stale",
+ "age": "Aug 12",
+ "customer": true,
+ "live": true,
+ "bucket": "delete"
+ },
+ "message": {
+ "id": "19ff67c5f7a58198",
+ "threadId": "19ff67c5f7a58198",
+ "labelIds": [
+ "DRAFT"
+ ],
+ "snippet": "From job: node · Aug 12, 2026, 7:59 AM Hi Jeanette, Love that you're using it for art. The clear glass beaded wallcovering is normally sold by the roll, but tell me how much you need and I'll",
+ "subject": "Glass beaded wallcovering for your art project",
+ "from": "\"Steve Abrams (DW)\" <steve@designerwallcoverings.com>",
+ "to": "jeanettegriffith927@gmail.com",
+ "cc": "",
+ "date": "Wed, 12 Aug 2026 07:59:33 -0700",
+ "body": "<div style=\"font-family:ui-monospace,Menlo,monospace;font-size:10px;letter-spacing:.10em;text-transform:uppercase;color:#7a766f;padding:8px 12px;background:rgba(212,160,74,0.08);border-left:3px solid #d4a04a;margin-bottom:18px;border-radius:2px\"><strong style=\"color:#d4a04a\">From job:</strong> node <span style=\"color:#a8a39c\">·</span> Aug 12, 2026, 7:59 AM</div><p>Hi Jeanette,</p><p>Love that you're using it for art. The clear glass beaded wallcovering is normally sold by the roll, but tell me how much you need and I'll see what we can do on a partial / by-the-yard basis for your project.</p><p>Best,<br>Steve<br>Designer Wallcoverings</p>",
+ "attachments": [],
+ "internalDate": "1786546773000"
+ }
+}
\ No newline at end of file
diff --git a/data/bodies/steve-office__19ff67c6cc0dc4e4.json b/data/bodies/steve-office__19ff67c6cc0dc4e4.json
new file mode 100644
index 0000000..19877ea
--- /dev/null
+++ b/data/bodies/steve-office__19ff67c6cc0dc4e4.json
@@ -0,0 +1,28 @@
+{
+ "board": {
+ "id": "19ff67c6cc0dc4e4",
+ "account": "steve-office",
+ "subject": "Bonnee — Brand McKenzie Happy Hour colorway",
+ "why": "customer reply, 23 days stale",
+ "age": "Aug 12",
+ "customer": true,
+ "live": true,
+ "bucket": "delete"
+ },
+ "message": {
+ "id": "19ff67c6cc0dc4e4",
+ "threadId": "19ff67c6cc0dc4e4",
+ "labelIds": [
+ "DRAFT"
+ ],
+ "snippet": "From job: node · Aug 12, 2026, 7:59 AM Hi Bonnee, Thanks for flagging the color confusion on the Brand McKenzie Happy Hour. I'll confirm exactly which colorway that listing and image show (Day vs.",
+ "subject": "Clearing up the Brand McKenzie Happy Hour colorway",
+ "from": "\"Steve Abrams (DW)\" <steve@designerwallcoverings.com>",
+ "to": "bgrennon@tmpartners.com",
+ "cc": "",
+ "date": "Wed, 12 Aug 2026 07:59:36 -0700",
+ "body": "<div style=\"font-family:ui-monospace,Menlo,monospace;font-size:10px;letter-spacing:.10em;text-transform:uppercase;color:#7a766f;padding:8px 12px;background:rgba(212,160,74,0.08);border-left:3px solid #d4a04a;margin-bottom:18px;border-radius:2px\"><strong style=\"color:#d4a04a\">From job:</strong> node <span style=\"color:#a8a39c\">·</span> Aug 12, 2026, 7:59 AM</div><p>Hi Bonnee,</p><p>Thanks for flagging the color confusion on the Brand McKenzie Happy Hour. I'll confirm exactly which colorway that listing and image show (Day vs. the dark green) so you order the right one. Which look are you after?</p><p>Best,<br>Steve<br>Designer Wallcoverings</p>",
+ "attachments": [],
+ "internalDate": "1786546776000"
+ }
+}
\ No newline at end of file
diff --git a/data/bodies/steve-office__19ff67c7686cc8dc.json b/data/bodies/steve-office__19ff67c7686cc8dc.json
new file mode 100644
index 0000000..e512399
--- /dev/null
+++ b/data/bodies/steve-office__19ff67c7686cc8dc.json
@@ -0,0 +1,28 @@
+{
+ "board": {
+ "id": "19ff67c7686cc8dc",
+ "account": "steve-office",
+ "subject": "Michael — bamboo mural identification",
+ "why": "customer reply, 23 days stale",
+ "age": "Aug 12",
+ "customer": true,
+ "live": true,
+ "bucket": "delete"
+ },
+ "message": {
+ "id": "19ff67c7686cc8dc",
+ "threadId": "19ff67c7686cc8dc",
+ "labelIds": [
+ "DRAFT"
+ ],
+ "snippet": "From job: node · Aug 12, 2026, 7:59 AM Hi Michael, I can help you track down that bamboo/tree mural you saw in our email. Just reply with the photo (or the date of the email) and I'll identify the",
+ "subject": "Let's find that bamboo mural from our email",
+ "from": "\"Steve Abrams (DW)\" <steve@designerwallcoverings.com>",
+ "to": "mrb33981@outlook.com",
+ "cc": "",
+ "date": "Wed, 12 Aug 2026 07:59:39 -0700",
+ "body": "<div style=\"font-family:ui-monospace,Menlo,monospace;font-size:10px;letter-spacing:.10em;text-transform:uppercase;color:#7a766f;padding:8px 12px;background:rgba(212,160,74,0.08);border-left:3px solid #d4a04a;margin-bottom:18px;border-radius:2px\"><strong style=\"color:#d4a04a\">From job:</strong> node <span style=\"color:#a8a39c\">·</span> Aug 12, 2026, 7:59 AM</div><p>Hi Michael,</p><p>I can help you track down that bamboo/tree mural you saw in our email. Just reply with the photo (or the date of the email) and I'll identify the exact pattern for your bedroom.</p><p>Best,<br>Steve<br>Designer Wallcoverings</p>",
+ "attachments": [],
+ "internalDate": "1786546779000"
+ }
+}
\ No newline at end of file
diff --git a/data/bodies/steve-office__19ff67c7ca93d3ee.json b/data/bodies/steve-office__19ff67c7ca93d3ee.json
new file mode 100644
index 0000000..3ffd50f
--- /dev/null
+++ b/data/bodies/steve-office__19ff67c7ca93d3ee.json
@@ -0,0 +1,28 @@
+{
+ "board": {
+ "id": "19ff67c7ca93d3ee",
+ "account": "steve-office",
+ "subject": "Dena — Graham & Brown Weave Emerald stock check",
+ "why": "customer reply, 23 days stale",
+ "age": "Aug 12",
+ "customer": true,
+ "live": true,
+ "bucket": "delete"
+ },
+ "message": {
+ "id": "19ff67c7ca93d3ee",
+ "threadId": "19ff67c7ca93d3ee",
+ "labelIds": [
+ "DRAFT"
+ ],
+ "snippet": "From job: node · Aug 12, 2026, 7:59 AM Hi Dena, Checking availability on the Graham & Brown Weave Emerald (DWGB-800139) in your cart now — I'll confirm stock and lead time and help you get",
+ "subject": "Stock check on your Graham & Brown Weave Emerald",
+ "from": "\"Steve Abrams (DW)\" <steve@designerwallcoverings.com>",
+ "to": "foxtaledesign@gmail.com",
+ "cc": "",
+ "date": "Wed, 12 Aug 2026 07:59:41 -0700",
+ "body": "<div style=\"font-family:ui-monospace,Menlo,monospace;font-size:10px;letter-spacing:.10em;text-transform:uppercase;color:#7a766f;padding:8px 12px;background:rgba(212,160,74,0.08);border-left:3px solid #d4a04a;margin-bottom:18px;border-radius:2px\"><strong style=\"color:#d4a04a\">From job:</strong> node <span style=\"color:#a8a39c\">·</span> Aug 12, 2026, 7:59 AM</div><p>Hi Dena,</p><p>Checking availability on the Graham & Brown Weave Emerald (DWGB-800139) in your cart now — I'll confirm stock and lead time and help you get checked out.</p><p>Best,<br>Steve<br>Designer Wallcoverings</p>",
+ "attachments": [],
+ "internalDate": "1786546781000"
+ }
+}
\ No newline at end of file
diff --git a/data/bodies/steve-office__1a059915205816a2.json b/data/bodies/steve-office__1a059915205816a2.json
new file mode 100644
index 0000000..72263bf
--- /dev/null
+++ b/data/bodies/steve-office__1a059915205816a2.json
@@ -0,0 +1,27 @@
+{
+ "board": {
+ "id": "1a059915205816a2",
+ "account": "steve-office",
+ "subject": "Net Cost Request — Fentucci Naturals (118 SKUs)",
+ "why": "BROKEN — promises an attachment that isn't there; count wrong (118 vs 148)",
+ "age": "Aug 31",
+ "live": true,
+ "bucket": "delete"
+ },
+ "message": {
+ "id": "1a059915205816a2",
+ "threadId": "1a059915205816a2",
+ "labelIds": [
+ "DRAFT"
+ ],
+ "snippet": "From job: curl/8.7.1 · Aug 31, 2026, 1:44 PM Hi, Hope you are doing well. We carry the full Fentucci Naturals grasscloth line on Designer Wallcoverings and are in the process of updating our pricing",
+ "subject": "Net Cost Request — Fentucci Naturals Line (118 SKUs)",
+ "from": "\"Steve Abrams (DW)\" <steve@designerwallcoverings.com>",
+ "to": "tokiwausa@tokiwa.net",
+ "cc": "",
+ "date": "Mon, 31 Aug 2026 13:44:51 -0700",
+ "body": "<div style=\"font-family:ui-monospace,Menlo,monospace;font-size:10px;letter-spacing:.10em;text-transform:uppercase;color:#7a766f;padding:8px 12px;background:rgba(212,160,74,0.08);border-left:3px solid #d4a04a;margin-bottom:18px;border-radius:2px\"><strong style=\"color:#d4a04a\">From job:</strong> curl/8.7.1 <span style=\"color:#a8a39c\">·</span> Aug 31, 2026, 1:44 PM</div>Hi,\n\nHope you are doing well. We carry the full Fentucci Naturals grasscloth line on Designer Wallcoverings and are in the process of updating our pricing system to properly reflect per-yard net costs.\n\nI have attached a spreadsheet with all 118 SKUs we currently stock (your item codes are in the Vendor_SKU column). Could you please fill in the NET_COST_Per_Yard_USD column — meaning the net trade/wholesale cost you charge us per yard — and send it back?\n\nWe have included our reference list prices in the Reference_List_Price_USD_Per_Yard column so you can quickly verify each item is correct.\n\nOnce we have the cost list, we will update our per-yard pricing across the line and on Google Shopping.\n\nThanks so much — appreciate your help on this.\n\nBest,\nSteve Abrams\nDesigner Wallcoverings\nsteve@designerwallcoverings.com",
+ "attachments": [],
+ "internalDate": "1788209091000"
+ }
+}
\ No newline at end of file
diff --git a/data/bodies/steve-office__1a06d2ea705dddd3.json b/data/bodies/steve-office__1a06d2ea705dddd3.json
new file mode 100644
index 0000000..e0ee0c0
--- /dev/null
+++ b/data/bodies/steve-office__1a06d2ea705dddd3.json
@@ -0,0 +1,30 @@
+{
+ "board": {
+ "id": "1a06d2ea705dddd3",
+ "account": "steve-office",
+ "to": "tokiwausa@tokiwa.net",
+ "vendor": "Fentucci Naturals",
+ "subject": "Net cost list request — Fentucci Naturals grasscloth",
+ "items": 148,
+ "gap": "148 rows · no cost column",
+ "created": "2026-09-04T09:09:29",
+ "live": true,
+ "bucket": "ready"
+ },
+ "message": {
+ "id": "1a06d2ea705dddd3",
+ "threadId": "1a06d2ea705dddd3",
+ "labelIds": [
+ "DRAFT"
+ ],
+ "snippet": "From job: node · Sep 4, 2026, 9:09 AM Hello, Steve Abrams at Designer Wallcoverings. We carry the full Fentucci Naturals grasscloth line and I'm updating our pricing so it reflects your current",
+ "subject": "Net cost list request — Fentucci Naturals grasscloth (148 SKUs)",
+ "from": "\"Steve Abrams (DW)\" <steve@designerwallcoverings.com>",
+ "to": "tokiwausa@tokiwa.net",
+ "cc": "",
+ "date": "Fri, 4 Sep 2026 09:09:29 -0700",
+ "body": "<div style=\"font-family:ui-monospace,Menlo,monospace;font-size:10px;letter-spacing:.10em;text-transform:uppercase;color:#7a766f;padding:8px 12px;background:rgba(212,160,74,0.08);border-left:3px solid #d4a04a;margin-bottom:18px;border-radius:2px\"><strong style=\"color:#d4a04a\">From job:</strong> node <span style=\"color:#a8a39c\">·</span> Sep 4, 2026, 9:09 AM</div><p>Hello,</p>\n\n<p>Steve Abrams at <strong>Designer Wallcoverings</strong>. We carry the full Fentucci Naturals grasscloth line and I'm updating our pricing so it reflects your current numbers.</p>\n\n<p>Could you send your <strong>current net/wholesale cost list</strong> for the line? We show <strong>148 SKUs</strong> on our side. Most useful would be:</p>\n\n<ul>\n <li><strong>Item code and color name</strong></li>\n <li><strong>Net cost per yard</strong> (the trade/wholesale price you charge us)</li>\n <li><strong>Unit of sale</strong> and roll dimensions — width and yards per roll</li>\n <li>Any <strong>minimum order</strong> and current <strong>lead time</strong></li>\n</ul>\n\n<p><strong>And if you'd rather work from our list, just say so and I'll send our 148 SKUs in a spreadsheet for you to price against</strong> — whichever is less work on your end. If you publish list prices and apply a standard trade discount, that combination is enough for us to compute the net ourselves.</p>\n\n<p>Happy to jump on a call if that's easier.</p>\n\n<p>Thank you,<br>\nSteve Abrams<br>\nDesigner Wallcoverings<br>\n(888) 373-4564 · steve@designerwallcoverings.com</p>",
+ "attachments": [],
+ "internalDate": "1788538169000"
+ }
+}
\ No newline at end of file
diff --git a/data/bodies/steve-office__1a06d55e4f511b8e.json b/data/bodies/steve-office__1a06d55e4f511b8e.json
new file mode 100644
index 0000000..0b05c90
--- /dev/null
+++ b/data/bodies/steve-office__1a06d55e4f511b8e.json
@@ -0,0 +1,30 @@
+{
+ "board": {
+ "id": "1a06d55e4f511b8e",
+ "account": "steve-office",
+ "to": "samples@rwltd.com",
+ "vendor": "Reid Witlin",
+ "subject": "Net cost list request — full Reid Witlin line",
+ "items": 1470,
+ "gap": "1,470 rows · 0 cost (1,070 price only)",
+ "created": "2026-09-04T09:52:20",
+ "live": true,
+ "bucket": "ready"
+ },
+ "message": {
+ "id": "1a06d55e4f511b8e",
+ "threadId": "1a06d55e4f511b8e",
+ "labelIds": [
+ "DRAFT"
+ ],
+ "snippet": "From job: node · Sep 4, 2026, 9:52 AM Hello, Steve Abrams at Designer Wallcoverings — a to-the-trade wallcovering and fabric retailer. We carry the Reid Witlin line and I'm updating our pricing so",
+ "subject": "Net cost list request — full Reid Witlin line (Designer Wallcoverings, trade)",
+ "from": "\"Steve Abrams (DW)\" <steve@designerwallcoverings.com>",
+ "to": "samples@rwltd.com",
+ "cc": "",
+ "date": "Fri, 4 Sep 2026 09:52:20 -0700",
+ "body": "<div style=\"font-family:ui-monospace,Menlo,monospace;font-size:10px;letter-spacing:.10em;text-transform:uppercase;color:#7a766f;padding:8px 12px;background:rgba(212,160,74,0.08);border-left:3px solid #d4a04a;margin-bottom:18px;border-radius:2px\"><strong style=\"color:#d4a04a\">From job:</strong> node <span style=\"color:#a8a39c\">·</span> Sep 4, 2026, 9:52 AM</div><p>Hello,</p>\n\n<p>Steve Abrams at <strong>Designer Wallcoverings</strong> — a to-the-trade wallcovering and fabric retailer. We carry the Reid Witlin line and I'm updating our pricing so it reflects your current numbers.</p>\n\n<p><em>If this isn't the right desk, would you mind forwarding it to whoever handles trade pricing? Happy to write to them directly.</em></p>\n\n<p>Could you send your <strong>current net / wholesale cost list for the full line</strong>? We show about <strong>1,470 items</strong> on our side. Most useful would be:</p>\n\n<ul>\n <li><strong>Pattern and colorway / item code</strong></li>\n <li><strong>Net wholesale cost</strong> and the <strong>unit of sale</strong> (per yard / per roll), with roll dimensions</li>\n <li>Confirmation of our <strong>trade discount</strong> — we have 20% on file; please correct me if that's changed or varies by collection</li>\n <li>Any <strong>minimum order</strong> and current <strong>lead time</strong></li>\n</ul>\n\n<p><strong>If you don't have costs broken out per item, your list prices plus the discount rate is enough for us to compute it</strong> — whichever is less work. A spreadsheet or CSV is ideal, but any format you have is fine.</p>\n\n<p>Happy to jump on a call if that's quicker.</p>\n\n<p>Thank you,<br>\nSteve Abrams<br>\nDesigner Wallcoverings<br>\n(888) 373-4564 · steve@designerwallcoverings.com</p>",
+ "attachments": [],
+ "internalDate": "1788540740000"
+ }
+}
\ No newline at end of file
diff --git a/data/bodies/steve-office__1a06d5e2baaf3149.json b/data/bodies/steve-office__1a06d5e2baaf3149.json
new file mode 100644
index 0000000..4d723eb
--- /dev/null
+++ b/data/bodies/steve-office__1a06d5e2baaf3149.json
@@ -0,0 +1,30 @@
+{
+ "board": {
+ "id": "1a06d5e2baaf3149",
+ "account": "steve-office",
+ "to": "Customerservice@nationalsolutions.com",
+ "vendor": "Command Wallcovering",
+ "subject": "Net cost list request — full Command Wallcovering line",
+ "items": 2120,
+ "gap": "2,120 rows · 0 trade · 0 retail",
+ "created": "2026-09-04T10:01:22",
+ "live": true,
+ "bucket": "ready"
+ },
+ "message": {
+ "id": "1a06d5e2baaf3149",
+ "threadId": "1a06d5e2baaf3149",
+ "labelIds": [
+ "DRAFT"
+ ],
+ "snippet": "From job: node · Sep 4, 2026, 10:01 AM Hello, Steve Abrams at Designer Wallcoverings & Fabrics — a design-trade showroom and online retailer serving interior designers, architects, and commercial/",
+ "subject": "Net cost list request — full Command Wallcovering line (Designer Wallcoverings, trade)",
+ "from": "\"Steve Abrams (DW)\" <steve@designerwallcoverings.com>",
+ "to": "Customerservice@nationalsolutions.com",
+ "cc": "",
+ "date": "Fri, 4 Sep 2026 10:01:22 -0700",
+ "body": "<div style=\"font-family:ui-monospace,Menlo,monospace;font-size:10px;letter-spacing:.10em;text-transform:uppercase;color:#7a766f;padding:8px 12px;background:rgba(212,160,74,0.08);border-left:3px solid #d4a04a;margin-bottom:18px;border-radius:2px\"><strong style=\"color:#d4a04a\">From job:</strong> node <span style=\"color:#a8a39c\">·</span> Sep 4, 2026, 10:01 AM</div><p>Hello,</p>\n\n<p>Steve Abrams at <strong>Designer Wallcoverings & Fabrics</strong> — a design-trade showroom and online retailer serving interior designers, architects, and commercial/hospitality clients nationwide. I understand National Solutions represents the <strong>Command Wallcovering</strong> line, which we actively present and specify for our showroom clients.</p>\n\n<p><em>If this isn't the right desk, would you mind forwarding it to whoever handles trade pricing?</em></p>\n\n<p>Could you send your <strong>current net / wholesale cost list for the full Command line</strong>? We show about <strong>2,120 items</strong> on our side. Most useful would be:</p>\n\n<ul>\n <li><strong>Pattern and colorway / item code</strong> (the CM-series and everything else)</li>\n <li><strong>Net wholesale cost</strong>, and any <strong>MAP</strong> if one applies</li>\n <li><strong>Unit of sale</strong> (per yard / roll / bolt), with roll or bolt dimensions and width</li>\n <li>Our <strong>trade discount</strong> off list, plus any <strong>minimum order</strong> and current <strong>lead time</strong></li>\n</ul>\n\n<p><strong>If you don't have costs broken out per item, your list prices plus the discount rate is enough for us to compute it</strong> — whichever is less work on your end. A spreadsheet or CSV is ideal, but any format you have is fine.</p>\n\n<p>If we're not already set up to order Command through you, please also let me know what you need to open or confirm our account, along with your ordering and freight terms.</p>\n\n<p>Happy to jump on a call if that's quicker.</p>\n\n<p>Thank you,<br>\nSteve Abrams<br>\nDesigner Wallcoverings & Fabrics<br>\n(888) 373-4564 · steve@designerwallcoverings.com</p>",
+ "attachments": [],
+ "internalDate": "1788541282000"
+ }
+}
\ No newline at end of file
diff --git a/data/bodies/steve-office__1a06d5e530b2ec40.json b/data/bodies/steve-office__1a06d5e530b2ec40.json
new file mode 100644
index 0000000..dde3791
--- /dev/null
+++ b/data/bodies/steve-office__1a06d5e530b2ec40.json
@@ -0,0 +1,30 @@
+{
+ "board": {
+ "id": "1a06d5e530b2ec40",
+ "account": "steve-office",
+ "to": "info@vahallan.com",
+ "vendor": "Vahallan",
+ "subject": "Net cost list request — full Vahallan line",
+ "items": 390,
+ "gap": "390 rows · no cost column",
+ "created": "2026-09-04T10:01:33",
+ "live": true,
+ "bucket": "ready"
+ },
+ "message": {
+ "id": "1a06d5e530b2ec40",
+ "threadId": "1a06d5e530b2ec40",
+ "labelIds": [
+ "DRAFT"
+ ],
+ "snippet": "From job: node · Sep 4, 2026, 10:01 AM Hello Vahallan team, Steve Abrams at Designer Wallcoverings — a to-the-trade wallcovering and fabric retailer. We've long admired your hand-painted line and",
+ "subject": "Net cost list request — full Vahallan line (Designer Wallcoverings, trade)",
+ "from": "\"Steve Abrams (DW)\" <steve@designerwallcoverings.com>",
+ "to": "info@vahallan.com",
+ "cc": "",
+ "date": "Fri, 4 Sep 2026 10:01:33 -0700",
+ "body": "<div style=\"font-family:ui-monospace,Menlo,monospace;font-size:10px;letter-spacing:.10em;text-transform:uppercase;color:#7a766f;padding:8px 12px;background:rgba(212,160,74,0.08);border-left:3px solid #d4a04a;margin-bottom:18px;border-radius:2px\"><strong style=\"color:#d4a04a\">From job:</strong> node <span style=\"color:#a8a39c\">·</span> Sep 4, 2026, 10:01 AM</div><p>Hello Vahallan team,</p>\n\n<p>Steve Abrams at <strong>Designer Wallcoverings</strong> — a to-the-trade wallcovering and fabric retailer. We've long admired your hand-painted line and want to carry the full collection properly for our designer clientele.</p>\n\n<p><em>If this isn't the right desk, would you mind forwarding it to whoever handles trade pricing?</em></p>\n\n<p>Could you send your <strong>current trade / wholesale cost list for the full line</strong>? We show about <strong>390 items</strong> on our side. Most useful would be:</p>\n\n<ul>\n <li><strong>Pattern and colorway / item code</strong></li>\n <li><strong>Net wholesale cost</strong> and the <strong>unit of sale</strong> — per yard, roll, panel or square foot — with panel/roll dimensions and coverage</li>\n <li>Our <strong>trade discount</strong> off list, and whether any patterns are <strong>quote-based</strong> rather than fixed-price</li>\n <li><strong>Minimum order</strong>, typical <strong>lead time</strong>, and your <strong>memo/sample</strong> process and cost</li>\n</ul>\n\n<p><strong>If you don't have costs broken out per item, your list prices plus the discount rate is enough for us to compute it</strong> — whichever is less work on your end. A spreadsheet or CSV is ideal, but any format you have is fine.</p>\n\n<p>If you have a dealer or to-the-trade application, we're glad to complete it — and if there's a specific rep we should be working with, please point us their way.</p>\n\n<p>Happy to jump on a call if that's quicker.</p>\n\n<p>Thank you,<br>\nSteve Abrams<br>\nDesigner Wallcoverings<br>\n(888) 373-4564 · steve@designerwallcoverings.com</p>",
+ "attachments": [],
+ "internalDate": "1788541293000"
+ }
+}
\ No newline at end of file
diff --git a/data/imminent.json b/data/imminent.json
new file mode 100644
index 0000000..dc45564
--- /dev/null
+++ b/data/imminent.json
@@ -0,0 +1,22 @@
+[
+ {
+ "id": "1a006aa890e66af3",
+ "account": "info",
+ "cls": "imminent",
+ "to": "matt.schoffman@kravet.com",
+ "subject": "Re: Sample Follow-Up — Outstanding Memos (Acct 10087117) — Designer Wallcoverings",
+ "why": "A named Kravet rep already sent us tracking; our confirmation reply was never sent.",
+ "age_days_at_2026_09_10": 25.9,
+ "live": true
+ },
+ {
+ "id": "1a005fc3ff6c56ff",
+ "account": "info",
+ "cls": "imminent",
+ "to": "sales@bmwallpaper.com",
+ "subject": "Sample Follow-Up — Outstanding Memos (Acct On File) — Designer Wallcoverings",
+ "why": "Agent-composed sample follow-up, outstanding memos, account on file.",
+ "age_days_at_2026_09_10": 26.0,
+ "live": true
+ }
+]
diff --git a/data/snapshot-report.json b/data/snapshot-report.json
new file mode 100644
index 0000000..59f1721
--- /dev/null
+++ b/data/snapshot-report.json
@@ -0,0 +1,7 @@
+{
+ "snapshot_at": "2026-09-10T15:54:49.869Z",
+ "total": 28,
+ "saved": 27,
+ "skipped_dead": 1,
+ "failed": []
+}
\ No newline at end of file
diff --git a/snapshot.mjs b/snapshot.mjs
new file mode 100644
index 0000000..7e0ce3e
--- /dev/null
+++ b/snapshot.mjs
@@ -0,0 +1,102 @@
+#!/usr/bin/env node
+// snapshot.mjs — TK-11231
+// READ-ONLY. Fetches the FULL body of every draft the triage board tracks and
+// writes it to disk, one JSON file per draft. Nothing is sent, edited or deleted.
+//
+// Why this exists: com.steve.george-drain-old-drafts calls Gmail drafts.delete,
+// which has NO Trash — a deleted draft is gone. Every downstream decision on this
+// ticket (send / keep / delete) was therefore irreversible. With a snapshot on
+// disk it is not: the text survives even if Gmail loses the draft.
+//
+// Quota: the Gmail per-minute query cost is a SHARED fleet resource and was
+// exhausted once during this ticket, so calls are paced and failures are recorded
+// per-draft rather than aborting the run (a partial snapshot beats none).
+
+import fs from 'node:fs';
+import path from 'node:path';
+import os from 'node:os';
+
+const HERE = path.dirname(new URL(import.meta.url).pathname);
+const OUT = path.join(HERE, 'data', 'bodies');
+const PACE_MS = Number(process.env.SNAP_PACE_MS || 1300);
+
+// Auth lives in ~/.claude.json mcpServers.george.env — NOT secrets-manager/.env
+// (verified absent there; see memory george-draft-drain-and-http-delete).
+function george() {
+ const cfg = JSON.parse(fs.readFileSync(path.join(os.homedir(), '.claude.json'), 'utf8'));
+ const env = cfg?.mcpServers?.george?.env || {};
+ const url = (env.GEORGE_URL || 'http://127.0.0.1:9850').replace(/\/$/, '');
+ const auth = env.GEORGE_BASIC_AUTH;
+ if (!auth) throw new Error('GEORGE_BASIC_AUTH missing from ~/.claude.json mcpServers.george.env');
+ return { url, headers: { Authorization: 'Basic ' + auth } };
+}
+
+const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
+
+// info@ and steve-office are different Gmail accounts behind different route
+// prefixes; sending an id to the wrong one returns a confusing 500, not a 404.
+const routeFor = (account, id) =>
+ account === 'info' ? `/api/info/messages/${id}` : `/api/messages/${id}?account=steve-office`;
+
+async function fetchBody(g, account, id) {
+ const res = await fetch(g.url + routeFor(account, id), { headers: g.headers });
+ const text = await res.text();
+ if (!res.ok) return { ok: false, status: res.status, error: text.slice(0, 300) };
+ let msg;
+ try { msg = JSON.parse(text); }
+ catch { return { ok: false, status: res.status, error: 'unparseable body' }; }
+ // The two account routes disagree on the field name: steve-office returns
+ // `body`, info@ returns `bodyHtml`/`bodyText`. Reading only `body` gave an
+ // empty string with a 200 OK — a file written, nothing in it.
+ msg.body = msg.body || msg.bodyText || msg.bodyHtml || '';
+ return { ok: true, msg };
+}
+
+function targets() {
+ const board = JSON.parse(fs.readFileSync(path.join(HERE, 'data', 'drafts.json'), 'utf8'));
+ const out = [];
+ for (const r of board.ready || []) out.push({ ...r, bucket: 'ready' });
+ for (const r of board.delete || []) out.push({ ...r, bucket: 'delete' });
+ // The two IMMINENT info@ drafts were never on the board — they are the ones on
+ // a ~4-day fuse, so they matter most and must not be missed.
+ const extra = JSON.parse(fs.readFileSync(path.join(HERE, 'data', 'imminent.json'), 'utf8'));
+ for (const r of extra) out.push({ ...r, bucket: 'imminent' });
+ // A draft can appear twice across buckets; snapshot each id once.
+ const seen = new Set();
+ return out.filter((d) => (seen.has(d.id) ? false : (seen.add(d.id), true)));
+}
+
+const main = async () => {
+ fs.mkdirSync(OUT, { recursive: true });
+ const g = george();
+ const list = targets();
+ const report = { snapshot_at: new Date().toISOString(), total: list.length, saved: 0, skipped_dead: 0, failed: [] };
+
+ for (const d of list) {
+ if (d.live === false) { report.skipped_dead++; continue; }
+ const file = path.join(OUT, `${d.account}__${d.id}.json`);
+ if (fs.existsSync(file) && !process.env.SNAP_FORCE) { report.saved++; continue; }
+
+ const r = await fetchBody(g, d.account, d.id);
+ if (!r.ok) {
+ report.failed.push({ id: d.id, account: d.account, status: r.status, error: r.error });
+ console.log(` FAIL ${d.account} ${d.id} — ${r.status} ${String(r.error).slice(0, 90)}`);
+ } else if (!String(r.msg.body || '').trim()) {
+ report.failed.push({ id: d.id, account: d.account, status: 200, error: 'EMPTY BODY — 200 OK but no content captured' });
+ console.log(` EMPTY ${d.account} ${d.id} — 200 but body was blank, NOT counted as saved`);
+ } else {
+ fs.writeFileSync(file, JSON.stringify({ board: d, message: r.msg }, null, 2));
+ report.saved++;
+ console.log(` saved ${d.account} ${d.id} — ${String(r.msg.subject || '(no subject)').slice(0, 62)}`);
+ }
+ await sleep(PACE_MS);
+ }
+
+ fs.writeFileSync(path.join(HERE, 'data', 'snapshot-report.json'), JSON.stringify(report, null, 2));
+ console.log(`\nsnapshot: ${report.saved}/${report.total} saved · ${report.skipped_dead} already gone · ${report.failed.length} failed`);
+ console.log(`bodies → ${OUT}`);
+ // A partial snapshot is still worth keeping, but say so loudly.
+ process.exit(report.failed.length ? 2 : 0);
+};
+
+main().catch((e) => { console.error('snapshot aborted:', e.message); process.exit(1); });
← 20c1dc8 draft-viewer: make the board honest — verify triage against
·
back to Draft Viewer
·
Rebuild the board around Steve's 2026-09-10 decisions — send f7ed61f →