// 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 }) => (
Tickets appear here as we talk.
braindump → approved tickets
Sentences, fragments, grievances — all welcome. I'll sort it into tickets and only ask what I can't infer.
{QUESTIONS[qi].q}
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?
{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.