[object Object]

← back to Sample Followup Sweep

TK-11409: stop shipping the internal 'From job:' banner to vendors

de5df55810d4855bc0c259b1527aba378ad18dec · 2026-09-10 11:56:00 -0700 · Steve Abrams

George's withSourceFooter() prepends a visible 'From job: node - <timestamp>' block
INSIDE the message body unless the caller passes no_source_tag. Nothing in this pipeline
passed it, so that internal provenance tag reached vendors on every chase -- confirmed
present in the current drafts AND in chases already SENT on 09/01 and 09/04.

Fixed centrally in the transport rather than at each of the four call sites
(scheduled-run draft + send, send-drafts, send-reconciled, server.js one-click send).
Every path through this transport is a vendor-facing letter -- /api/send and /api/drafts
are its only sendable paths -- and a per-caller flag is a step someone must remember,
which is the failure mode this entire ticket documents. An explicit no_source_tag:false
is still respected.

Verified: unit test confirms the flag on both paths and that explicit-false wins; a live
draft came back source='' with a snippet starting at the real first line instead of
'From job: unspecified'.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

Files touched

Diff

commit de5df55810d4855bc0c259b1527aba378ad18dec
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Thu Sep 10 11:56:00 2026 -0700

    TK-11409: stop shipping the internal 'From job:' banner to vendors
    
    George's withSourceFooter() prepends a visible 'From job: node - <timestamp>' block
    INSIDE the message body unless the caller passes no_source_tag. Nothing in this pipeline
    passed it, so that internal provenance tag reached vendors on every chase -- confirmed
    present in the current drafts AND in chases already SENT on 09/01 and 09/04.
    
    Fixed centrally in the transport rather than at each of the four call sites
    (scheduled-run draft + send, send-drafts, send-reconciled, server.js one-click send).
    Every path through this transport is a vendor-facing letter -- /api/send and /api/drafts
    are its only sendable paths -- and a per-caller flag is a step someone must remember,
    which is the failure mode this entire ticket documents. An explicit no_source_tag:false
    is still respected.
    
    Verified: unit test confirms the flag on both paths and that explicit-false wins; a live
    draft came back source='' with a snippet starting at the real first line instead of
    'From job: unspecified'.
    
    Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
---
 lib/george-transport.js | 18 +++++++++++++++++-
 1 file changed, 17 insertions(+), 1 deletion(-)

diff --git a/lib/george-transport.js b/lib/george-transport.js
index c32aabd..c274412 100644
--- a/lib/george-transport.js
+++ b/lib/george-transport.js
@@ -18,9 +18,25 @@ function createGmailDraftArtifact(payload) {
   return assertSendablePayload(payload);
 }
 
+// TK-11409: strip George's internal provenance banner from every vendor-facing message.
+// George's withSourceFooter() prepends a visible "From job: node · <timestamp>" block INSIDE the
+// message body unless the caller passes no_source_tag. Nothing in this pipeline was passing it, so
+// that banner shipped to vendors on every chase — verified present in the drafts AND in chases
+// already SENT on 09/01 and 09/04. Every path through this transport is a vendor-facing letter
+// (/api/send and /api/drafts are the only sendable paths), so the flag belongs HERE rather than at
+// each of the four call sites: a per-caller flag is a step someone must remember, and this ticket
+// is a catalogue of what happens when a safety step depends on being remembered.
+function stripSourceBanner(payload) {
+  if (payload && typeof payload === 'object' && payload.no_source_tag === undefined) {
+    payload.no_source_tag = true;
+  }
+  return payload;
+}
+
 async function georgeRequest({ path, payload, headers = {}, requestImpl = http.request }) {
   if (!SENDABLE_PATHS.has(path)) throw new Error(`Unsupported sendable George path: ${path}`);
   assertSendablePayload(payload); // Must run before serialization, credential reads, or network setup.
+  stripSourceBanner(payload);
   const body = JSON.stringify(payload);
   return new Promise((resolve) => {
     const req = requestImpl({
@@ -37,4 +53,4 @@ async function georgeRequest({ path, payload, headers = {}, requestImpl = http.r
   });
 }
 
-module.exports = { assertSendablePayload, createGmailDraftArtifact, georgeRequest, SENDABLE_PATHS };
+module.exports = { assertSendablePayload, createGmailDraftArtifact, georgeRequest, stripSourceBanner, SENDABLE_PATHS };

← 42b4eba TK-11409: rescue the text of two Aug-15 drafts ~4 days from  ·  back to Sample Followup Sweep  ·  auto-data-snapshot: 2026-09-10T12:25:41 (1 data files) — dat 17b5c5c →