Skip to content

Instantly share code, notes, and snippets.

@fuyi
Created September 2, 2026 20:31
Show Gist options
  • Select an option

  • Save fuyi/3e630a9fe2dc1468014bcf3363f6a3b7 to your computer and use it in GitHub Desktop.

Select an option

Save fuyi/3e630a9fe2dc1468014bcf3363f6a3b7 to your computer and use it in GitHub Desktop.
simple_marts Gantt chart — 44 models, ~15 min wall-clock (dev_yi2 schema)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>simple_marts Gantt</title>
<style>
body { font-family: monospace; background: #1a1a2e; color: #eee; margin: 20px; }
h2 { color: #a0c4ff; margin-bottom: 4px; }
.subtitle { color: #666; font-size: 12px; margin-bottom: 16px; }
.row { display: flex; align-items: center; height: 22px; margin: 2px 0; }
.label { width: 330px; font-size: 11px; text-align: right; padding-right: 8px; flex-shrink: 0; overflow: hidden; white-space: nowrap; color: #ccc; }
.timeline { position: relative; flex: 1; height: 18px; min-width: 1400px; }
.bar { position: absolute; height: 16px; border-radius: 3px; top: 1px; opacity: 0.88; cursor: default; }
.bar:hover::after { content: attr(title); position: absolute; bottom: 20px; left: 0; background: #222; color: #fff; padding: 4px 8px; border-radius: 4px; font-size: 11px; white-space: nowrap; z-index: 10; }
.ok { background: #4cc9f0; }
.error { background: #ff4444; }
</style>
</head>
<body>
<h2>simple_marts — per-model execution</h2>
<div class="subtitle">44 models · ~15 min wall-clock · 2026-09-02 17:56 UTC</div>
<div id="chart"></div>
<p style="font-size:11px;color:#666">
<span style="color:#4cc9f0">&#9632;</span> success &nbsp;
<span style="color:#ff4444">&#9632;</span> error
</p>
<script>
const data = [{"model": "chatboi_user", "start": "2026-09-02T17:56:19.220000+00:00", "end": "2026-09-02T17:56:22+00:00", "dur": 2.78, "status": "ok"}, {"model": "int_coaching_batch_evaluation", "start": "2026-09-02T17:56:19.460000+00:00", "end": "2026-09-02T17:56:50+00:00", "dur": 30.54, "status": "ok"}, {"model": "int_lead_field_definition", "start": "2026-09-02T17:56:19.610000+00:00", "end": "2026-09-02T17:56:21+00:00", "dur": 1.39, "status": "ok"}, {"model": "aa_scorecard_traffic", "start": "2026-09-02T17:56:19.860000+00:00", "end": "2026-09-02T17:56:23+00:00", "dur": 3.14, "status": "ok"}, {"model": "int_qc_item", "start": "2026-09-02T17:56:19.890000+00:00", "end": "2026-09-02T17:56:46+00:00", "dur": 26.11, "status": "ok"}, {"model": "coaching_session_analysis_question", "start": "2026-09-02T17:56:19.910000+00:00", "end": "2026-09-02T17:56:23+00:00", "dur": 3.09, "status": "ok"}, {"model": "int_coaching_transcript", "start": "2026-09-02T17:56:19.990000+00:00", "end": "2026-09-02T18:07:20+00:00", "dur": 660.01, "status": "ok"}, {"model": "int_coaching_session_profile", "start": "2026-09-02T17:56:20+00:00", "end": "2026-09-02T17:56:35+00:00", "dur": 15.0, "status": "ok"}, {"model": "int_qc_item_bullet", "start": "2026-09-02T17:56:21.210000+00:00", "end": "2026-09-02T17:57:21+00:00", "dur": 59.79, "status": "ok"}, {"model": "int_session_field_wo_sideload", "start": "2026-09-02T17:56:22.860000+00:00", "end": "2026-09-02T17:56:46+00:00", "dur": 23.14, "status": "ok"}, {"model": "int_qc_item_session", "start": "2026-09-02T17:56:22.980000+00:00", "end": "2026-09-02T17:56:41+00:00", "dur": 18.02, "status": "ok"}, {"model": "int_session_field_definition", "start": "2026-09-02T17:56:23.250000+00:00", "end": "2026-09-02T17:56:25+00:00", "dur": 1.75, "status": "ok"}, {"model": "lead", "start": "2026-09-02T17:56:24.750000+00:00", "end": "2026-09-02T17:56:38+00:00", "dur": 13.25, "status": "ok"}, {"model": "lead_external_identifier", "start": "2026-09-02T17:56:34.970000+00:00", "end": "2026-09-02T17:57:03+00:00", "dur": 28.03, "status": "ok"}, {"model": "lead_field", "start": "2026-09-02T17:56:37.800000+00:00", "end": "2026-09-02T17:56:59+00:00", "dur": 21.2, "status": "ok"}, {"model": "lead_field_log", "start": "2026-09-02T17:56:40.360000+00:00", "end": "2026-09-02T17:57:01+00:00", "dur": 20.64, "status": "ok"}, {"model": "lead_session", "start": "2026-09-02T17:56:45.470000+00:00", "end": "2026-09-02T17:57:24+00:00", "dur": 38.53, "status": "ok"}, {"model": "aa_chatboi_user", "start": "2026-09-02T17:56:45.970000+00:00", "end": "2026-09-02T17:56:48+00:00", "dur": 2.03, "status": "ok"}, {"model": "aa_thread", "start": "2026-09-02T17:56:47.680000+00:00", "end": "2026-09-02T17:56:51+00:00", "dur": 3.32, "status": "ok"}, {"model": "chatboi_team_membership", "start": "2026-09-02T17:56:50.470000+00:00", "end": "2026-09-02T17:56:53+00:00", "dur": 2.53, "status": "ok"}, {"model": "coaching_session_analysis", "start": "2026-09-02T17:56:51.200000+00:00", "end": "2026-09-02T17:56:53+00:00", "dur": 1.8, "status": "ok"}, {"model": "coaching_v2_report", "start": "2026-09-02T17:56:52.320000+00:00", "end": "2026-09-02T17:56:54+00:00", "dur": 1.68, "status": "ok"}, {"model": "insight", "start": "2026-09-02T17:56:53.550000+00:00", "end": "2026-09-02T17:56:57+00:00", "dur": 3.45, "status": "ok"}, {"model": "revenue_mining_list", "start": "2026-09-02T17:56:54.470000+00:00", "end": "2026-09-02T17:56:59+00:00", "dur": 4.53, "status": "ok"}, {"model": "routine_v3", "start": "2026-09-02T17:56:56.600000+00:00", "end": "2026-09-02T17:56:59+00:00", "dur": 2.4, "status": "ok"}, {"model": "aa_message", "start": "2026-09-02T17:56:58.740000+00:00", "end": "2026-09-02T17:57:14+00:00", "dur": 15.26, "status": "ok"}, {"model": "coaching_report", "start": "2026-09-02T17:56:59.010000+00:00", "end": "2026-09-02T17:57:04+00:00", "dur": 4.99, "status": "ok"}, {"model": "aa_chatboi_team_membership", "start": "2026-09-02T17:56:59.600000+00:00", "end": "2026-09-02T17:57:02+00:00", "dur": 2.4, "status": "ok"}, {"model": "int_session_team_ids", "start": "2026-09-02T17:57:01.390000+00:00", "end": "2026-09-02T17:57:03+00:00", "dur": 1.61, "status": "ok"}, {"model": "execution_v3", "start": "2026-09-02T17:57:02.240000+00:00", "end": "2026-09-02T17:57:05+00:00", "dur": 2.76, "status": "ok"}, {"model": "aa_lead_field_info", "start": "2026-09-02T17:57:02.340000+00:00", "end": "2026-09-02T17:57:05+00:00", "dur": 2.66, "status": "ok"}, {"model": "run_v3", "start": "2026-09-02T17:57:02.340000+00:00", "end": "2026-09-02T17:57:33+00:00", "dur": 30.66, "status": "ok"}, {"model": "lead_opp_field", "start": "2026-09-02T17:57:04.280000+00:00", "end": "2026-09-02T17:57:13+00:00", "dur": 8.72, "status": "ok"}, {"model": "aa_coaching_report", "start": "2026-09-02T17:57:05.030000+00:00", "end": "2026-09-02T17:57:10+00:00", "dur": 4.97, "status": "ok"}, {"model": "daily_team_coaching_summary", "start": "2026-09-02T17:57:05.850000+00:00", "end": "2026-09-02T17:57:08+00:00", "dur": 2.15, "status": "ok"}, {"model": "coaching_session", "start": "2026-09-02T18:07:19.600000+00:00", "end": "2026-09-02T18:07:26+00:00", "dur": 6.4, "status": "ok"}, {"model": "aa_coaching_session", "start": "2026-09-02T18:07:26.040000+00:00", "end": "2026-09-02T18:07:31+00:00", "dur": 4.96, "status": "ok"}, {"model": "revenue_mining_item", "start": "2026-09-02T18:07:26.530000+00:00", "end": "2026-09-02T18:07:30+00:00", "dur": 3.47, "status": "ok"}, {"model": "int_axo_disbursements", "start": "2026-09-02T18:07:26.540000+00:00", "end": "2026-09-02T18:08:03+00:00", "dur": 36.46, "status": "ok"}, {"model": "revenue_mining_item_field", "start": "2026-09-02T18:07:29.420000+00:00", "end": "2026-09-02T18:07:34+00:00", "dur": 4.58, "status": "ok"}, {"model": "revenue_mining_assignment", "start": "2026-09-02T18:07:29.730000+00:00", "end": "2026-09-02T18:07:33+00:00", "dur": 3.27, "status": "ok"}, {"model": "int_sideloaded_session_field", "start": "2026-09-02T18:08:02.540000+00:00", "end": "2026-09-02T18:08:04+00:00", "dur": 1.46, "status": "ok"}, {"model": "int_session_field", "start": "2026-09-02T18:08:04.270000+00:00", "end": "2026-09-02T18:11:33+00:00", "dur": 208.73, "status": "ok"}, {"model": "int_session_field_blob", "start": "2026-09-02T18:11:33.080000+00:00", "end": "2026-09-02T18:11:48+00:00", "dur": 14.92, "status": "ok"}];
data.sort((a,b) => new Date(a.start) - new Date(b.start));
const runStart = new Date(data[0].start).getTime();
const runEnd = Math.max(...data.map(d => new Date(d.end).getTime()));
const totalMs = runEnd - runStart;
const PX = 1400 / (totalMs / 1000);
const chart = document.getElementById('chart');
// Header ticks every 5 min
const hdr = document.createElement('div');
hdr.style.cssText = 'display:flex;margin-left:338px;position:relative;height:20px;margin-bottom:4px;min-width:1400px;';
for (let s = 0; s <= totalMs/1000; s += 300) {
const t = document.createElement('span');
t.style.cssText = `position:absolute;left:${s*PX}px;font-size:10px;color:#555;`;
t.textContent = Math.round(s/60) + 'm';
hdr.appendChild(t);
}
chart.appendChild(hdr);
data.forEach(d => {
const start = new Date(d.start).getTime();
const end = new Date(d.end).getTime();
const left = ((start - runStart)/1000) * PX;
const width = Math.max(3, ((end-start)/1000) * PX);
const row = document.createElement('div');
row.className = 'row';
const lbl = document.createElement('div');
lbl.className = 'label';
lbl.textContent = d.model;
lbl.title = d.model;
const tl = document.createElement('div');
tl.className = 'timeline';
const bar = document.createElement('div');
bar.className = 'bar ' + d.status;
bar.style.left = left + 'px';
bar.style.width = width + 'px';
bar.title = d.model + ' — ' + d.dur.toFixed(1) + 's (' + d.status + ')';
tl.appendChild(bar);
row.appendChild(lbl);
row.appendChild(tl);
chart.appendChild(row);
});
</script>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment