[object Object]

← back to Consulting Designerwallcoverings Com

TK-22 admin-UX: add created date+time chip to Low Hanging Fruit cards

4fcf330460cefffe6d00e7100e1610d063af54ae · 2026-07-27 21:08:46 -0700 · Steve Abrams

Standing rule (global CLAUDE.md): every admin card/chip MUST show the
record's created date AND time. The admin command-center's Low Hanging
Fruit cards showed none. Backfill created_at into suggestions.json
(basis = file creation 2026-07-26) and render a 🕓 when-chip via
fmtDate() (admin local tz, full ISO in title=), mirroring the
/admin/design-curator reference impl. Verified headless: 8/8 chips,
0 console errors, gating intact.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

Files touched

Diff

commit 4fcf330460cefffe6d00e7100e1610d063af54ae
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Mon Jul 27 21:08:46 2026 -0700

    TK-22 admin-UX: add created date+time chip to Low Hanging Fruit cards
    
    Standing rule (global CLAUDE.md): every admin card/chip MUST show the
    record's created date AND time. The admin command-center's Low Hanging
    Fruit cards showed none. Backfill created_at into suggestions.json
    (basis = file creation 2026-07-26) and render a 🕓 when-chip via
    fmtDate() (admin local tz, full ISO in title=), mirroring the
    /admin/design-curator reference impl. Verified headless: 8/8 chips,
    0 console errors, gating intact.
    
    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
---
 data/suggestions.json   | 26 +++++++++++++++++---------
 public/admin/index.html |  8 +++++++-
 2 files changed, 24 insertions(+), 10 deletions(-)

diff --git a/data/suggestions.json b/data/suggestions.json
index fe3ca30..5fdd8ea 100644
--- a/data/suggestions.json
+++ b/data/suggestions.json
@@ -5,7 +5,8 @@
     "category": "Revenue",
     "impact": 5,
     "effort": 3,
-    "rationale": "A third of live catalog is browseable-not-buyable; top 8 vendor lines cover ~17k. Data work, not spend."
+    "rationale": "A third of live catalog is browseable-not-buyable; top 8 vendor lines cover ~17k. Data work, not spend.",
+    "created_at": "2026-07-26T08:13:46Z"
   },
   {
     "id": "sug-2",
@@ -13,7 +14,8 @@
     "category": "Measurement",
     "impact": 4,
     "effort": 1,
-    "rationale": "Reach exists (80 FB pages, 34 IG); nothing proves revenue per channel. Prerequisite to scaling any spend."
+    "rationale": "Reach exists (80 FB pages, 34 IG); nothing proves revenue per channel. Prerequisite to scaling any spend.",
+    "created_at": "2026-07-26T08:13:46Z"
   },
   {
     "id": "sug-3",
@@ -21,7 +23,8 @@
     "category": "Conversion",
     "impact": 4,
     "effort": 2,
-    "rationale": "The $4.25 memo program produces daily purchase-intent signals; follow-up converts existing intent at near-zero cost."
+    "rationale": "The $4.25 memo program produces daily purchase-intent signals; follow-up converts existing intent at near-zero cost.",
+    "created_at": "2026-07-26T08:13:46Z"
   },
   {
     "id": "sug-4",
@@ -29,7 +32,8 @@
     "category": "Content",
     "impact": 3,
     "effort": 1,
-    "rationale": "~500 new products/day = native daily story; calendar above is pre-drafted for it."
+    "rationale": "~500 new products/day = native daily story; calendar above is pre-drafted for it.",
+    "created_at": "2026-07-26T08:13:46Z"
   },
   {
     "id": "sug-5",
@@ -37,7 +41,8 @@
     "category": "Channel",
     "impact": 4,
     "effort": 2,
-    "rationale": "Highest-fit missing channel for wallcoverings discovery; product feed already exists."
+    "rationale": "Highest-fit missing channel for wallcoverings discovery; product feed already exists.",
+    "created_at": "2026-07-26T08:13:46Z"
   },
   {
     "id": "sug-6",
@@ -45,7 +50,8 @@
     "category": "Trade",
     "impact": 4,
     "effort": 3,
-    "rationale": "Highest-LTV segment currently buys through retail flow; formalize trade pricing behind a login."
+    "rationale": "Highest-LTV segment currently buys through retail flow; formalize trade pricing behind a login.",
+    "created_at": "2026-07-26T08:13:46Z"
   },
   {
     "id": "sug-7",
@@ -53,7 +59,8 @@
     "category": "Search",
     "impact": 3,
     "effort": 2,
-    "rationale": "Flagship AEO block exists; extend to the 287-site fleet for AI-answer citations."
+    "rationale": "Flagship AEO block exists; extend to the 287-site fleet for AI-answer citations.",
+    "created_at": "2026-07-26T08:13:46Z"
   },
   {
     "id": "sug-8",
@@ -61,6 +68,7 @@
     "category": "Projects",
     "impact": 3,
     "effort": 3,
-    "rationale": "Type II lines in catalog; one hotel corridor = 400 rolls. Spec-sheet + quote flow."
+    "rationale": "Type II lines in catalog; one hotel corridor = 400 rolls. Spec-sheet + quote flow.",
+    "created_at": "2026-07-26T08:13:46Z"
   }
-]
\ No newline at end of file
+]
diff --git a/public/admin/index.html b/public/admin/index.html
index 5204822..de3e437 100644
--- a/public/admin/index.html
+++ b/public/admin/index.html
@@ -46,6 +46,7 @@
       #lhf .b.roi-high,#lhf .b.time-quick{color:#7ad17a;border-color:#3a5a3a}
       #lhf .b.roi-solid{color:#c6a765}
       #lhf .b.fruit{background:#c6a765;color:#12100e;border:0;font-weight:700}
+      #lhf .b.when{color:#8a8272;border-color:#2c2823;font-variant-numeric:tabular-nums}
       #lhf .rat{font-size:12.5px;color:#b8ad97;margin-top:2px}
       #lhf .why{font-size:12.5px;color:#8a8272;margin-top:4px}
       #lhf .why b{color:#c6a765;font-weight:600}
@@ -62,6 +63,9 @@
       var TIME=function(e){return e<=2?['Quick','time-quick']:e===3?['Moderate','time-mod']:['Involved','time-inv'];};
       var ROI=function(i,e){var r=i/Math.max(1,e);return r>=2?['High','roi-high']:r>=1.2?['Solid','roi-solid']:['Low','roi-low'];};
       function esc(s){return String(s==null?'':s).replace(/[&<>"]/g,function(c){return {'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;'}[c];});}
+      // Standing rule: every admin card shows the record's created DATE AND TIME
+      // (admin's local tz), full ISO in title=. Reference: /admin/design-curator fmtDate().
+      function fmtDate(iso){if(!iso)return null;var d=new Date(iso);if(isNaN(d))return null;return d.toLocaleString(undefined,{year:'numeric',month:'short',day:'numeric',hour:'numeric',minute:'2-digit'});}
       fetch('/api/admin/suggestions').then(function(r){return r.ok?r.json():[];}).then(function(list){
         var el=document.getElementById('lhf-list');
         list=(list||[]).filter(function(s){return s&&s.title;});
@@ -70,12 +74,14 @@
         list.sort(function(a,b){return b._roi-a._roi||a._e-b._e||b._i-a._i;});
         el.innerHTML=list.map(function(s,idx){
           var t=TIME(s._e),ro=ROI(s._i,s._e);
+          var when=fmtDate(s.created_at||s.createdAt||s.added_at);
           return `<li class="${s._fruit?'fruit':''}"><div class="rk">${idx+1}</div><div>`+
             `<div class="ti">${esc(s.title)}</div>`+
             `<div class="badges">${s._fruit?'<span class="b fruit">⚡ Quick win</span>':''}`+
             `<span class="b ${ro[1]}">ROI ${s._roi.toFixed(1)}</span><span class="b ${t[1]}">⏱ ${t[0]}</span>`+
             `${s.category?`<span class="b">${esc(s.category)}</span>`:''}`+
-            `<span class="b">impact ${s._i} · effort ${s._e}</span></div>`+
+            `<span class="b">impact ${s._i} · effort ${s._e}</span>`+
+            `${when?`<span class="b when" title="${esc(s.created_at||s.createdAt||s.added_at)}">🕓 ${esc(when)}</span>`:''}</div>`+
             `${s.rationale?`<div class="rat">${esc(s.rationale)}</div>`:''}</div></li>`;
         }).join('');
       }).catch(function(){document.getElementById('lhf-list').innerHTML='<li class="empty">Could not load suggestions.</li>';});

← b28b741 TK-22 red-team FINDING 4: fix XFF-spoof rate-limit bypass on  ·  back to Consulting Designerwallcoverings Com  ·  TK-22 signin: hydrate front door from /api/client (fixes sta c46dce5 →