← 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
M data/suggestions.jsonM public/admin/index.html
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 {'&':'&','<':'<','>':'>','"':'"'}[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 →