diff --git a/.claude/working-rules.md b/.claude/working-rules.md index 3ac6d2a..fb42dd6 100644 --- a/.claude/working-rules.md +++ b/.claude/working-rules.md @@ -66,6 +66,44 @@ Use a focused commit message. Do not merge or tag unless explicitly requested. +## Non-narration rule + +Claude Code must act as an implementation agent, not narrate its internal +debugging process. + +When tests fail: + +1. inspect the focused failure; +2. make the smallest justified edit; +3. rerun the focused test; +4. repeat until passing or genuinely blocked. + +Do not print or explain intermediate reasoning. + +Never print: + +- rendered HTML; +- full JSON; +- full graph objects; +- large diffs; +- long stack traces; +- repeated interpretations of the same failure. + +Prefer: + +tool → edit → focused test → concise report + +The final chat response must be under 1,000 words and normally contain only: + +- branch; +- commit hash; +- files changed; +- behaviour changed; +- tests; +- lint/build; +- remaining limitation; +- git status. + ## Response discipline At the end of a task, normally report only: diff --git a/app/globals.css b/app/globals.css index e417d16..dbb837d 100644 --- a/app/globals.css +++ b/app/globals.css @@ -7,8 +7,29 @@ to { transform: rotate(360deg); } } +@keyframes fadeIn { + from { opacity: 0; transform: translateY(4px); } + to { opacity: 1; transform: translateY(0); } +} + +.investigation-card { + animation: fadeIn 0.4s ease-out both; +} + +.investigation-card:nth-child(2) { + animation-delay: 0.08s; +} + +.investigation-card:nth-child(3) { + animation-delay: 0.16s; +} + @media (prefers-reduced-motion: reduce) { [style*="animation:spin"] { animation: none !important; } + + .investigation-card { + animation: none; + } } diff --git a/components/reasoning-workspace.jsx b/components/reasoning-workspace.jsx index 640a9ce..c48eab0 100644 --- a/components/reasoning-workspace.jsx +++ b/components/reasoning-workspace.jsx @@ -63,7 +63,7 @@ function ActivitySpinner() { function SituationCard({ centralStatement }) { if (!centralStatement) return null; return ( -
{currentSummary}
We have started to separate what is known from what still needs checking.
@@ -94,110 +94,87 @@ function CurrentUnderstanding({ currentSummary }) { ); } -// ── Current focus card ──────────────────────────────────────── -function CurrentFocus({ graph }) { - if (!graph?.activeUnknownNodeId || !graph.nodes?.length) return null; - - const activeNode = graph.nodes.find( - (n) => n.id === graph.activeUnknownNodeId - ); - if (!activeNode) return null; - - // Find the unknown label that maps to activeUnknownNodeId from selectedQuestion or nodes - const statusText = - activeNode.status === "resolved" ? "Answered" : "Under investigation"; - - return ( -{activeNode.label}
- {activeNode.description && activeNode.description !== activeNode.label && ( -Why it matters: {activeNode.description}
- )} - - {statusText} - -{q}
- We have identified {remainingCount} area{remainingCount === 1 ? "" : "s"} that still need investigation. +
+ We are still building confidence about your situation.{" "} + {remainingCount === 1 + ? "One area remains." + : `${remainingCount} areas remain.`}
) : ( -+
All areas under investigation are now complete.
)} - {graph.activeUnknownNodeId && (() => { - const activeNode = graph.nodes.find((n) => n.id === graph.activeUnknownNodeId); - if (!activeNode) return null; - return ( - <> -{activeNode.label}
- {activeNode.description && activeNode.description !== activeNode.label && ( -Why this matters: {activeNode.description}
- )} - > - ); - })()} - {!graph.activeUnknownNodeId && remainingCount === 0 && ( -There is no active area of investigation at the moment.
+ {activeNode && ( + <> +{activeNode.label}
+ {activeNode.description && activeNode.description !== activeNode.label && ( +Why it matters: {activeNode.description}
+ )} + > + )} + {!activeNode && remainingCount === 0 && ( +There is nothing further to investigate at this time.
)}{message}