工作日志:一行摆首句,展开就把话说完

从前一条只有一行标题,而人真想回看的东西全躺在留痕里没露过面 ——
凭什么算这一步办完了、那一笔落下哪几行、被拒到底拒在哪儿、发的是哪种卡送到哪儿。
现在每条可展开,细节由 detailOf 摘成**一句句人话**(不摆 execution 这类内部名);
摘不出就是空数组,前端据此不给展开钮 —— 点开是空抽屉比不给还糟。

不摆二级条目(用户定):细节不是「键:值」两栏 —— 那是把留痕的字段名搬到人面前,
人还得自己在脑子里连成句子。每句自带主语与语境,单拎出来也读得通。

连带修一处文档与实现不符:「一轮一句」的口径说埋头办事那几拍的交代「留进工作日志」,
而实现把 internal 整类滤掉了,那几句哪儿都看不到。现在带交代的放行,
章写「交代进展」、记在 AI 名下;排障用的内部痕照旧不摆。
两种交代统一「首句上行、全文进抽屉」,一句话说完的不重复摆;截了才加省略号。

契约:任务详情的日志行新增可选 detail(字符串数组),api-report 同批更新。
门禁:typecheck / lint / depcruise / test(1378)全绿;浏览器实测折叠行高 34-36px 齐平、
展开无键值两栏残留。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-03 13:10:46 +08:00
co-authored by Claude Opus 5
parent ade0fa5a94
commit 70e83d0b09
8 changed files with 352 additions and 16 deletions
@@ -427,16 +427,7 @@ export function ViewRegion({ detail, onReplyOrder, values, onField, locate }: Vi
* (自主率要把「等外面」与「机器干的」分开);人扫这一屏只问
* 「这一步是我办的、AI 办的,还是流程自己走到的」。
*/
<div key={line.id} className={'jc-log-row t-' + line.who}>
<span className="jc-log-at jc-mono">{atMinute(line.at)}</span>
{/* 章摆的是**动作**(四字,与对话区同词),不是归侧 ——
归侧仍在 `t-${side}` 的配色里,度量也照旧靠它 */}
<span className="jc-log-side">{line.action}</span>
<span className="jc-log-t">
<b>{line.title}</b>
{line.summary !== undefined && <em>{line.summary}</em>}
</span>
</div>
<LogRow key={line.id} line={line} />
))}
</div>
) : (
@@ -652,6 +643,53 @@ export function ViewRegion({ detail, onReplyOrder, values, onField, locate }: Vi
* 涟漪说「环在转」,微光工作线说「报告正在一行行写出来」;
* 都是纯 CSS、只动 transform/opacity,prefers-reduced-motion 下静止但状态仍可读。
*/
/**
* 日志一行 —— **折叠时一行,展开才看细节**(2026-08-03 用户:「细节展开不够好」)。
*
* 这一屏的用法是**扫**:一眼看完这单走过哪几步、谁办的。所以密度不能破 ——
* 细节收进抽屉,想深究哪一条点哪一条。**没有细节的条目不给展开钮**:
* 摆一个点开是空的抽屉,比不给还糟(点一次才知道白点)。
*
* 展开不做动画高度:日志动辄几十条,一条一个过渡就是一屏都在抖。
*/
function LogRow({ line }: { line: TaskDetail['log'][number] }) {
const [open, setOpen] = useState(false);
const has = line.detail.length > 0;
return (
<div className={'jc-log-row t-' + line.who + (open ? ' on' : '')}>
<span className="jc-log-at jc-mono">{atMinute(line.at)}</span>
{/* 章摆的是**动作**(四字,与对话区同词),不是归侧 ——
归侧仍在 `t-${side}` 的配色里,度量也照旧靠它 */}
<span className="jc-log-side">{line.action}</span>
<span className="jc-log-t">
{has ? (
<button type="button" className="jc-log-more" onClick={() => setOpen(!open)} aria-expanded={open}>
<b>{line.title}</b>
<Ico name={open ? 'chevron-down' : 'chevron-right'} s={13} />
</button>
) : (
<b>{line.title}</b>
)}
{line.summary !== undefined && <em>{line.summary}</em>}
{/*
* **展开就是把话说完,不摆二级条目**(2026-08-03 用户定)。
*
* 从前展开出来是一摞「键:值」—— 那是把留痕的字段名搬到人面前,
* 人还得自己在脑子里把它们连成一句话。日志是给人读的:
* 该说的直接写成正文,一段说完;真有两三样要说的,一样一段。
*/}
{open && (
<div className="jc-log-body">
{line.detail.map((text, i) => (
<p key={i}>{text}</p>
))}
</div>
)}
</span>
</div>
);
}
function WorkingScene({ doneN }: { doneN: number }) {
return (
<div className="jc-working" aria-live="polite">