<meta charset="utf-8">
<title>confer · code — range biography (future / exploratory)</title>
<style>
:root{
--bg:#1a1b26;--bg-deep:#16161e;--surface:#1f2335;--surface-2:#24283b;--panel:#1c2030;
--highlight:#292e42;--border:#2b3050;--border-soft:#222741;
--fg:#c0caf5;--fg-dim:#a9b1d6;--muted:#565f89;--muted-2:#414868;
--teal:#2ac3de;--cyan:#7dcfff;--blue:#7aa2f7;--green:#9ece6a;--yellow:#e0af68;--orange:#ff9e64;--red:#f7768e;--magenta:#bb9af7;--accent:#7dcfff;
--open:#7dcfff;--note:#2ac3de;--attn:#e0af68;--stuck:#f7768e;--done:#565f89;--head:#9ece6a;--pinned:#e0af68;
--add:#9ece6a;--del:#f7768e;
--phi1:1rem;--phi2:1.618rem;--phi3:2.618rem;--phi4:4.236rem;
--font-sans:ui-sans-serif,system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;
--font-mono:ui-monospace,"SF Mono","JetBrains Mono",Menlo,Consolas,monospace;
--shadow-sh:0 1px 0 rgba(255,255,255,.02),0 12px 34px -14px rgba(0,0,0,.65);--maxw:760px;
}
@media (prefers-color-scheme:light){:root{
--bg:#e1e2e7;--bg-deep:#d4d6de;--surface:#eaebef;--surface-2:#dcdee6;--panel:#e6e7ee;
--highlight:#cbcdd8;--border:#b3b7c7;--border-soft:#c6c9d6;--fg:#2f3550;--fg-dim:#444b6b;--muted:#7a80a0;--muted-2:#9aa0bd;
--teal:#0f7c93;--cyan:#2959aa;--blue:#2e5db5;--green:#4f6d2e;--yellow:#8a6c2f;--orange:#b15c00;--red:#d81f57;--magenta:#7b41d6;--accent:#2959aa;
--open:#2959aa;--note:#0f7c93;--attn:#8a6c2f;--stuck:#d81f57;--done:#7a80a0;--head:#4f6d2e;--pinned:#8a6c2f;--add:#4f6d2e;--del:#d81f57;
--shadow-sh:0 1px 0 rgba(255,255,255,.5),0 12px 34px -16px rgba(40,50,90,.35);
}}
:root[data-theme="dark"]{--bg:#1a1b26;--bg-deep:#16161e;--surface:#1f2335;--surface-2:#24283b;--panel:#1c2030;--highlight:#292e42;--border:#2b3050;--border-soft:#222741;--fg:#c0caf5;--fg-dim:#a9b1d6;--muted:#565f89;--muted-2:#414868;--teal:#2ac3de;--cyan:#7dcfff;--green:#9ece6a;--yellow:#e0af68;--red:#f7768e;--accent:#7dcfff;--open:#7dcfff;--note:#2ac3de;--attn:#e0af68;--stuck:#f7768e;--done:#565f89;--head:#9ece6a;--pinned:#e0af68;--add:#9ece6a;--del:#f7768e;}
:root[data-theme="light"]{--bg:#e1e2e7;--bg-deep:#d4d6de;--surface:#eaebef;--surface-2:#dcdee6;--panel:#e6e7ee;--highlight:#cbcdd8;--border:#b3b7c7;--border-soft:#c6c9d6;--fg:#2f3550;--fg-dim:#444b6b;--muted:#7a80a0;--muted-2:#9aa0bd;--teal:#0f7c93;--cyan:#2959aa;--green:#4f6d2e;--yellow:#8a6c2f;--red:#d81f57;--accent:#2959aa;--open:#2959aa;--note:#0f7c93;--attn:#8a6c2f;--stuck:#d81f57;--done:#7a80a0;--head:#4f6d2e;--pinned:#8a6c2f;--add:#4f6d2e;--del:#d81f57;}
*{box-sizing:border-box}
body{margin:0;background:var(--bg);color:var(--fg);font-family:var(--font-sans);line-height:1.5;-webkit-font-smoothing:antialiased}
.wrap{max-width:var(--maxw);margin:0 auto;padding:var(--phi3) var(--phi2) var(--phi4)}
.mono{font-family:var(--font-mono)}
.flag{display:inline-flex;align-items:center;gap:.4rem;font-family:var(--font-mono);font-size:.62rem;color:var(--attn);border:1px dashed color-mix(in srgb,var(--attn) 45%,transparent);border-radius:999px;padding:.14rem .6rem;margin-bottom:var(--phi1)}
.intro h1{font-size:1.5rem;font-weight:650;letter-spacing:-.01em;margin:.2rem 0 .4rem;text-wrap:balance}
.intro p{color:var(--fg-dim);max-width:64ch;margin:0 0 var(--phi2);font-size:.95rem}
.screen{background:var(--bg-deep);border:1px solid var(--border);border-radius:14px;box-shadow:var(--shadow-sh);overflow:hidden}
.bh{display:flex;align-items:center;gap:.55rem;padding:.7rem .9rem;background:var(--surface);border-bottom:1px solid var(--border);flex-wrap:wrap}
.bh .subj{font-family:var(--font-mono);font-size:.82rem;font-weight:640;color:var(--fg)}
.bh .subj .rng{color:var(--open)}
.bh .meta{font-family:var(--font-mono);font-size:.64rem;color:var(--muted)}
.bh .back{margin-left:auto;font-family:var(--font-mono);font-size:.62rem;color:var(--accent);cursor:pointer}
.tlbody{padding:.4rem 0 1rem}
.row{position:relative;padding:.6rem 1.1rem .6rem 2.5rem}
.row::before{content:"";position:absolute;left:1.35rem;top:0;bottom:0;width:2px;background:var(--border)}
.row:first-child::before{top:1.2rem} .row:last-child::before{bottom:calc(100% - 1.2rem)}
.dot{position:absolute;left:.95rem;top:1rem;width:.8rem;height:.8rem;border-radius:50%;border:2px solid var(--bg-deep);z-index:1}
.dot.q{background:var(--open)} .dot.n{background:var(--note)} .dot.chg{background:var(--pinned)} .dot.done{background:var(--done)}
.msg .mh{display:flex;align-items:center;gap:.45rem;margin-bottom:.3rem}
.msg .av{width:1.2rem;height:1.2rem;border-radius:5px;display:grid;place-items:center;font:700 .56rem var(--font-mono);color:#12131a}
.msg .who{font-size:.8rem;font-weight:620;color:var(--fg)}
.msg .kind{font-family:var(--font-mono);font-size:.52rem;font-weight:700;text-transform:uppercase;letter-spacing:.04em;border:1px solid color-mix(in srgb,var(--kc,var(--open)) 42%,transparent);color:var(--kc,var(--open));border-radius:4px;padding:.02rem .3rem}
.msg.q .kind{--kc:var(--open)} .msg.n .kind{--kc:var(--note)}
.msg .ts{margin-left:auto;font-family:var(--font-mono);font-size:.6rem;color:var(--muted)}
.msg .body{font-size:.82rem;color:var(--fg-dim);line-height:1.5}
.msg .body code{font-family:var(--font-mono);font-size:.74rem;background:var(--panel);padding:.02rem .3rem;border-radius:4px;color:var(--teal)}
.blob{margin-top:.5rem;background:var(--panel);border:1px solid var(--border);border-left:2.5px solid var(--open);border-radius:0 8px 8px 0;overflow:hidden}
.blob .blh{display:flex;align-items:center;gap:.5rem;padding:.25rem .6rem;background:color-mix(in srgb,var(--open) 8%,transparent);border-bottom:1px solid var(--border-soft)}
.blob .blh .p{font-family:var(--font-mono);font-size:.6rem;color:var(--fg-dim)}
.blob .blh .sha{margin-left:auto;font-family:var(--font-mono);font-size:.58rem;color:var(--open)}
.blob pre{margin:0;padding:.4rem .6rem;font:500 11.5px/1.6 var(--font-mono);color:var(--fg);overflow-x:auto}
.blob .l{color:var(--muted-2);margin-right:.7rem;user-select:none}
.k{color:var(--magenta)} .fn{color:var(--blue)} .s{color:var(--green)} .c{color:var(--muted);font-style:italic} .ty{color:var(--teal)}
.change{margin-top:.2rem}
.change .chh{display:flex;align-items:center;gap:.45rem;font-family:var(--font-mono);font-size:.62rem;color:var(--pinned);margin-bottom:.3rem}
.change .chh .patch{color:var(--fg-dim)}
.diff{background:var(--panel);border:1px solid var(--border);border-radius:8px;overflow:hidden;font:500 11.5px/1.6 var(--font-mono)}
.diff .dl{display:flex;padding:0 .6rem;white-space:pre}
.diff .dl .sign{width:1rem;flex:0 0 auto;color:var(--muted)}
.diff .dl.add{background:color-mix(in srgb,var(--add) 12%,transparent)}
.diff .dl.add .sign{color:var(--add)} .diff .dl.add .t{color:color-mix(in srgb,var(--add) 78%,var(--fg))}
.diff .dl.del{background:color-mix(in srgb,var(--del) 12%,transparent)}
.diff .dl.del .sign{color:var(--del)} .diff .dl.del .t{color:color-mix(in srgb,var(--del) 78%,var(--fg))}
.diff .dl.ctx .t{color:var(--muted)}
.foot{margin-top:var(--phi2);padding:var(--phi1) var(--phi2);background:var(--surface);border:1px solid var(--border);border-radius:12px;font-size:.82rem;color:var(--fg-dim);line-height:1.55}
.foot b{color:var(--fg)}
</style>
<div class="wrap">
<span class="flag">◷ future / exploratory · not in today's build</span>
<div class="intro">
<h1>Range biography — one blob of code, everything ever said about it</h1>
<p>The "zoom in" from the file view's sidebar timeline. A single range becomes the spine; every conversation
about it — <b>across all threads</b> — reads in time order, the code embedded <b>as it was at each point</b>,
and the <b>changes</b> the discussion drove shown as diffs between versions. It's the thread view turned 90°:
subject-first instead of topic-first.</p>
</div>
<div class="screen">
<div class="bh">
<span class="subj">refcode.rs<span class="rng">:267–285</span> · snippet()</span>
<span class="meta">4 conversations · 2 threads · 3 versions · Jun 28 → Jul 13</span>
<span class="back">↩ back to file</span>
</div>
<div class="tlbody">
<div class="row msg q">
<span class="dot q"></span>
<div class="mh"><span class="av" style="background:var(--cyan)">HE</span><span class="who">Herald</span><span class="kind">request</span><span class="ts">Jun 28 · #tooling</span></div>
<div class="body">The <code>snippet()</code> reader slurps the whole blob before slicing. On a big generated file that's
wasteful — can it size-guard first?</div>
<div class="blob">
<div class="blh"><span class="p">refcode.rs:267–279</span><span class="sha">◷ 3f9c1 · Jun 28</span></div>
<pre><span class="l">274</span> <span class="k">let</span> dir = clone?;
<span class="l">275</span> <span class="k">let</span> spec = <span class="fn">format!</span>(<span class="s">"{sha}:{path}"</span>);
<span class="l">276</span> <span class="k">let</span> o = gitcmd::<span class="fn">output</span>(dir, &[<span class="s">"cat-file"</span>,<span class="s">"-p"</span>,&spec])?; <span class="c">// reads it ALL</span></pre>
</div>
</div>
<div class="row change">
<span class="dot chg"></span>
<div class="chh">◷ code changed <span class="patch">· patch 5A2C by Jarvis · Jul 2 · landed a41f0c2</span></div>
<div class="diff">
<div class="dl ctx"><span class="sign"> </span><span class="t"> let spec = format!("{sha}:{path}");</span></div>
<div class="dl add"><span class="sign">+</span><span class="t"> let szo = gitcmd::output(dir, &["cat-file","-s",&spec]).ok()?; // size FIRST</span></div>
<div class="dl add"><span class="sign">+</span><span class="t"> if szo.parse::<u64>()? > 2_000_000 { return None; } // >2MB → pointer-only</span></div>
<div class="dl ctx"><span class="sign"> </span><span class="t"> let o = gitcmd::output(dir, &["cat-file","-p",&spec])?;</span></div>
</div>
</div>
<div class="row msg n">
<span class="dot n"></span>
<div class="mh"><span class="av" style="background:var(--green)">JV</span><span class="who">Jarvis</span><span class="kind">note</span><span class="ts">Jul 12 · #review-080</span></div>
<div class="body">Done — guards on <code>cat-file -s</code> before reading. This is also the point-in-time read that makes
"what the agent referenced" reproducible.</div>
<div class="blob">
<div class="blh"><span class="p">refcode.rs:275–285</span><span class="sha" style="color:var(--head)">● a41f0c2 · this · now</span></div>
<pre><span class="l">276</span> <span class="c">// Size guard BEFORE reading — don't slurp a huge blob.</span>
<span class="l">277</span> <span class="k">let</span> szo = gitcmd::<span class="fn">output</span>(dir, &[<span class="s">"cat-file"</span>,<span class="s">"-s"</span>,&spec])?;
<span class="l">285</span> <span class="k">let</span> o = gitcmd::<span class="fn">output</span>(dir, &[<span class="s">"cat-file"</span>,<span class="s">"-p"</span>,&spec])?;</pre>
</div>
</div>
<div class="row msg q">
<span class="dot q"></span>
<div class="mh"><span class="av" style="background:var(--cyan)">HE</span><span class="who">Herald</span><span class="kind">request</span><span class="ts">Jul 13 · #review-080</span></div>
<div class="body">Make the 2MB ceiling configurable? Filed <code>7K2P9Q</code> — <span style="color:var(--green)">● in flight</span>.</div>
</div>
</div>
</div>
<div class="foot">
<b>Why it's a distinct view, not the thread view.</b> The thread view is topic-first — a channel's stream, code
embedded as refs. This is <b>subject-first</b>: one code range as the spine, its whole cross-thread discussion +
version history, with the diffs the discussion drove. <b>Recommendation:</b> don't build it today — the file
view's sidebar timeline (piece 12) is its MVP and its entry point ("expand this range →"). We graduate to this
full view later, if a hotly-revised range proves the need. Reuses everything we already have: refs pin code at
shas, patches carry the diffs, the composable message/code cards render the entries.
</div>
</div>