[object Object]

← back to Designerwallcoverings

reconcile Stroheim monthly scheduler contract

fce3887fb908034fd609f97f1293e73eac757958 · 2026-08-30 11:02:55 -0700 · Steve Abrams

Files touched

Diff

commit fce3887fb908034fd609f97f1293e73eac757958
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Sun Aug 30 11:02:55 2026 -0700

    reconcile Stroheim monthly scheduler contract
---
 scripts/stroheim-onboard/README.md                 | 11 +++-
 .../com.steve.stroheim-onboard-resume.plist        | 20 +++-----
 scripts/stroheim-onboard/resume.sh                 |  7 ++-
 verification/TK-10972-e2e-proof.json               | 59 ++++++++++++++++++++++
 verification/TK-10972-schedule-contract.sh         | 29 +++++++++++
 5 files changed, 110 insertions(+), 16 deletions(-)

diff --git a/scripts/stroheim-onboard/README.md b/scripts/stroheim-onboard/README.md
index fab3bcd..577c4f4 100644
--- a/scripts/stroheim-onboard/README.md
+++ b/scripts/stroheim-onboard/README.md
@@ -4,7 +4,7 @@ Onboards the 782 staged Stroheim wallcovering colorways (`dw_unified.stroheim_ca
 to the live DW Shopify store as DRAFTS. Models the knoll / CMO-Paris / muralsource
 onboard pattern. **Prefix `DWST` (approved by Steve 2026-07-26).**
 
-## Status (2026-07-26)
+## Original build status (2026-07-26 snapshot)
 
 - ✅ Staging complete: 782 rows, 100% images / width / specs, 0 "Unknown", all `net_new`,
   dedup-clean (0 Stroheim products on the live store).
@@ -14,6 +14,15 @@ onboard pattern. **Prefix `DWST` (approved by Steve 2026-07-26).**
 - ⛔ **BLOCKED on PRICE** — `price_retail` is 100% NULL. Steve's hard rule forbids anything
   at $0/NULL. Nothing is created until price is sourced. (DTD 2026-07-26, 5/5 = HOLD.)
 
+### Scheduled continuation
+
+Steve explicitly approved and armed `com.steve.stroheim-onboard-resume` on 2026-07-27
+(TK-00039), then approved its reload/restart on 2026-08-25 (TK-10849). Its installed
+cadence is monthly, Day 7 at 01:20, with `STROHEIM_ALLOW_GOLIVE` absent. The scheduled
+path therefore remains drafts-only; activation is not implied. Any future install,
+reload, cadence change, paid settlement run, Shopify write, or activation requires a
+fresh approval.
+
 ## The ONE unblock step
 
 Populate `stroheim_catalog.price_retail` (and optionally `price_trade`) via **either**:
diff --git a/scripts/stroheim-onboard/com.steve.stroheim-onboard-resume.plist b/scripts/stroheim-onboard/com.steve.stroheim-onboard-resume.plist
index 3eff8ee..bc00d29 100644
--- a/scripts/stroheim-onboard/com.steve.stroheim-onboard-resume.plist
+++ b/scripts/stroheim-onboard/com.steve.stroheim-onboard-resume.plist
@@ -8,20 +8,14 @@
     <string>/bin/bash</string>
     <string>/Users/macstudio3/Projects/designerwallcoverings/scripts/stroheim-onboard/resume.sh</string>
   </array>
-  <!-- Trickle the 771 settlement-OK Stroheim (DWST-810xxx) DRAFTS under the DEDICATED 'stroheim'
-       variant slice (own floor ~100/day = ~50 products/day, ~16 days; NEVER 'upload'). resume.sh
-       is DRAFTS-ONLY (STROHEIM_ALLOW_GOLIVE unset → go-live SKIPPED) — activation stays a
-       separate Steve-gated step. 00:40 primary + 13:40 retry (offset from stout 00:30/13:30,
-       muralsource 00:20/13:20, greenland 00:10/13:00 to avoid backlog contention). resume.sh is
-       idempotent + settlement-gated + cap-clean and no-ops once every OK SKU is created.
-       INSTALL (Steve-gated — scheduled-job install). To arm:
-         cp ~/Projects/designerwallcoverings/scripts/stroheim-onboard/com.steve.stroheim-onboard-resume.plist ~/Library/LaunchAgents/
-         launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.steve.stroheim-onboard-resume.plist -->
+  <!-- Monthly drafts-only continuation for Stroheim (DWST-810xxx). Steve explicitly approved
+       the original install on 2026-07-27 (TK-00039) and reload/restart on 2026-08-25 (TK-10849).
+       STROHEIM_ALLOW_GOLIVE is intentionally absent, so activation remains a separate Steve gate.
+       This tracked cadence mirrors the installed job; any future install/reload/cadence change,
+       paid settlement run, Shopify write, or activation still requires fresh approval. -->
+  <key>RunAtLoad</key><false/>
   <key>StartCalendarInterval</key>
-  <array>
-    <dict><key>Hour</key><integer>0</integer><key>Minute</key><integer>40</integer></dict>
-    <dict><key>Hour</key><integer>13</integer><key>Minute</key><integer>40</integer></dict>
-  </array>
+  <dict><key>Day</key><integer>7</integer><key>Hour</key><integer>1</integer><key>Minute</key><integer>20</integer></dict>
   <key>StandardOutPath</key><string>/Users/macstudio3/Projects/designerwallcoverings/scripts/stroheim-onboard/out/launchd.out</string>
   <key>StandardErrorPath</key><string>/Users/macstudio3/Projects/designerwallcoverings/scripts/stroheim-onboard/out/launchd.err</string>
 </dict></plist>
diff --git a/scripts/stroheim-onboard/resume.sh b/scripts/stroheim-onboard/resume.sh
index 4eaf95b..b73e6f3 100755
--- a/scripts/stroheim-onboard/resume.sh
+++ b/scripts/stroheim-onboard/resume.sh
@@ -12,8 +12,11 @@
 #   5. go-live         — ONLY if STROHEIM_ALLOW_GOLIVE=1 (Steve-gated activation; channels
 #                        except Google/YouTube). Default: SKIPPED — drafts stay drafts.
 #
-# HARD BLOCK: while price_retail is NULL, steps 1-4 no-op cleanly (build emits 0). This script
-# is NOT scheduled in launchd (scheduled-job install is itself gated) — run it by hand.
+# HARD BLOCK: while price_retail is NULL, steps 1-4 no-op cleanly (build emits 0).
+# Scheduling history: Steve explicitly approved and armed the drafts-only launchd job on
+# 2026-07-27 (TK-00039), then approved its reload/restart on 2026-08-25 (TK-10849).
+# The installed cadence is monthly (Day 7 at 01:20). Any future install, reload, cadence
+# change, paid settlement run, Shopify write, or activation remains separately gated.
 set -euo pipefail
 cd "$(dirname "$0")" || exit 1
 export PATH="/opt/homebrew/bin:/opt/homebrew/opt/postgresql@14/bin:/usr/bin:/bin:/usr/sbin:/sbin:$PATH"
diff --git a/verification/TK-10972-e2e-proof.json b/verification/TK-10972-e2e-proof.json
new file mode 100644
index 0000000..4a27604
--- /dev/null
+++ b/verification/TK-10972-e2e-proof.json
@@ -0,0 +1,59 @@
+{
+  "ticket": "TK-10972",
+  "intent": "Reconcile the tracked Stroheim scheduler contract with the explicitly approved live monthly launchd contract without loading, reloading, running, or stopping the job.",
+  "risk_tier": "R1 local config and documentation",
+  "environment": "Mac2 local repository plus read-only inspection of the installed LaunchAgent",
+  "baseline_commit": "13c9e254648ccd99bd5d0b053e07cda76cfd4d0a",
+  "timestamp_utc": "2026-08-30T18:02:22Z",
+  "preconditions": {
+    "installed_job": "gui/501/com.steve.stroheim-onboard-resume",
+    "state": "not running",
+    "runs": 2,
+    "last_exit_code": 143,
+    "ticket_history": "TK-00039 explicitly approved install/arming; TK-10849 explicitly approved reload/restart"
+  },
+  "checks": [
+    {
+      "name": "shell syntax",
+      "command": "bash -n scripts/stroheim-onboard/resume.sh",
+      "verdict": "PASS"
+    },
+    {
+      "name": "tracked plist syntax",
+      "command": "plutil -lint scripts/stroheim-onboard/com.steve.stroheim-onboard-resume.plist",
+      "verdict": "PASS"
+    },
+    {
+      "name": "scheduler contract boundary",
+      "command": "verification/TK-10972-schedule-contract.sh",
+      "assertions": [
+        "Label, ProgramArguments, RunAtLoad, monthly StartCalendarInterval, stdout and stderr paths match the installed plist",
+        "neither plist arms STROHEIM_ALLOW_GOLIVE",
+        "resume.sh defaults STROHEIM_ALLOW_GOLIVE to 0 and retains the go-live skipped branch"
+      ],
+      "verdict": "PASS"
+    },
+    {
+      "name": "side-effect boundary",
+      "assertions": [
+        "launchctl state remained not running with runs=2 and last exit=143",
+        "no launchctl load, bootstrap, bootout, reload, kickstart, or scheduler execution was performed",
+        "no Gemini or other paid API call was performed",
+        "no Shopify, database, publish, deploy, or activation write was performed"
+      ],
+      "verdict": "PASS"
+    },
+    {
+      "name": "diff integrity",
+      "command": "git diff --check",
+      "verdict": "PASS"
+    }
+  ],
+  "negative_checks": [
+    "A scheduler-side STROHEIM_ALLOW_GOLIVE=1 or EnvironmentVariables block fails the contract test.",
+    "Any tracked/installed drift in an operational plist field fails the contract test."
+  ],
+  "cleanup": "No runtime or external test state was created.",
+  "critical_path_skips": [],
+  "overall": "PASS"
+}
diff --git a/verification/TK-10972-schedule-contract.sh b/verification/TK-10972-schedule-contract.sh
new file mode 100755
index 0000000..2118510
--- /dev/null
+++ b/verification/TK-10972-schedule-contract.sh
@@ -0,0 +1,29 @@
+#!/bin/bash
+set -euo pipefail
+
+ROOT="$(cd "$(dirname "$0")/.." && pwd)"
+SOURCE="$ROOT/scripts/stroheim-onboard/com.steve.stroheim-onboard-resume.plist"
+INSTALLED="$HOME/Library/LaunchAgents/com.steve.stroheim-onboard-resume.plist"
+RESUME="$ROOT/scripts/stroheim-onboard/resume.sh"
+
+plutil -lint "$SOURCE" "$INSTALLED" >/dev/null
+
+for key in Label ProgramArguments RunAtLoad StartCalendarInterval StandardOutPath StandardErrorPath; do
+  source_value="$(plutil -extract "$key" xml1 -o - "$SOURCE")"
+  installed_value="$(plutil -extract "$key" xml1 -o - "$INSTALLED")"
+  if [[ "$source_value" != "$installed_value" ]]; then
+    echo "FAIL: tracked and installed plist differ at $key" >&2
+    exit 1
+  fi
+done
+
+if rg -q 'STROHEIM_ALLOW_GOLIVE[^<]*1|EnvironmentVariables' "$SOURCE" "$INSTALLED"; then
+  echo "FAIL: scheduler can arm go-live" >&2
+  exit 1
+fi
+
+rg -q 'STROHEIM_ALLOW_GOLIVE:-0' "$RESUME"
+rg -q 'go-live SKIPPED' "$RESUME"
+
+printf '%s\n' 'PASS: tracked plist matches installed monthly contract'
+printf '%s\n' 'PASS: scheduler does not arm go-live; resume defaults to drafts-only'

← 13c9e25 record TK-10965 full canary evidence  ·  back to Designerwallcoverings  ·  auto-data-snapshot: 2026-08-30T14:05:24 (1 data files) — dat d22202c →