…
.th-card:hover{border-color:color-mix(in srgb,var(--indigo) 40%,var(--line))}
.th-card.imp{border-color:var(--rose);box-shadow:inset 3px 0 0 var(--rose)}
-.th-card .th-title{font-size:calc(15px*var(--fz,1));font-weight:600;margin:0;overflow-wrap:anywhere;line-height:1.35}
-.th-card .th-prev{margin:0;color:var(--soft);font-size:calc(14px*var(--fz,1));line-height:1.45;white-space:pre-line;overflow-wrap:anywhere;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3;overflow:hidden}
+.th-card .th-title{font-size:calc(15px*var(--fz,1));font-weight:600;margin:0;overflow-wrap:anywhere;line-height:1.35;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:10;overflow:hidden}
+.th-card .th-ansp{margin:6px 0 0;padding-left:8px;border-left:2px solid var(--line);color:var(--ink);font-size:calc(13.5px*var(--fz,1));line-height:1.45;white-space:pre-line;overflow-wrap:anywhere;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:10;overflow:hidden}
+.th-card .th-prev{margin:0;color:var(--soft);font-size:calc(14px*var(--fz,1));line-height:1.45;white-space:pre-line;overflow-wrap:anywhere;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:9;overflow:hidden}
.th-card .th-meta{display:flex;flex-wrap:wrap;gap:4px 8px;align-items:center;margin-top:4px;font-size:calc(13px*var(--fz,1))}
.th-card .th-tl{color:var(--indigo);text-decoration:none}.th-card .th-tl:hover{text-decoration:underline}
…
const TAGS=/(^|[\s(,;])#[A-Za-z0-9][A-Za-z0-9-]*/g;
const plain=s=>s.replace(/^\s{0,3}(#{1,6}\s+|>\s?|[-*+]\s+(\[[ xX]\]\s+)?|\d+[.)]\s+)/,"").replace(/\[\[([^\]|]+)\|([^\]]+)\]\]/g,"$2").replace(/\[\[([^\]]+)\]\]/g,"$1").replace(/!?\[([^\]]*)\]\([^)]*\)/g,"$1").replace(/(\*\*|__|\*|_|~~|`)(?=\S)([^]*?\S)\1/g,"$2").replace(/`/g,"").trim();
+// a card shows at most 10 lines of the original thought, then the agent's answer (## Done / ## Questions), if any (razie, chat 6ac9ecaa, 2026-10-10)
+const ANS_RE=/^##\s+(Done|Questions)\b/m,split=text=>{const s=String(text).replace(/\r\n/g,"\n"),m=ANS_RE.exec(s);return m?{orig:s.slice(0,m.index),ans:s.slice(m.index)}:{orig:s,ans:""}};
+const ansText=a=>a.split("\n").filter(l=>l.trim()&&l.trim()!==MK.trim()&&!/^\s*(```|---\s*$)/.test(l)).map(l=>plain(l.replace(/^#+\s*/,"")).replace(TAGS,"$1").replace(/\s+/g," ").trim()).filter(Boolean).join("\n").slice(0,700);
+const fit=root=>{for(const c of root.querySelectorAll(".th-card:not(.foc)")){const h=c.querySelector(".th-title"),p=c.querySelector(".th-prev");if(!h||!p)continue;const lh=parseFloat(getComputedStyle(h).lineHeight)||20,n=Math.round(h.getBoundingClientRect().height/lh);p.style.webkitLineClamp=String(Math.max(0,10-n));p.hidden=n>=10}};
const parts=text=>{const ls=String(text).replace(/\r\n/g,"\n").split("\n").filter(l=>l.trim()&&!/^\s*(```|---\s*$)/.test(l)),f=plain(ls[0]||""),title=f.replace(TAGS,"$1").replace(/\s+/g," ").trim()||f;
return {title,preview:ls.slice(1,14).map(l=>plain(l).replace(TAGS,"$1").replace(/\s+/g," ").trim()).filter(Boolean).join("\n").slice(0,700)}};
…
// ---- drawing ----
function cardHtml(t,as="other"){byKey.set(key(t),t);if(FLOW&&has(t,"focus"))return focusCard(t);
-const {title,preview}=parts(t.text),k=key(t),thread=has(t,"thread"),sent=has(t,"sent"),working=has(t,"working"),ans=isAns(t);
+const sp=split(t.text),{title,preview}=parts(sp.orig),ansT=sp.ans?ansText(sp.ans):"",k=key(t),thread=has(t,"thread"),sent=has(t,"sent"),working=has(t,"working"),ans=isAns(t);
const tags=t.tags.filter(g=>g!=="archive").map(g=>`<a class="th-tl${FLOWT.has(g)?" th-st t-"+g:""}" href="#" data-tagnav="${esc(g)}">#${esc(g)}</a>`).join("");
const boxed=FLOW&&(as==="streak"||(as==="thread"&&!arch(t)&&!sent&&!working)||(as==="other"&&!["archive","thread","sent","working"].some(g=>has(t,g))));
…
const inF=FLOW&&t.in&&t.in.length?t.in.map(f=>`<a class="th-infocus" href="#" data-go="${esc(viewHrefOf(f.key))}">${esc(f.title)}</a>`).join(""):"";
return `<article class="th-card${has(t,"important")?" imp":""}${ans?" ask":""}${FLOW&&working?" working":FLOW&&sent?" sent":""}" data-key="${esc(k)}" data-ver="${t.ver}">
-<h3 class="th-title">${tick}${esc(title)}</h3>${preview?`<p class="th-prev">${esc(preview)}</p>`:""}${wait}
+<h3 class="th-title">${tick}${esc(title)}</h3>${preview?`<p class="th-prev">${esc(preview)}</p>`:""}${ansT?`<p class="th-ansp">↳ ${esc(ansT)}</p>`:""}${wait}
<div class="th-meta">${gochip}${tags}${inF}${Q.project?"":`<span class="th-chip th-proj">${esc(t.project)}</span>`}<span class="th-date" title="${esc(t.created)}">${day(t.created)}</span></div></article>`}
function focusCard(t){const n=t.focus,h=viewHref(t.name,t.project),{title}=parts(t.text||"");
…
+(Q.q?`<p class="small th-qline"><span>Matching “${esc(Q.q)}”</span><a href="#" data-nav="${esc(JSON.stringify({q:""}))}">Show all</a></p>`:"")
+(FLOW&&f&&(f.waiting+f.working+f.answered)?`<p class="small th-flowc" id="th-flowc"><b>${f.waiting}</b> waiting · <b>${f.working}</b> being worked on · <b>${f.answered}</b> answered</p>`:"");
-$("#th-body").innerHTML=listHtml();
+$("#th-body").innerHTML=listHtml();fit($("#th-body"));
$("#th-more").innerHTML=next?`<button type="button" class="btn sm" id="th-older">More</button>`:"";
if(flash)$$("#th-body .th-card[data-key]").forEach(c=>{if(flash===true?was.size&&was.get(c.dataset.key)!==c.dataset.ver:c.dataset.key===flash){c.classList.remove("th-flash");void c.offsetWidth;c.classList.add("th-flash")}});
…
if("IntersectionObserver" in window)new IntersectionObserver(es=>{if(es.some(x=>x.isIntersecting))more()},{rootMargin:"400px"}).observe($("#th-more"));
Object.assign(window.d2th,{edit:c=>edit(typeof c==="string"?$(`.th-card[data-key="${c}"]`):c),maximize,tick,load,nav,openConcept,state:()=>({Q,next,n:cards.length,skip,flow:FLOW,to,ed:ed&&ed.k,pop:pop&&pop.k,concept:concept&&concept.id})});
+new MutationObserver(()=>fit($("#th-body"))).observe($("#th-body"),{childList:true,subtree:true});addEventListener("resize",()=>fit($("#th-body")));
load().then(()=>{if(PARAMS.concept)openConcept(/^[cf]:/.test(PARAMS.concept)?PARAMS.concept:"x:"+encodeURIComponent(PARAMS.concept))}).catch(e=>{$("#th-body").innerHTML=`<p class="bad">Your thoughts didn't load: ${esc(msgOf(e))}</p><p><button type="button" class="btn sm" id="th-retry">Try again</button></p>`;$("#th-retry").onclick=()=>location.reload()});
})();
…