← back to Marketing Command Center
make MCC first run simpler and verify quick post
193bd34c0bb411edb030ed7219c2cccec8ce013f · 2026-08-28 10:19:44 -0700 · Steve Abrams
Files touched
M cta/CTA-REPORT.mdM public/app.jsM public/panels/quickpost.htmlM public/panels/quickpost.jsM verification/e2e-proof.json
Diff
commit 193bd34c0bb411edb030ed7219c2cccec8ce013f
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Fri Aug 28 10:19:44 2026 -0700
make MCC first run simpler and verify quick post
---
cta/CTA-REPORT.md | 4 ++--
public/app.js | 4 +++-
public/panels/quickpost.html | 2 +-
public/panels/quickpost.js | 6 +++---
verification/e2e-proof.json | 6 +++---
5 files changed, 12 insertions(+), 10 deletions(-)
diff --git a/cta/CTA-REPORT.md b/cta/CTA-REPORT.md
index ba87324..301ead4 100644
--- a/cta/CTA-REPORT.md
+++ b/cta/CTA-REPORT.md
@@ -6,8 +6,8 @@
## Browser coverage
-- Chrome/Chromium recording: /Users/macstudio3/Projects/marketing-command-center/cta/rec/chrome/page@12f3decf4707fce4a7c0101d32cbc9ef.webm
-- Safari/WebKit recording: /Users/macstudio3/Projects/marketing-command-center/cta/rec/safari/page@376a0bd659cd02c135b2aaaeb8acdc51.webm
+- Chrome/Chromium recording: /Users/macstudio3/Projects/marketing-command-center/cta/rec/chrome/page@182a264a2359d0abf325514b5677ca0b.webm
+- Safari/WebKit recording: /Users/macstudio3/Projects/marketing-command-center/cta/rec/safari/page@3b5fb4ac8fdc159a8582ad72fc746abf.webm
- Browserbase: skipped by design because the target is localhost and Browserbase cannot reach the Mac-local service.
## Components
diff --git a/public/app.js b/public/app.js
index e700141..30c3472 100644
--- a/public/app.js
+++ b/public/app.js
@@ -149,7 +149,9 @@ const loaded = new Set();
let routeToken = 0;
async function route() {
const myToken = ++routeToken;
- const id = location.hash.replace('#', '') || (PANELS[0] && PANELS[0].id);
+ const requested = location.hash.replace('#', '');
+ const firstPanel = PANELS.find(p => p.id === 'quickpost') || PANELS[0];
+ const id = requested || (firstPanel && firstPanel.id);
if (!id) return;
const meta = PANELS.find(p => p.id === id) || { id, title: id };
// A hidden/merged panel (e.g. composer, follow-counts — reachable via the palette)
diff --git a/public/panels/quickpost.html b/public/panels/quickpost.html
index 02228b1..826f179 100644
--- a/public/panels/quickpost.html
+++ b/public/panels/quickpost.html
@@ -43,4 +43,4 @@
.kp-review{display:grid;grid-template-columns:190px 1fr;gap:20px;margin-top:22px;border:2px solid #dadddf;border-radius:18px;padding:16px;background:#fff}.kp-preview{aspect-ratio:1;border-radius:13px;overflow:hidden;background:#ece8de}.kp-preview img,.kp-preview video{width:100%;height:100%;object-fit:cover}.kp-summary h4{margin:2px 0 5px;font-size:13px;text-transform:uppercase;letter-spacing:.08em;color:#75808c}.kp-summary p{white-space:pre-wrap;line-height:1.5;margin:0 0 14px}.kp-tags{display:flex;gap:7px;flex-wrap:wrap}.kp-tag{background:#edf1f4;border-radius:999px;padding:6px 10px;font-size:12px;font-weight:700}.kp-confirm{display:flex;gap:12px;align-items:flex-start;background:#fff5d5;border:2px solid #efd06f;border-radius:15px;padding:14px;margin-top:17px;font-weight:700;line-height:1.4}.kp-confirm input{width:22px;height:22px;flex:none}.kp-publish,.kp-draft{width:100%;border:0;border-radius:14px;padding:15px;margin-top:12px;font:800 17px/1 inherit;cursor:pointer}.kp-publish{background:var(--green);color:#fff}.kp-publish:disabled{background:#aeb6b1;cursor:not-allowed}.kp-draft{background:#e9ecef;color:var(--navy)}.kp-result{margin-top:12px;font-weight:700;line-height:1.45}.kp-result.ok{color:var(--green)}.kp-result.bad{color:#a33c2f}.kp-nav{display:flex;justify-content:space-between;border-top:1px solid #e3e1d9;padding:16px 30px;background:#fff}.kp-nav button{border:0;border-radius:12px;padding:12px 18px;font-weight:800;cursor:pointer}.kp-nav button:disabled{opacity:.35}.kp-nav #kp-next{background:var(--coral);color:#fff}.kp-wait{grid-column:1/-1;padding:28px;text-align:center;color:#68717c}.kp-error{background:#fff0eb;color:#923f32;border-radius:12px;padding:12px;margin-top:12px}
@media(max-width:700px){.kp-hero{align-items:flex-start;padding:20px}.kp-score{display:none}.kp-steps{gap:3px}.kp-step b{display:none}.kp-pane{padding:22px 16px}.kp-assets{grid-template-columns:repeat(3,1fr)}.kp-prompt{display:block}.kp-prompt button{width:100%}.kp-review{grid-template-columns:1fr}.kp-preview{max-height:280px}.kp-nav{padding:14px 16px}}
</style>
-<style>.kp-asset img{pointer-events:none}.kp-asset-name,.kp-asset.on:after{pointer-events:none}</style>
+<style>.kp-asset img{pointer-events:none}.kp-asset-name,.kp-asset.on:after{pointer-events:none}.kp-step:disabled{cursor:not-allowed;opacity:.5}</style>
diff --git a/public/panels/quickpost.js b/public/panels/quickpost.js
index f88800c..fe3094f 100644
--- a/public/panels/quickpost.js
+++ b/public/panels/quickpost.js
@@ -21,7 +21,7 @@ window.MCC_PANELS.quickpost = {
function showStep(n) {
state.step = Math.max(1, Math.min(5, n));
$$('.kp-pane').forEach(p => { const on = +p.dataset.step === state.step; p.hidden = !on; p.classList.toggle('on', on); });
- $$('.kp-step').forEach(b => { const x = +b.dataset.go; b.classList.toggle('on', x === state.step); b.classList.toggle('done', x < state.step); b.setAttribute('aria-selected', String(x === state.step)); });
+ $$('.kp-step').forEach(b => { const x = +b.dataset.go; const locked = x > state.step; b.classList.toggle('on', x === state.step); b.classList.toggle('done', x < state.step); b.disabled = locked; b.setAttribute('aria-selected', String(x === state.step)); b.setAttribute('aria-disabled', String(locked)); });
$('#kp-progress').textContent = state.step + ' of 5';
$('#kp-back').disabled = state.step === 1;
$('#kp-next').hidden = state.step === 5;
@@ -101,8 +101,8 @@ window.MCC_PANELS.quickpost = {
$$('.kp-channel:not(.off)').forEach(b => b.onclick = () => { b.classList.toggle('on'); b.setAttribute('aria-pressed', String(b.classList.contains('on'))); state.channels = $$('.kp-channel.on').map(x=>x.dataset.channel); });
} catch (_) { $('#kp-channels').innerHTML = '<div class="kp-error">Social accounts could not be checked.</div>'; }
}
- $('#kp-all').onclick = () => { $$('.kp-channel:not(.off)').forEach(b=>b.classList.add('on')); state.channels = $$('.kp-channel.on').map(x=>x.dataset.channel); };
- $('#kp-none').onclick = () => { $$('.kp-channel').forEach(b=>b.classList.remove('on')); state.channels=[]; };
+ $('#kp-all').onclick = () => { $$('.kp-channel:not(.off)').forEach(b=>{ b.classList.add('on'); b.setAttribute('aria-pressed','true'); }); state.channels = $$('.kp-channel.on').map(x=>x.dataset.channel); };
+ $('#kp-none').onclick = () => { $$('.kp-channel').forEach(b=>{ b.classList.remove('on'); b.setAttribute('aria-pressed','false'); }); state.channels=[]; };
async function loadAccounts() { let a=[]; try { a=(window.MCC_ACCOUNTS&&await window.MCC_ACCOUNTS.load())||[]; } catch (_) {} $('#kp-account').innerHTML='<option value="">Main Designer Wallcoverings account</option>'+a.map(x=>`<option value="${esc(x.handle)}">@${esc(x.handle)}${x.name?' — '+esc(x.name):''}</option>`).join(''); }
function renderReview() {
diff --git a/verification/e2e-proof.json b/verification/e2e-proof.json
index feac37a..302d8b6 100644
--- a/verification/e2e-proof.json
+++ b/verification/e2e-proof.json
@@ -2,7 +2,7 @@
"intent": "Make the Marketing Command Center understandable to a 10-year-old and make Quick Post offer many more assets.",
"risk_tier": "R3",
"environment": "Mac2 local Marketing Command Center on http://127.0.0.1:9661",
- "build_commit": "8cbe82e",
+ "build_commit": "pending-commit",
"timestamp": "2026-08-28T16:05:00-07:00",
"preconditions": [
"MCC service listening on :9661",
@@ -15,9 +15,9 @@
{"name":"Panel inventory","command":"GET /api/panels with MCC credentials","verdict":"PASS","evidence":"33 panels returned"},
{"name":"Channel status","command":"GET /api/channels/status with MCC credentials","verdict":"PASS","evidence":"4 platform records returned"},
{"name":"Expanded catalog source","command":"GET /api/assets/catalog?limit=200 with MCC credentials","verdict":"PASS","evidence":"catalog endpoint returned product records; Quick Post merges up to 200"},
- {"name":"Cross-browser CTA","command":"node scripts/cta-quickpost.js","verdict":"SKIP","evidence":"Playwright package is not installed in this project; no click-through claim made"}
+ {"name":"Cross-browser CTA","command":"node scripts/cta-quickpost.js","verdict":"PASS","evidence":"36/36 checks passed in Chromium and WebKit; report and recordings in cta/"}
],
"side_effects": {"social_posts":0,"emails":0,"spend_usd":0,"external_writes":0},
"cleanup": "No production or remote service touched; local MCC process retained for browser review.",
- "verdict": "PARTIAL — local UX/code and API boundaries pass; CTA remains blocked on missing Playwright dependency."
+ "verdict": "PASS — local UX, API boundaries, and cross-browser Quick Post journey pass; no social posts, emails, spend, or external writes performed."
}
← 2f5e1c4 auto-data-snapshot: 2026-08-28T10:16:39 (1 data files) — pub
·
back to Marketing Command Center
·
record final MCC proof commit 5de9f9e →