// Capture interview — braindump → interview → approved ticket set (< 2 min) function CaptureScreen({ onDone }) { const DS = window.CommiTeaDesignSystem_20e63b; const { Button, Card, Tag, Badge, Select, Icon } = DS; const [stage, setStage] = React.useState('dump'); // dump | interview | review | filed const [dump, setDump] = React.useState( 'auth is flaky \u2014 token refresh dies silently, sometimes session storage goes stale. ' + 'also the webhook debounce thing keeps double-firing. and we owe docs for auth setup' ); const [qi, setQi] = React.useState(0); const [log, setLog] = React.useState([]); const [split, setSplit] = React.useState(null); const [webEst, setWebEst] = React.useState(null); const [secs, setSecs] = React.useState(0); const running = stage === 'interview' || stage === 'review'; React.useEffect(() => { if (!running) return; const t = setInterval(() => setSecs((s) => s + 1), 1000); return () => clearInterval(t); }, [running]); const clock = `${Math.floor(secs / 60)}:${String(secs % 60).padStart(2, '0')}`; const QUESTIONS = [ { q: 'The auth work \u2014 one ticket, or shall I split token refresh from session storage? They fail differently.', chips: ['One ticket', 'Split them'], set: (a) => setSplit(a === 'Split them') }, { q: 'The webhook double-fire \u2014 how long? I should mention your "quick" has averaged two days.', chips: ['est/1d', 'est/2d', 'est/3d'], set: (a) => setWebEst(a) }, { q: 'Milestone Beta, I presume? It has room, provided the auth work stays under four days.', chips: ['Beta', 'New milestone'], set: () => {} }, ]; const answer = (a) => { QUESTIONS[qi].set(a); setLog((l) => [...l, { q: QUESTIONS[qi].q, a }]); if (qi + 1 < QUESTIONS.length) setQi(qi + 1); else setStage('review'); }; // draft tickets build as the interview progresses const tickets = []; if (split === true) { tickets.push({ title: 'Token refresh: retry with backoff', est: 'est/2d', p: 'p/2' }); tickets.push({ title: 'Session storage: stale reads on wake', est: 'est/1d', p: 'p/3' }); } else if (split === false) { tickets.push({ title: 'Auth: token refresh + session storage', est: 'est/3d', p: 'p/2' }); } if (webEst) tickets.push({ title: 'Webhook debounce: double-fire guard', est: webEst, p: 'p/1', dep: 'blocked by auth work' }); if (stage === 'review' || stage === 'filed') { tickets.push({ title: 'Docs: auth setup guide', est: 'est/1d', p: 'p/4', byReginald: true }); } const totalDays = tickets.reduce((n, t) => n + parseInt(t.est.replace('est/', '')), 0); const estOptions = ['est/1d', 'est/2d', 'est/3d', 'est/5d', 'est/8d'].map((v) => ({ value: v, label: v })); const pOptions = ['p/1', 'p/2', 'p/3', 'p/4'].map((v) => ({ value: v, label: v })); const Tray = ({ editable }) => ( 1 ? 's' : ''}` : 'Empty, for now'} flush>
{tickets.length === 0 ? (

Tickets appear here as we talk.

) : tickets.map((t, i) => (
{t.title}
{editable ? ( <> ) : ( <> )} {t.dep ? {t.dep} : null} {t.byReginald ? added by Reginald : null}
))}
); return (

Capture

braindump → approved tickets

{stage !== 'dump' ? (
120 ? 'var(--warn)' : 'var(--ink-1)' }}>{clock}
budget 2:00
) : null}
{stage === 'dump' ? (

Sentences, fragments, grievances — all welcome. I'll sort it into tickets and only ask what I can't infer.

) : null} {stage === 'interview' ? (
{log.map((e, i) => (
{e.q} {e.a}
))}

{QUESTIONS[qi].q}

{QUESTIONS[qi].chips.map((c) => ( ))}
) : null} {stage === 'review' ? (
}>

Beta's 80% window moves Mar 3–12 → Mar 5–14. Capacity absorbs the rest.

I added the docs ticket you mentioned and wired the dependency. Shall I make it so?

) : null} {stage === 'filed' ? (
Filed

{tickets.length} issues opened in gitea with est/* and p/* labels — nothing else touched.

Elapsed {clock} — under budget. No bot comments, no synthetic issues; your repo remains yours.

) : null}
); } Object.assign(window, { CaptureScreen });