|
<!DOCTYPE html> |
|
<html lang="en"> |
|
<head> |
|
<meta charset="utf-8"> |
|
<meta name="viewport" content="width=device-width, initial-scale=1"> |
|
<title>Session Report — TITLE (DATE)</title> |
|
<!-- |
|
session-report template. Copy this <style> block verbatim into every report. |
|
Fill the body from the component blocks below (search "COMPONENT:"). |
|
Self-contained: inline CSS + inline SVG only, no network dependencies. |
|
--> |
|
<style> |
|
:root { |
|
--bg:#0f1117; --panel:#171a23; --panel2:#1e222d; --ink:#e6e9ef; --muted:#9aa3b2; |
|
--line:#2a2f3c; --accent:#6ea8fe; --good:#57d38c; --warn:#e6b455; --bad:#e6685c; |
|
--code:#0b0d12; --chip:#232838; |
|
/* categorical palette (validated in components.md; swap for brand if desired) */ |
|
--c1:#6ea8fe; --c2:#8fe0b0; --c3:#e6b455; --c4:#c7a8ff; --c5:#e6685c; --c6:#5fd0d6; |
|
} |
|
* { box-sizing:border-box; } |
|
body { margin:0; background:var(--bg); color:var(--ink); |
|
font:15px/1.6 -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif; } |
|
.wrap { max-width:960px; margin:0 auto; padding:40px 24px 80px; } |
|
h1 { font-size:28px; margin:0 0 6px; letter-spacing:-.01em; } |
|
h2 { font-size:20px; margin:44px 0 14px; padding-bottom:8px; border-bottom:1px solid var(--line); } |
|
h3 { font-size:16px; margin:0 0 4px; } |
|
.sub { color:var(--muted); margin:0 0 4px; } |
|
a { color:var(--accent); text-decoration:none; } a:hover { text-decoration:underline; } |
|
code { background:var(--code); border:1px solid var(--line); border-radius:4px; padding:1px 5px; |
|
font:13px/1.4 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace; color:#cdd6e4; } |
|
pre { background:var(--code); border:1px solid var(--line); border-radius:8px; padding:14px 16px; |
|
overflow:auto; font:12.5px/1.5 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace; color:#cdd6e4; } |
|
.meta { display:flex; flex-wrap:wrap; gap:8px; margin:16px 0 8px; } |
|
.chip { background:var(--chip); border:1px solid var(--line); border-radius:999px; padding:3px 11px; |
|
font-size:12.5px; color:var(--muted); } |
|
.lead { background:var(--panel); border:1px solid var(--line); border-left:3px solid var(--accent); |
|
border-radius:8px; padding:16px 18px; margin:20px 0; } |
|
.step { background:var(--panel); border:1px solid var(--line); border-radius:10px; padding:18px 20px; margin:0 0 16px; } |
|
.step .n { display:inline-block; min-width:26px; height:26px; line-height:26px; text-align:center; |
|
background:var(--accent); color:#0b0d12; border-radius:6px; font-weight:700; font-size:13px; margin-right:8px; } |
|
.grid { display:grid; grid-template-columns:120px 1fr; gap:6px 14px; margin-top:12px; } |
|
.grid .k { color:var(--muted); font-size:12.5px; text-transform:uppercase; letter-spacing:.04em; padding-top:2px; } |
|
.grid .v { margin:0; } .grid .v ul { margin:0; padding-left:18px; } |
|
.toolcard { background:var(--panel2); border:1px solid var(--line); border-radius:10px; padding:16px 18px; margin:0 0 14px; } |
|
.toolcard .name { font-weight:700; } .toolcard .name code { font-size:12.5px; } |
|
.toolcard .why { color:var(--ink); margin:6px 0 10px; } |
|
.falsestart { background:rgba(230,104,92,.08); border:1px solid rgba(230,104,92,.35); border-left:3px solid var(--bad); |
|
border-radius:0 6px 6px 0; padding:8px 12px; margin:8px 0; font-size:14px; } |
|
.falsestart b { color:var(--bad); } |
|
.outcome { background:rgba(87,211,140,.08); border-left:3px solid var(--good); border-radius:0 6px 6px 0; |
|
padding:8px 12px; margin:8px 0 0; font-size:14px; } .outcome b { color:var(--good); } |
|
.learn { background:var(--panel2); border:1px solid var(--line); border-left:3px solid var(--warn); |
|
border-radius:0 6px 6px 0; padding:10px 14px; margin-top:12px; font-size:14px; } .learn b { color:var(--warn); } |
|
.tools { display:flex; flex-wrap:wrap; gap:6px; } |
|
.tool { background:var(--panel2); border:1px solid var(--line); border-radius:6px; padding:2px 8px; |
|
font:12px ui-monospace,monospace; color:#b9c2d0; } |
|
figure { margin:18px 0; } figcaption { color:var(--muted); font-size:12.5px; margin-top:6px; text-align:center; } |
|
.diagram { background:var(--panel); border:1px solid var(--line); border-radius:10px; padding:18px; } |
|
.good { color:var(--good); } .bad { color:var(--bad); } .warn { color:var(--warn); } |
|
table { border-collapse:collapse; width:100%; margin:8px 0; font-size:13.5px; } |
|
th,td { border:1px solid var(--line); padding:7px 10px; text-align:left; vertical-align:top; } |
|
th { background:var(--panel2); color:var(--muted); font-weight:600; } |
|
.bar { display:flex; align-items:center; gap:10px; margin:5px 0; font-size:13px; } |
|
.bar .lbl { width:150px; color:var(--muted); text-align:right; } |
|
.bar .track { flex:1; background:var(--code); border-radius:5px; overflow:hidden; height:16px; } |
|
/* display:block is load-bearing: .fill is a span, and width is IGNORED on |
|
inline elements — without it every bar renders empty (found via a real |
|
render-verify pass; markup review does not catch this). */ |
|
.bar .fill { display:block; height:100%; border-radius:5px; } |
|
footer { margin-top:40px; color:var(--muted); font-size:12.5px; border-top:1px solid var(--line); padding-top:16px; } |
|
/* svg diagram helpers */ |
|
.node { fill:var(--panel2); stroke:var(--line); } .node.hot { stroke:var(--bad); stroke-width:2; } |
|
.nlabel { fill:var(--ink); font:12px -apple-system,sans-serif; } .nsub { fill:var(--muted); font:10px ui-monospace,monospace; } |
|
.edge { stroke:var(--muted); stroke-width:1.5; fill:none; marker-end:url(#arrow); } |
|
.edge.hot { stroke:var(--bad); } |
|
</style> |
|
</head> |
|
<body> |
|
<div class="wrap"> |
|
|
|
<!-- COMPONENT: header --> |
|
<h1>Session Report — TITLE</h1> |
|
<p class="sub">One-line subtitle / scope</p> |
|
<div class="meta"> |
|
<span class="chip">Date: YYYY-MM-DD</span> |
|
<span class="chip">Env: ...</span> |
|
<span class="chip">Outcome: ...</span> |
|
</div> |
|
|
|
<!-- COMPONENT: lead/summary --> |
|
<div class="lead"><b>Summary.</b> What the session was, and how it ended.</div> |
|
|
|
<h2>Timeline</h2> |
|
|
|
<!-- COMPONENT: timeline step --> |
|
<div class="step"> |
|
<h3><span class="n">1</span> Step title</h3> |
|
<div class="grid"> |
|
<div class="k">Problem</div><div class="v">What was wrong / the goal.</div> |
|
<div class="k">Action</div><div class="v">What was investigated or done.</div> |
|
<div class="k">Finding</div><div class="v">What was learned.</div> |
|
<div class="k">Tools</div><div class="v"><span class="tools"><span class="tool">tool-a</span><span class="tool">tool-b</span></span></div> |
|
</div> |
|
<div class="learn"><b>Architecture learning.</b> An insight this step surfaced.</div> |
|
</div> |
|
|
|
<h2>Tool-use log</h2> |
|
|
|
<!-- COMPONENT: toolcard (detailed: why, false starts, commands, outcome) --> |
|
<div class="toolcard"> |
|
<div class="name">Tool: <code>tool-name</code></div> |
|
<p class="why"><b>Why this tool:</b> the reasoning for choosing it over alternatives.</p> |
|
<div class="falsestart"><b>False start:</b> what was tried first, and why it failed (wrong assumption / env quirk / auth / schema drift).</div> |
|
<pre># the actual command(s) exercised, verbatim (redact secrets) |
|
tool-name --flag value</pre> |
|
<div class="outcome"><b>Outcome:</b> what it produced and how it moved things forward.</div> |
|
</div> |
|
|
|
<h2>Architecture exercised</h2> |
|
|
|
<!-- COMPONENT: svg architecture diagram (nodes + edges; mark the failure node .hot) --> |
|
<figure> |
|
<div class="diagram"> |
|
<svg viewBox="0 0 720 200" width="100%" role="img" aria-labelledby="d1t d1d"> |
|
<title id="d1t">Component flow</title> |
|
<desc id="d1d">Trigger to worker to datastore; the worker node is where the failure lived.</desc> |
|
<defs> |
|
<marker id="arrow" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"> |
|
<path d="M0,0 L10,5 L0,10 z" fill="#9aa3b2"/> |
|
</marker> |
|
</defs> |
|
<g> |
|
<rect class="node" x="20" y="70" width="150" height="60" rx="8"/> |
|
<text class="nlabel" x="95" y="96" text-anchor="middle">Trigger</text> |
|
<text class="nsub" x="95" y="114" text-anchor="middle">event source</text> |
|
|
|
<rect class="node hot" x="285" y="70" width="150" height="60" rx="8"/> |
|
<text class="nlabel" x="360" y="96" text-anchor="middle">Worker</text> |
|
<text class="nsub" x="360" y="114" text-anchor="middle">stalled here</text> |
|
|
|
<rect class="node" x="550" y="70" width="150" height="60" rx="8"/> |
|
<text class="nlabel" x="625" y="96" text-anchor="middle">Datastore</text> |
|
<text class="nsub" x="625" y="114" text-anchor="middle">state</text> |
|
|
|
<path class="edge hot" d="M170,100 L285,100"/> |
|
<path class="edge" d="M435,100 L550,100"/> |
|
</g> |
|
</svg> |
|
</div> |
|
<figcaption>Figure 1 — component flow; red = where the failure lived.</figcaption> |
|
</figure> |
|
|
|
<h2>By the numbers</h2> |
|
|
|
<!-- COMPONENT: horizontal bar chart (CSS; use palette vars for series color) --> |
|
<div class="bar"><span class="lbl">Phase A</span><span class="track"><span class="fill" style="width:70%;background:var(--c1)"></span></span><span>7</span></div> |
|
<div class="bar"><span class="lbl">Phase B</span><span class="track"><span class="fill" style="width:40%;background:var(--c2)"></span></span><span>4</span></div> |
|
<div class="bar"><span class="lbl">Phase C</span><span class="track"><span class="fill" style="width:20%;background:var(--c3)"></span></span><span>2</span></div> |
|
|
|
<h2>Root causes & alternative architectures</h2> |
|
<table> |
|
<tr><th>Symptom</th><th>Root cause</th><th>Alternative architecture</th></tr> |
|
<tr><td>...</td><td>...</td><td>...</td></tr> |
|
</table> |
|
|
|
<h2>Overall observations</h2> |
|
<ul> |
|
<li>Cross-cutting theme for the whole session.</li> |
|
</ul> |
|
|
|
<footer>Generated YYYY-MM-DD. Companion: <code><name>.md</code>.</footer> |
|
|
|
</div> |
|
</body> |
|
</html> |