[object Object]

← back to Gmc Titlefix

Reject unresolved MDC sample title sources before inserts

71e1db5876d84cc680d274a8f67804ed940c68a1 · 2026-09-09 11:49:19 -0700 · Steve Abrams

Files touched

Diff

commit 71e1db5876d84cc680d274a8f67804ed940c68a1
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Wed Sep 9 11:49:19 2026 -0700

    Reject unresolved MDC sample title sources before inserts
---
 build-mdc-sample-titles.mjs   |  24 ++-------
 push-mdc-sample-titles.mjs    |  13 ++---
 resolve-mdc-sample-source.mjs |  56 +++++++++++++++++++
 test-mdc-source-guard.mjs     | 123 ++++++++++++++++++++++++++++++++++++++++++
 verification/e2e-proof.json   |  81 ++++++++--------------------
 5 files changed, 214 insertions(+), 83 deletions(-)

diff --git a/build-mdc-sample-titles.mjs b/build-mdc-sample-titles.mjs
index 5d5b4ac..68d0d7a 100644
--- a/build-mdc-sample-titles.mjs
+++ b/build-mdc-sample-titles.mjs
@@ -29,8 +29,8 @@ import path from 'node:path';
 import { fileURLToPath } from 'node:url';
 import { createRequire } from 'node:module';
 const require = createRequire(import.meta.url);
-const { hasShowroomTag } = require(process.env.HOME + '/Projects/fix-live-board/config/showroom-vendor.cjs');
-const { token, MERCHANT } = require('./_auth');
+import { resolveSampleTitleDS } from './resolve-mdc-sample-source.mjs';
+export { resolveSampleTitleDS };
 const __dirname = path.dirname(fileURLToPath(import.meta.url));
 
 const SHOP = 'designer-laboratory-sandbox.myshopify.com';
@@ -63,25 +63,11 @@ export function sampleVariant(variants) {
  * source RESOURCE NAME that is actually referenced by a primary feed's takeFromDataSources.
  * (exported so the pusher reuses the identical resolution.)
  */
-export async function resolveSampleTitleDS(tok) {
-  const rd = await fetch(`https://merchantapi.googleapis.com/datasources/v1/accounts/${MERCHANT}/dataSources`, { headers: { Authorization: 'Bearer ' + tok } });
-  const jd = await rd.json();
-  const all = jd.dataSources || [];
-  // candidate supplementals named "DW Sample Title Overrides"
-  const named = all.filter(d => d.supplementalProductDataSource && /DW Sample Title Overrides/i.test(d.displayName || ''));
-  // linked set = every supplemental referenced by any primary's defaultRule.takeFromDataSources
-  const linked = new Set();
-  for (const d of all) {
-    const takes = d.primaryProductDataSource?.defaultRule?.takeFromDataSources || [];
-    for (const t of takes) if (t.supplementalDataSourceName) linked.add(t.supplementalDataSourceName);
-  }
-  const chosen = named.find(d => linked.has(d.name)) || named[0];
-  if (!chosen) throw new Error('no "DW Sample Title Overrides" supplemental data source found — create ONE and link it to the primary first');
-  return { name: chosen.name, linked: linked.has(chosen.name), duplicates: named.filter(d => d.name !== chosen.name).map(d => d.name) };
-}
 
 const isMain = process.argv[1] && path.resolve(process.argv[1]) === fileURLToPath(import.meta.url);
 if (isMain) {
+  const { token, MERCHANT } = require('./_auth');
+  const { hasShowroomTag } = require(process.env.HOME + '/Projects/fix-live-board/config/showroom-vendor.cjs');
   const TOKEN = (fs.readFileSync(process.env.HOME + '/Projects/secrets-manager/.env', 'utf8')
     .match(/^SHOPIFY_ADMIN_TOKEN=(.+)$/m) || [])[1]?.trim();
   if (!TOKEN) { console.error('no Shopify token'); process.exit(1); }
@@ -101,6 +87,7 @@ if (isMain) {
 
   (async () => {
     const tok = await token();
+    const ds = await resolveSampleTitleDS(tok, { merchant: MERCHANT });
     // 1. Real GMC offerId set (paginate products.list) — so we only override offers that EXIST.
     process.stderr.write('pulling GMC offerId set…\n');
     const gmcOffers = new Set();
@@ -143,7 +130,6 @@ if (isMain) {
       has = d.products.pageInfo.hasNextPage; cursor = d.products.pageInfo.endCursor;
     }
 
-    const ds = await resolveSampleTitleDS(tok).catch(e => ({ error: e.message }));
     const DIR = path.join(__dirname, 'data'); fs.mkdirSync(DIR, { recursive: true });
     const out = path.join(DIR, 'mdc-sample-title-overrides.json');
     fs.writeFileSync(out, JSON.stringify(rows, null, 1));
diff --git a/push-mdc-sample-titles.mjs b/push-mdc-sample-titles.mjs
index 478d44b..4ae0e8a 100644
--- a/push-mdc-sample-titles.mjs
+++ b/push-mdc-sample-titles.mjs
@@ -8,13 +8,13 @@
  *     A real run requires BOTH:  --apply  AND  --i-am-steve.
  *     Overrides ONLY the GOOGLE title via the supplemental source — NEVER Shopify, price,
  *     availability, or the on-site PDP. Idempotent: re-inserting the same offerId just
- *     re-writes the same override (Google merges by offerId). Reversible: delete the
- *     productInputs (or drop the supplemental source's overrides) — see the memo.
+ *     re-writes the same override (Google merges by offerId). Restoration requires
+ *     separately reviewed per-offer preimages and a verified restoration procedure.
  *
  * IDEMPOTENCY: reuses the SINGLE existing linked datasource resolved by displayName — it does
  *     NOT create a datasource, so a re-fire can never spawn duplicates.
  * GUARD: HARD-ABORTS unless EVERY row's proposedTitle begins with "Sample".
- * Optional: pass an explicit `accounts/146735262/dataSources/<id>` to override the resolver.
+ * Optional: pass an explicit `accounts/146735262/dataSources/<id>` to select the same verified, uniquely linked source.
  */
 import fs from 'node:fs';
 import path from 'node:path';
@@ -22,7 +22,7 @@ import { fileURLToPath } from 'node:url';
 import { createRequire } from 'node:module';
 const require = createRequire(import.meta.url);
 const { token, MERCHANT } = require('./_auth');
-const { resolveSampleTitleDS } = await import('./build-mdc-sample-titles.mjs');
+import { resolveSampleTitleDS } from './resolve-mdc-sample-source.mjs';
 const __dirname = path.dirname(fileURLToPath(import.meta.url));
 
 const argv = process.argv.slice(2);
@@ -42,8 +42,9 @@ if (bad.length) {
 const sleep = ms => new Promise(r => setTimeout(r, ms));
 (async () => {
   const tok = await token();
-  let DS = DS_ARG;
-  if (!DS) { const r = await resolveSampleTitleDS(tok); DS = r.name; console.log(`resolved datasource: ${DS} ${r.linked ? '(linked to primary ✓)' : '(NOT LINKED — override will not merge!)'}`); }
+  const resolved = await resolveSampleTitleDS(tok, { merchant: MERCHANT, explicitSource: DS_ARG });
+  const DS = resolved.name;
+  console.log(`resolved datasource: ${DS} (linked to primary ✓)`);
   console.log(`push-mdc-sample-titles — mode: ${APPLY ? '⚠️  LIVE APPLY' : 'DRY-RUN (no writes)'}`);
   console.log(`overrides: ${list.length} (all begin with "Sample" ✓) → ${DS}`);
   if (!APPLY) {
diff --git a/resolve-mdc-sample-source.mjs b/resolve-mdc-sample-source.mjs
new file mode 100644
index 0000000..b7d280d
--- /dev/null
+++ b/resolve-mdc-sample-source.mjs
@@ -0,0 +1,56 @@
+/** Auth-free, fail-closed selection of the unique primary-linked sample-title source. */
+export async function resolveSampleTitleDS(tok, {
+  merchant = '146735262', fetchImpl = globalThis.fetch, explicitSource,
+  maxPages = 100,
+} = {}) {
+  if (!/^[0-9]+$/.test(String(merchant))) throw new Error('invalid merchant');
+  if (!Number.isInteger(maxPages) || maxPages < 1) throw new Error('invalid page limit');
+  const prefix = `accounts/${merchant}/dataSources/`;
+  const validName = name => typeof name === 'string' && name.startsWith(prefix) && /^[0-9]+$/.test(name.slice(prefix.length));
+  if (explicitSource !== undefined && !validName(explicitSource)) throw new Error('explicit source is malformed or belongs to another account');
+  const isObject = value => value !== null && typeof value === 'object' && !Array.isArray(value);
+  const all = [], seenTokens = new Set(), seenNames = new Set();
+  let pageToken;
+  for (let page = 0; page < maxPages; page++) {
+    const url = new URL(`https://merchantapi.googleapis.com/datasources/v1/accounts/${merchant}/dataSources`);
+    if (pageToken) url.searchParams.set('pageToken', pageToken);
+    const response = await fetchImpl(url.toString(), { headers: { Authorization: 'Bearer ' + tok } });
+    if (!response.ok) throw new Error(`source listing failed: HTTP ${response.status}`);
+    const body = await response.json();
+    if (!isObject(body) || body.error || !Array.isArray(body.dataSources)) throw new Error('source listing is malformed or incomplete');
+    for (const source of body.dataSources) {
+      if (!isObject(source) || !validName(source.name) || seenNames.has(source.name)) throw new Error('source listing has invalid or duplicate resource names');
+      for (const key of ['primaryProductDataSource', 'supplementalProductDataSource']) {
+        if (source[key] !== undefined && !isObject(source[key])) throw new Error('source listing has malformed source type');
+      }
+      const rule = source.primaryProductDataSource?.defaultRule;
+      if (rule !== undefined && !isObject(rule)) throw new Error('source listing has malformed default rule');
+      seenNames.add(source.name);
+      all.push(source);
+    }
+    pageToken = body.nextPageToken;
+    if (pageToken === undefined || pageToken === '') break;
+    if (typeof pageToken !== 'string' || seenTokens.has(pageToken)) throw new Error('source listing has invalid or repeated page token');
+    seenTokens.add(pageToken);
+    if (page === maxPages - 1) throw new Error('source listing incomplete: page limit reached');
+  }
+  const linked = new Set();
+  for (const source of all) {
+    const takes = source.primaryProductDataSource?.defaultRule?.takeFromDataSources;
+    if (takes === undefined) continue;
+    if (!Array.isArray(takes)) throw new Error('source listing has malformed primary links');
+    for (const take of takes) {
+      if (!isObject(take)) throw new Error('source listing has malformed primary link');
+      if (take.supplementalDataSourceName !== undefined) {
+        if (!validName(take.supplementalDataSourceName)) throw new Error('source listing has invalid supplemental link');
+        linked.add(take.supplementalDataSourceName);
+      }
+    }
+  }
+  const named = all.filter(source => source.supplementalProductDataSource && source.displayName === 'DW Sample Title Overrides');
+  const candidates = named.filter(source => linked.has(source.name));
+  if (candidates.length !== 1) throw new Error(`expected one primary-linked sample title source; found ${candidates.length}`);
+  const chosen = candidates[0];
+  if (explicitSource !== undefined && explicitSource !== chosen.name) throw new Error('explicit source is not the unique primary-linked sample title source');
+  return { name: chosen.name, linked: true, duplicates: named.filter(source => source.name !== chosen.name).map(source => source.name) };
+}
diff --git a/test-mdc-source-guard.mjs b/test-mdc-source-guard.mjs
new file mode 100644
index 0000000..a3d91eb
--- /dev/null
+++ b/test-mdc-source-guard.mjs
@@ -0,0 +1,123 @@
+import assert from 'node:assert/strict';
+import fs from 'node:fs';
+import os from 'node:os';
+import path from 'node:path';
+import { fileURLToPath } from 'node:url';
+import { spawnSync } from 'node:child_process';
+import { resolveSampleTitleDS } from './resolve-mdc-sample-source.mjs';
+import { mdcSampleTitle } from './build-mdc-sample-titles.mjs';
+
+const root = path.dirname(fileURLToPath(import.meta.url));
+const temp = fs.mkdtempSync(path.join(os.tmpdir(), 'mdc-source-proof-'));
+const source = id => `accounts/146735262/dataSources/${id}`;
+const supplemental = id => ({ name: source(id), displayName: 'DW Sample Title Overrides', supplementalProductDataSource: {} });
+const primary = ids => ({ name: source(1), primaryProductDataSource: { defaultRule: { takeFromDataSources: ids.map(id => ({ supplementalDataSourceName: source(id) })) } } });
+const valid = { dataSources: [primary([2]), supplemental(2), supplemental(3)] };
+const preloader = path.join(temp, 'offline-preload.cjs');
+fs.writeFileSync(preloader, `
+const fs = require('node:fs');
+const Module = require('node:module');
+const fixture = JSON.parse(fs.readFileSync(process.env.MDC_FIXTURE, 'utf8'));
+const originalRead = fs.readFileSync;
+const events = [];
+process.on('exit', () => fs.writeFileSync(process.env.MDC_TRACE, JSON.stringify(events)));
+require('node:net').Socket.prototype.connect = () => { throw new Error('network forbidden'); };
+const originalLoad = Module._load;
+Module._load = function(id, parent, main) {
+  if (id === './_auth') { events.push({ type: 'stub-auth' }); return { MERCHANT: '146735262', token: async () => 'offline-token' }; }
+  if (String(id).endsWith('/config/showroom-vendor.cjs')) return { hasShowroomTag: tags => tags.includes('Showroom') };
+  return originalLoad.call(this, id, parent, main);
+};
+fs.readFileSync = function(file, ...args) {
+  if (String(file).endsWith('/secrets-manager/.env')) return 'SHOPIFY_ADMIN_TOKEN=offline-token';
+  if (String(file).endsWith('/data/mdc-sample-title-overrides.json')) return JSON.stringify([{ offerId: '99', currentTitle: 'Fixture', proposedTitle: 'Sample — Fixture — Memo Swatch' }]);
+  return originalRead.call(this, file, ...args);
+};
+let page = 0;
+globalThis.fetch = async (url, options = {}) => {
+  const u = new URL(String(url));
+  if (u.pathname.endsWith('/dataSources') && !options.method) {
+    events.push({ type: 'list', token: u.searchParams.get('pageToken') });
+    const response = fixture.pages[page++];
+    if (!response) throw new Error('fixture listing exhausted');
+    if (response.throw) throw new Error(response.throw);
+    return { ok: response.status === undefined || response.status === 200, status: response.status || 200, json: async () => { if (response.invalidJson) throw new Error('invalid JSON'); return response.body; } };
+  }
+  if (u.pathname.endsWith('/productInputs:insert') && options.method === 'POST') {
+    events.push({ type: 'insert', source: u.searchParams.get('dataSource'), body: JSON.parse(options.body) });
+    return { ok: true, status: 200 };
+  }
+  throw new Error('unexpected fetch: ' + url);
+};
+`);
+
+const tests = [
+  ['missing', [{ body: { dataSources: [primary([])] } }]],
+  ['unlinked', [{ body: { dataSources: [primary([]), supplemental(2)] } }]],
+  ['ambiguous', [{ body: { dataSources: [primary([2,3]), supplemental(2), supplemental(3)] } }]],
+  ['HTTP failure', [{ status: 503, body: valid }]],
+  ['error envelope', [{ body: { ...valid, error: { message: 'failure' } } }]],
+  ['malformed listing', [{ body: {} }]],
+  ['invalid JSON', [{ invalidJson: true }]],
+  ['network error', [{ throw: 'offline request failed' }]],
+  ['incomplete second page', [{ body: { ...valid, nextPageToken: 'page2' } }, { status: 503, body: {} }]],
+  ['repeated page token', [{ body: { dataSources: [primary([2])], nextPageToken: 'x' } }, { body: { dataSources: [supplemental(2)], nextPageToken: 'x' } }]],
+  ['duplicate resource name', [{ body: { dataSources: [...valid.dataSources, supplemental(2)] } }]],
+];
+let count = 0;
+function cli(label, pages, explicitSource, expectedSuccess = false, builder = false) {
+  const fixture = path.join(temp, `fixture-${count}.json`), trace = path.join(temp, `trace-${count}.json`);
+  fs.writeFileSync(fixture, JSON.stringify({ pages }));
+  const argv = ['--require', preloader, path.join(root, builder ? 'build-mdc-sample-titles.mjs' : 'push-mdc-sample-titles.mjs'), '--apply', '--i-am-steve'];
+  if (explicitSource) argv.push(explicitSource);
+  const result = spawnSync(process.execPath, argv, { encoding: 'utf8', timeout: 5000, env: { ...process.env, MDC_FIXTURE: fixture, MDC_TRACE: trace } });
+  assert.ifError(result.error);
+  const events = JSON.parse(fs.readFileSync(trace));
+  fs.writeFileSync(path.join(temp, `cli-${count}.txt`), result.stdout + result.stderr);
+  const inserts = events.filter(e => e.type === 'insert');
+  if (expectedSuccess) {
+    assert.equal(result.status, 0, result.stderr);
+    assert.equal(inserts.length, 1);
+    assert.equal(inserts[0].source, source(2));
+    assert.equal(events.at(-1).type, 'insert');
+  } else {
+    assert.notEqual(result.status, 0, label);
+    assert.equal(inserts.length, 0, label + ' must stop before insert');
+  }
+  count++;
+  console.log('PASS | ' + label + ' | ' + (builder ? 'builder' : explicitSource ? 'explicit pusher' : 'default pusher'));
+}
+for (const malformed of [null, [], 'not-an-object']) {
+  for (const key of ['primaryProductDataSource', 'supplementalProductDataSource']) {
+    const rows = structuredClone(valid.dataSources);
+    const index = key === 'primaryProductDataSource' ? 0 : 1;
+    rows[index][key] = malformed;
+    tests.push(['malformed ' + key + ': ' + JSON.stringify(malformed), [{ body: { dataSources: rows } }]]);
+  }
+  const rows = structuredClone(valid.dataSources);
+  rows[0].primaryProductDataSource.defaultRule = malformed;
+  tests.push(['malformed default rule: ' + JSON.stringify(malformed), [{ body: { dataSources: rows } }]]);
+  const links = structuredClone(valid.dataSources);
+  links[0].primaryProductDataSource.defaultRule.takeFromDataSources.push(malformed);
+  tests.push(['malformed link: ' + JSON.stringify(malformed), [{ body: { dataSources: links } }]]);
+}
+for (const [label, pages] of tests) {
+  cli(label, pages);
+  cli(label, pages, source(2));
+  cli(label, pages, undefined, false, true);
+}
+for (const id of [source(3), source(999), 'accounts/999/dataSources/2', source('invalid')]) cli('explicit bypass rejected: ' + id, [{ body: valid }], id);
+cli('valid uniquely linked', [{ body: valid }], undefined, true);
+cli('valid explicit linked', [{ body: valid }], source(2), true);
+const paginated = [{ body: { dataSources: [primary([2])], nextPageToken: 'next with + /' } }, { body: { dataSources: [supplemental(2)] } }];
+cli('valid complete pagination', paginated, undefined, true);
+const pageLimitFetch = async () => ({ ok: true, json: async () => ({ ...valid, nextPageToken: 'more' }) });
+await assert.rejects(resolveSampleTitleDS('offline-token', { fetchImpl: pageLimitFetch, maxPages: 1 }), /page limit reached/);
+count++;
+console.log('PASS | resolver page limit rejects incomplete listing');
+assert.ok(mdcSampleTitle('Fixture | Phillipe Romano').startsWith('Sample'));
+count++;
+console.log('PASS | builder import and transform remain auth-free');
+const report = { status: 'PASS', assertions: count, evidence: temp, scope: 'offline rejection boundary; live source outcome remains blocked', retainedFixtures: true };
+fs.writeFileSync(path.join(temp, 'audit.json'), JSON.stringify(report, null, 2));
+console.log(JSON.stringify(report));
diff --git a/verification/e2e-proof.json b/verification/e2e-proof.json
index b0ab3e8..b3072ad 100644
--- a/verification/e2e-proof.json
+++ b/verification/e2e-proof.json
@@ -1,73 +1,38 @@
 {
-  "ticket": "TK-10993",
-  "agent": "codex-run-10993",
-  "intent": "Execute and independently verify Steve-approved 19 Google landing-link and 14 description corrections",
-  "risk_tier": "R4",
-  "environment": {
-    "merchant": "146735262",
-    "shopify": "designer-laboratory-sandbox",
-    "api": "Merchant products/v1 single-field PATCH"
-  },
-  "timestamp": "2026-09-05T07:25:07.335226+00:00",
-  "authorization": {
-    "ticket": "TK-10993",
-    "approved_by": "Steve",
-    "authorization": "22TK-10993 is blocked at your live- feed gate approve ungate!!!",
-    "scope": "19 link and 14 description corrections from manifest",
-    "manifest_sha256": "ead4af90c8e149947e23f77add89cd02ea87f0a7e251d769db8a198b07d24818",
-    "recorded_at": "2026-09-05T07:03:08.328723+00:00"
-  },
-  "manifest_sha256": "ead4af90c8e149947e23f77add89cd02ea87f0a7e251d769db8a198b07d24818",
-  "documented_preflight_refinement": "verification/tk10993-20260905-link-preflight-amendment.json",
+  "intent": "Fail closed before insert for unresolved sample-title source selection",
+  "risk_tier": "R1 isolated code; external deployment remains blocked",
+  "environment": "Isolated worktree; offline auth/fetch stubs; real CLI subprocesses",
+  "base_commit": "8bc8356720606be4cc06ab60f3c03737cc4d9247",
+  "timestamp": "2026-09-09T18:49:17.695633+00:00",
+  "ticket": "TK-11307",
+  "correlation": "dm-mtug50la-61688-skhph3",
+  "commands": [
+    "node test-mdc-source-guard.mjs",
+    "git diff --check"
+  ],
   "checks": [
     {
-      "name": "Pinned scope, field-mask/negative tests, rollback rehearsal",
-      "verdict": "PASS",
-      "evidence": "6 tests; reverse PATCH restores only affected field; no real rollback fired"
-    },
-    {
-      "name": "Six live canary responses",
-      "verdict": "PASS",
-      "evidence": "6 accepted with full before snapshots, manifest-bound hashes and prior intent records"
-    },
-    {
-      "name": "Canary served view",
-      "verdict": "PASS",
-      "evidence": "verify-2026-09-05T07-08-00-350Z.json: correct6, errors0, collateral0, age218s"
-    },
-    {
-      "name": "Customer destinations",
       "verdict": "PASS",
-      "evidence": "public-landings-2026-09-05T07-09-43-087Z.json: all19 HTTP200 with public JSON requested variant present"
+      "name": "CLI boundary negatives and stub happy path",
+      "assertions": 78,
+      "evidence": "/var/folders/rq/j8g1f7nn6jv6_lr1cfmqym6w0000gn/T/mdc-source-proof-rG50t7"
     },
     {
-      "name": "720-second canary observation before rest",
       "verdict": "PASS",
-      "evidence": "canary-pass.json: 741 seconds, six correct, zero errors/collateral/new disapprovals"
+      "name": "Main HEAD, all tracked file hashes, dirty/untracked status preserved",
+      "evidence": "/Users/macstudio3/Projects/ticket-system/data/codex-yoloforever/cycle-20260909T1836Z.rZWqkR/mdc-main-preserved.json"
     },
     {
-      "name": "All33 live field corrections verified",
       "verdict": "PASS",
-      "evidence": "data/tk10993-approved-residual-20260905/verify-2026-09-05T07-22-08-600Z.json: correct33/33, errors0, unrelated changes0, new disapprovals0"
+      "name": "No real auth reads or networking; stub imports intercept before reading; fetch constrained; socket guard installed"
     },
     {
-      "name": "Independent post-apply regression audit",
-      "verdict": "PASS",
-      "evidence": "verification/tk10993-20260905-post-apply-final.json: destamp40/40, protected10/10, F3links22/22, identitycopy82/82"
+      "verdict": "SKIP",
+      "name": "Live processed product state, source identity, preimages, canary, runtime integration",
+      "reason": "Out of scope and unapproved; source outcome remains blocked"
     }
   ],
-  "side_effect_boundary": "No inserts/deletes, Shopify writes, price changes, shipping-setting changes, or remote pushes. Only approved link/description PATCHes.",
-  "commands": [
-    "node --test test/tk10993-residual-executor.test.mjs",
-    "node tk10993-residual-executor.mjs preflight",
-    "node tk10993-residual-executor.mjs canary --apply-approved",
-    "node tk10993-residual-executor.mjs verify",
-    "node tk10993-residual-executor.mjs public-landings",
-    "node tk10993-residual-executor.mjs rollback-plan",
-    "node tk10993-residual-executor.mjs rest --apply-approved"
-  ],
-  "rollback": "Per-record before snapshots and reverse single-field PATCH requests; simulated restore tested. No live reversal was needed.",
-  "verdict": "PASS_APPROVED_33_CORRECTIONS",
-  "broader_ticket_status": "Still open: overnight durability observation and fresh Canada full-coverage assessment. Approved33-field gate resolved.",
-  "rollback_plan": "data/tk10993-approved-residual-20260905/rollback-plan-2026-09-05T07-22-54-719Z.json"
+  "retained_state": "All temporary fixtures and worktree retained; no cleanup deletion",
+  "verdict": "PARTIAL overall; bounded offline increment passes",
+  "safest_next_action": "Parent independently reruns suite and reviews isolated commit; leave runtime unchanged"
 }

← 042d3cd TK-11233: reporting-context hypothesis for the LPE count gap  ·  back to Gmc Titlefix  ·  Require MDC CLI tests to prove intended source rejection 6ed630b →