Uh oh!
There was an error while loading. Please reload this page.
Replace self-update with local history; rename apiclient to transport - #16
Replace self-update with local history; rename apiclient to transport#16LarssonSv wants to merge 1 commit into
Conversation
- Rename internal/apiclient to internal/transport; add transport.OpenSettings so the login flow no longer wires the browser hop itself - Remove the self-update machinery (internal/selfupdate, abstr upgrade, the background release check) — installs are owned by the installer now - Add internal/history: a local, size-capped log of buffered exchanges, with an abstr history command (list/path/clear) - Config: drop auto_upgrade/update bookkeeping; add browser_command and history_limit (env: ABSTR_BROWSER, ABSTR_HISTORY) - Render: replace Errorf with Success; browser opens honour browser_command Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
Change Summary
This PR adds authenticated workspace chat transport and local conversation history while removing the CLI self-update workflow.
Areas touched:
- Added authenticated workspace, review, chat, buffered-ask, streaming-ask, and SSE handling through Client.
- Added bounded local exchange persistence and
historylist, path, and clear commands through Store. - Replaced upgrade settings with browser-command and history-limit resolution in Config.
- Updated replModel to resume chats, restore pull-request scope, and replay readable transcript turns.
- Centralized terminal Markdown, color, diagnostics, and agent-output routing through Renderer.
How to review:
- Trace the streaming handoff from AskStream to startTurn, including output, status, conversation, and completion messages.
- Verify chat loading and resumeConversation preserve session identifiers, pull-request context, transcript ordering, and unreadable-exchange handling.
- Check first-use authentication and workspace selection through ensureConfigured, including retry, cancellation, and non-blocking configuration saves.
- Confirm successful one-shot requests record history before terminal or piped output, without changing the command’s exit status.
Review
Two real bugs — block on fixes.
Checks
| Check | Status | Details |
|---|---|---|
| Test code must not be reachable from production | ✅ Success | all assertions passed |
| Controllers must not access the database directly | ✅ Success | all assertions passed |
| Sensitive personal data should not flow into logs | 4 elements match | |
| Credentials should not flow into logs | 35 elements match |
Affected Concepts
- CLI Commands & REPL
- API Client
- Support Utilities (Update, Render, Config, Browser, Entry)
- abstraction-dev/cli
- Abstraction
Reviewed deccac2 · 2026-08-21 09:04 UTC
| // Append records one exchange, trimming the file to the newest limit entries. | ||
| // A blank question or answer is dropped: a cancelled turn is not history. | ||
| func (s *Store) Append(e Entry) error { |
There was a problem hiding this comment.
Data loss — Append
Concurrent CLI processes can read the same history snapshot and overwrite each other's updates, silently losing completed exchanges.
Explain · Fix in Claude Code · Fix in Codex
Copy for agent
Fix this issue found by Abstraction's review of pull request #16 ("Replace self-update with local history; rename apiclient to transport") in abstraction-dev/cli.
Branch: feature/transport-and-history
Function: Append
File: internal/history/history.go (lines 72-91)
Category: Data loss
Concurrent CLI processes can read the same history snapshot and overwrite each other's updates, silently losing completed exchanges.
| // listHistory prints the newest entries, one row each: when, workspace, and the | ||
| // question collapsed to the terminal width. | ||
| func listHistory(store *history.Store, r *render.Renderer, limit int) int { |
There was a problem hiding this comment.
Logic error — listHistory
The fixed 32-column prefix allowance undercounts non-UTC RFC3339 timestamps, causing long history rows to exceed the terminal width.
Explain · Fix in Claude Code · Fix in Codex
Copy for agent
Fix this issue found by Abstraction's review of pull request #16 ("Replace self-update with local history; rename apiclient to transport") in abstraction-dev/cli.
Branch: feature/transport-and-history
Function: listHistory
File: internal/cli/history.go (lines 68-88)
Category: Logic error
The fixed 32-column prefix allowance undercounts non-UTC RFC3339 timestamps, causing long history rows to exceed the terminal width.
There was a problem hiding this comment.
Change Summary
Adds local conversation history, configurable browser and history settings, and a dedicated API transport layer while removing self-update behavior.
Areas touched:
- Added authenticated workspace, chat, review, buffered-question, and SSE APIs through Client.
- Added bounded, newest-first local exchange storage and history listing, clearing, and formatting through Store.
- Replaced upgrade settings with browser-command and history-limit resolution in Config.
- Added browser-command-aware settings launching through OpenWithConfig.
- Centralized terminal detection, Markdown formatting, and color-aware diagnostic routing in Renderer.
How to review:
- Verify the handoff from AskStream to sseReader preserves event boundaries, callbacks, termination, and stream errors.
- Trace one-shot execution through history recording and terminal-versus-piped output handling.
- Check interactive chat resume restores transcript turns, prompt history, pull-request scope, and unreadable-exchange messaging.
- Verify authentication bootstrapping, workspace selection, configuration persistence, and exit-code classification remain consistent.
Review
One history data-loss race needs fixing.
Checks
| Check | Status | Details |
|---|---|---|
| No simon | ✅ Success | no added functions named "simon" |
Affected Concepts
- CLI Application & REPL
- API Client
- Support Utilities (Config, Rendering, Self-Update, Browser, Entrypoint, Assets)
- abstraction-dev/cli
- CLI
Reviewed deccac2 · 2026-08-21 09:10 UTC
| // Append records one exchange, trimming the file to the newest limit entries. | ||
| // A blank question or answer is dropped: a cancelled turn is not history. | ||
| func (s *Store) Append(e Entry) error { |
There was a problem hiding this comment.
Data loss — Append
Append performs an unlocked read-modify-write of the shared history file, so simultaneous CLI invocations can overwrite one another and silently lose completed entries.
Explain · Fix in Claude Code · Fix in Codex
Copy for agent
Fix this issue found by Abstraction's review of pull request #16 ("Replace self-update with local history; rename apiclient to transport") in abstraction-dev/cli.
Branch: feature/transport-and-history
Function: Append
File: internal/history/history.go (lines 72-91)
Category: Data loss
Append performs an unlocked read-modify-write of the shared history file, so simultaneous CLI invocations can overwrite one another and silently lose completed entries.
There was a problem hiding this comment.
Change Summary
This PR adds persisted exchange history and chat resumption while consolidating API transport, configuration, and terminal interaction behavior.
Areas touched:
- Centralizes authenticated workspace, review, chat, buffered ask, and SSE calls in Client.
- Adds bounded local exchange history with listing, clearing, timestamps, and configurable retention through Store.
- Replaces upgrade settings with browser-command and history-limit resolution in Config.
- Routes the new history command and records successful one-shot answers through Main.
- Loads chats, replays transcripts, restores pull-request scope, and continues sessions in resumeConversation.
How to review:
- Verify the SSE event lifecycle in AskStream, including stream completion, status, output, conversation, and error handling.
- Trace the handoff from startTurn to AskStream for cancellation, asynchronous messages, and loader updates.
- Check history recording from runImmediate through Store, including disabled storage and write failures.
- Verify chat loading and transcript restoration preserve session identifiers, pull-request context, input history, and unreadable exchanges.
Review
LGTM.
Checks
| Check | Status | Details |
|---|---|---|
| No simon | ✅ Success | no added functions named "simon" |
Affected Concepts
- CLI Application & REPL
- API Client
- Support Utilities (Config, Rendering, Self-Update, Browser, Entrypoint, Assets)
- abstraction-dev/cli
- CLI
Reviewed deccac2 · 2026-08-21 09:28 UTC
There was a problem hiding this comment.
Change Summary
Adds persistent conversation history and a consolidated transport-backed chat experience while removing automatic self-updates.
Areas touched:
- Consolidates authenticated workspace, PR, chat, buffered, and streaming API behavior in Client.
- Adds local JSON recording, newest-first listing, truncation, and clearing through Store.
- Replaces upgrade settings with browser-command and history-limit resolution in Config.
- Routes terminal responses through Markdown formatting while preserving clean piped output in Renderer.
- Adds history commands and removes upgrade command dispatch from Main.
How to review:
- Trace runAsk through runImmediate and recordHistory across interactive, piped, and error paths.
- Check streaming cancellation and callback delivery from startTurn into AskStream.
- Verify resumeConversation restores transcript, session, and pull-request scope from GetChat.
- Verify ensureConfigured coordinates API-key validation, browser settings, workspace selection, and non-fatal persistence.
Review
LGTM.
Checks
| Check | Status | Details |
|---|---|---|
| No simon | ✅ Success | no added functions named "simon" |
Affected Concepts
- CLI Application & REPL
- API Client
- Support Utilities (Config, Rendering, Self-Update, Browser, Entrypoint, Assets)
- abstraction-dev/cli
- CLI
Reviewed deccac2 · 2026-08-21 09:43 UTC
There was a problem hiding this comment.
Change Summary
Adds persisted exchange history and chat-resume support while consolidating API/SSE transport, configuration behavior, and terminal output handling.
Areas touched:
- Centralizes authenticated JSON/SSE API operations and chat/workspace models in Client.
- Records one-shot question/answer exchanges and adds list, path, and clear commands via Store.
- Adds browser-command and history-limit resolution to Config, replacing automatic-upgrade settings.
- Resumes chats by replaying readable turns and restoring pull-request scope in resumeConversation.
- Routes colored terminal diagnostics while preserving raw piped answers through Renderer.
How to review:
- Verify streamed callbacks, completion messages, and cancellation flow from AskStream through startTurn.
- Trace chat loading through GetChat into resumeConversation, including unreadable exchanges and pull-request restoration.
- Check history writes after buffered answers and newest-first trimming through recordHistory and Recent.
- Verify first-run authentication, browser fallback, workspace selection, and exit classification through ensureConfigured.
Review
LGTM.
Checks
| Check | Status | Details |
|---|---|---|
| No simon | ✅ Success | no added functions named "simon" |
Affected Concepts
- CLI Application & REPL
- API Client
- Support Utilities (Config, Rendering, Self-Update, Browser, Entrypoint, Assets)
- abstraction-dev/cli
- CLI
Reviewed deccac2 · 2026-08-21 14:01 UTC
There was a problem hiding this comment.
Change Summary
Adds local conversation history, a centralized authenticated transport layer, configurable browser behavior, and chat resumption while removing self-update flows.
Areas touched:
- Adds authenticated workspace, PR review, chat, buffered ask, and SSE streaming operations in Client.
- Persists completed one-shot exchanges and exposes history listing, path, and clear commands through Store.
- Replaces upgrade settings with browser command and history retention resolution in Config.
- Records answers and restores remote transcripts, prompt history, PR scope, and chat state through runImmediate and resumeConversation.
- Routes terminal responses and diagnostics with optional color while preserving clean piped output in Renderer.
How to review:
- Trace streamed SSE callbacks from AskStream through startTurn into reactive REPL messages and cancellation.
- Verify resumeConversation reconstructs transcript entries, input history, PR context, selection state, and unreadable-exchange notices.
- Check recordHistory and Store preserve bounded, newest-first history without affecting successful answers.
- Check ensureConfigured coordinates API-key validation, browser launching, workspace selection, and best-effort persistence.
Review
LGTM.
Checks
| Check | Status | Details |
|---|---|---|
| No simon | ✅ Success | no added functions named "simon" |
Affected Concepts
- CLI Application & REPL
- API Client
- Support Utilities (Config, Rendering, Self-Update, Browser, Entrypoint, Assets)
- abstraction-dev/cli
- CLI
Reviewed deccac2 · 2026-08-21 14:10 UTC
There was a problem hiding this comment.
Change Summary
Adds local conversation history and a consolidated transport layer while removing release self-updates and extending CLI configuration and output behavior.
Areas touched:
- Added authenticated workspace, review, chat, buffered-ask, and SSE streaming operations through Client.
- Added bounded local history recording and
historylisting, path, and clear commands via Store. - Replaced upgrade settings with browser-command and history-limit configuration, including environment resolution through Config.
- Updated one-shot and interactive ask flows to persist answers while preserving raw piped output and terminal Markdown formatting.
- Added configurable browser launching and green success diagnostics through OpenWithConfig and Success.
How to review:
- Trace runAsk through ensureConfigured, request execution, history recording, rendering, and exit-code handling.
- Verify AskStream SSE event parsing, callback delivery, cancellation, stream termination, and conversation-session propagation.
- Check chat loading and transcript reconstruction preserve PR scope, prompt history, unreadable exchanges, and picker state.
- Confirm removal of update-check and self-upgrade paths is reflected consistently in command dispatch, usage text, and persisted configuration.
Review
LGTM.
Checks
| Check | Status | Details |
|---|---|---|
| No simon | ✅ Success | no added functions named "simon" |
Affected Concepts
- CLI Application & REPL
- API Client
- Support Utilities (Config, Rendering, Self-Update, Browser, Entrypoint, Assets)
- abstraction-dev/cli
- CLI
Reviewed deccac2 · 2026-08-21 14:30 UTC
There was a problem hiding this comment.
Change Summary
Adds persisted exchange history and chat resumption while consolidating API transport, configuration behavior, and CLI command routing.
Areas touched:
- AskStream sends authenticated streaming requests and dispatches conversation, output, status, and error events.
- resumeConversation rebuilds REPL transcripts, prompt history, session IDs, and pull-request scope from loaded chats.
- runImmediate records completed exchanges, retaining formatted terminal output and raw piped responses.
- runConfigSet replaces auto-upgrade settings with browser-command and history-retention configuration.
- Main replaces upgrade and update command routing with history inspection and clearing commands.
How to review:
- Check AskStream event parsing and the handoff into streamed REPL callbacks, including conversation identifiers and cancellation.
- Trace loadChatCmd to resumeConversation for transcript replay, session restoration, and pull-request scope recovery.
- Verify recordHistory and runHistory use the same resolved path, retention limit, and newest-first ordering.
- Check ensureConfigured through API-key bootstrap, browser launching, workspace selection, and configuration persistence.
Review
One real data-loss race — block on making history updates concurrency-safe.
- Data loss —
Store.Append: Append performs an unlocked read-modify-write on the shared history file, so concurrent CLI runs can overwrite one another's entries and silently lose history.
Checks
| Check | Status | Details |
|---|---|---|
| No simon | ✅ Success | no added functions named "simon" |
| Säkert | ✅ Success | no added functions named "Security Test" |
Affected Concepts
- CLI Application & REPL
- API Client
- Support Utilities (Config, Rendering, Self-Update, Browser, Entrypoint, Assets)
- abstraction-dev/cli
- CLI
Reviewed deccac2 · 2026-08-26 13:04 UTC
There was a problem hiding this comment.
Change Summary
This PR adds persisted exchange history and chat resumption while consolidating API access and removing the CLI’s automatic upgrade flow.
Areas touched:
- Workspaces adds authenticated workspace, PR-review, chat, buffered-question, and SSE request flows.
- Append stores bounded local exchanges, with newest-first listing and clear/path commands through runHistory.
- runConfigSet manages browser-command and history-limit settings with environment-aware resolution.
- runImmediate records completed answers while preserving rendered terminal output and raw piped Markdown.
- resumeConversation restores chat transcripts, prompt history, pull-request scope, and unreadable-exchange notices.
How to review:
- Trace the SSE callback handoff from AskStream to startTurn, including streamed output, status, conversation IDs, and cancellation.
- Verify resumeConversation synchronizes session, pull-request scope, transcript entries, prompt history, and viewport state.
- Check the setup handoff from ensureConfigured through bootstrapAPIKey and pickWorkspace.
- Verify runImmediate records successful responses through recordHistory without changing output or exit-code behavior.
Review
One backward-compatibility regression — restore the upgrade/update route.
Checks
| Check | Status | Details |
|---|---|---|
| No simon | ✅ Success | no added functions named "simon" |
| Säkert | ✅ Success | no added functions named "Security Test" |
Affected Concepts
- CLI
- abstraction-dev/cli
- CLI Application & REPL
- API Client
- Support Utilities (Config, Rendering, Self-Update, Browser, Entrypoint, Assets)
Reviewed deccac2 · 2026-08-26 13:21 UTC
| return runConfig(args[1:]) | ||
| case "upgrade", "update": | ||
| return runUpgrade(ctx, args[1:]) | ||
| case "history": |
There was a problem hiding this comment.
Bug — Main
Removing the upgrade/update routing causes existing invocations to be submitted as questions instead of performing release updates.
Explain · Fix in Claude Code · Fix in Codex
Copy for agent
Fix this issue found by Abstraction's review of pull request #16 ("Replace self-update with local history; rename apiclient to transport") in abstraction-dev/cli.
Branch: feature/transport-and-history
Function: Main
File: internal/cli/root.go (lines 16-39)
Category: Bug
Removing the upgrade/update routing causes existing invocations to be submitted as questions instead of performing release updates.
There was a problem hiding this comment.
Change Summary
Adds transport-backed API access, local conversation history, configurable browser behavior, and a history command while removing self-update functionality.
Areas touched:
- AskStream adds authenticated buffered and SSE-backed workspace questions, chat retrieval, and PR-review APIs.
- recordHistory persists completed one-shot exchanges with bounded, timestamped storage exposed by runHistory.
- runConfigSet replaces auto-upgrade settings with browser-command and history-limit configuration.
- ensureConfigured and bootstrapAPIKey use configured browser launching during authentication and workspace setup.
- Main removes upgrade commands and registers history listing, path, and clearing.
How to review:
- Trace streamed events from AskStream through startTurn and completion messages into the REPL.
- Verify the one-shot flow from runImmediate to recordHistory and terminal-versus-piped rendering.
- Check ensureConfigured, bootstrapAPIKey, and pickWorkspace across interactive and non-interactive setup.
- Verify resumeConversation decodes stored exchanges and restores session and pull-request scope.
Review
Two real bugs — block on fixes.
Checks
| Check | Status | Details |
|---|---|---|
| No simon | ✅ Success | no added functions named "simon" |
| Säkert | ✅ Success | no added functions named "Security Test" |
Affected Concepts
- CLI
- abstraction-dev/cli
- CLI Application & REPL
- API Client
- Support Utilities (Config, Rendering, Self-Update, Browser, Entrypoint, Assets)
Reviewed deccac2 · 2026-08-26 13:27 UTC
| const historyListDefault = 20 | ||
| // runHistory inspects or clears the locally stored exchanges. | ||
| func runHistory(args []string) int { |
There was a problem hiding this comment.
Data loss — runHistory
Trailing positional arguments are ignored, so a malformed history clear ... invocation still deletes history instead of returning a usage error.
Explain · Fix in Claude Code · Fix in Codex
Copy for agent
Fix this issue found by Abstraction's review of pull request #16 ("Replace self-update with local history; rename apiclient to transport") in abstraction-dev/cli.
Branch: feature/transport-and-history
Function: runHistory
File: internal/cli/history.go (lines 18-64)
Category: Data loss
Trailing positional arguments are ignored, so a malformed `history clear ...` invocation still deletes history instead of returning a usage error.
| // normalised URL equality (so http/https and trailing-slash variants resolve), | ||
| // then by the PR number in its /pull/<n> path as a fallback. | ||
| func matchPRReview(reviews []apiclient.PRReview, url string) *apiclient.PRReview { | ||
| func matchPRReview(reviews []transport.PRReview, url string) *transport.PRReview { |
There was a problem hiding this comment.
Logic error — matchPRReview
When exact URL matching fails, the fallback uses only the repository-scoped PR number and can select a review from another repository in the workspace.
Explain · Fix in Claude Code · Fix in Codex
Copy for agent
Fix this issue found by Abstraction's review of pull request #16 ("Replace self-update with local history; rename apiclient to transport") in abstraction-dev/cli.
Branch: feature/transport-and-history
Function: matchPRReview
File: internal/cli/repl.go (lines 893-905)
Category: Logic error
When exact URL matching fails, the fallback uses only the repository-scoped PR number and can select a review from another repository in the workspace.
There was a problem hiding this comment.
Change Summary
This PR adds shared API transport, local conversation history, chat resumption, and configuration-driven terminal behavior while removing built-in release updates.
Areas touched:
- New centralizes authenticated workspace, review, chat, buffered-question, and SSE operations in the transport layer.
- Append persists bounded exchanges, while runHistory exposes newest-first listing, paths, and clearing.
- runAsk records one-shot answers and separates rendered terminal Markdown from raw piped output through New.
- runConfigSet manages browser and history settings; OpenWithConfig applies browser commands, while Main removes upgrade commands.
- resumeConversation restores chat turns, pull-request scope, and prompt history in the interactive REPL.
How to review:
- Trace startTurn through AskStream and completion messaging to verify asynchronous streaming state reaches the REPL.
- Verify recordHistory and Append preserve non-blocking answer delivery, limits, timestamps, and newest-first retrieval.
- Check ensureConfigured through bootstrapAPIKey and pickWorkspace across interactive and non-interactive setup.
- Trace loadChatCmd into resumeConversation to verify transcript replay restores session and pull-request context.
Review
One data-loss bug in history clearing — block on a fix.
Checks
| Check | Status | Details |
|---|---|---|
| No simon | ✅ Success | no added functions named "simon" |
| Säkert | ✅ Success | no added functions named "Security Test" |
Affected Concepts
- CLI
- abstraction-dev/cli
- CLI Application & REPL
- API Client
- Support Utilities (Config, Rendering, Self-Update, Browser, Entrypoint, Assets)
Reviewed deccac2 · 2026-08-26 13:37 UTC
| const historyListDefault = 20 | ||
| // runHistory inspects or clears the locally stored exchanges. | ||
| func runHistory(args []string) int { |
There was a problem hiding this comment.
Data loss — runHistory
Arguments after the action are silently ignored, so history clear --config X clears the default store rather than the requested file, risking unintended history deletion.
Explain · Fix in Claude Code · Fix in Codex
Copy for agent
Fix this issue found by Abstraction's review of pull request #16 ("Replace self-update with local history; rename apiclient to transport") in abstraction-dev/cli.
Branch: feature/transport-and-history
Function: runHistory
File: internal/cli/history.go (lines 18-64)
Category: Data loss
Arguments after the action are silently ignored, so `history clear --config X` clears the default store rather than the requested file, risking unintended history deletion.
There was a problem hiding this comment.
Change Summary
Adds authenticated API transport, local exchange history, configurable browser launching, and replaces built-in release updating with history commands.
Areas touched:
- Authenticated Workspaces, ListChats, GetChat, and AskStream requests use shared transport.
- Successful runImmediate answers enter recordHistory; runHistory lists bounded local exchanges.
- runConfigSet manages browser and history settings; OpenWithConfig honors configured launchers.
- resumeConversation restores fetched chats; startTurn manages cancellable streamed follow-ups.
- Main exposes history commands while runAsk no longer performs release checks.
How to review:
- Check that AskStream SSE events reach startTurn callbacks with conversation IDs, output, status, and completion intact.
- Verify runImmediate records successful answers and HistoryLimitResolved controls retention and disabling behavior.
- Trace GetChat results through loadChatCmd to resumeConversation for transcript, prompt history, and PR scope restoration.
- Check the ensureConfigured handoff to bootstrapAPIKey for browser-assisted key validation and persisted setup.
Review
One user-visible REPL history bug needs a fix.
Checks
| Check | Status | Details |
|---|---|---|
| No simon | ✅ Success | no added functions named "simon" |
| Säkert | ✅ Success | no added functions named "Security Test" |
Affected Concepts
- CLI
- abstraction-dev/cli
- CLI Application & REPL
- API Client
- Support Utilities (Config, Rendering, Self-Update, Browser, Entrypoint, Assets)
Reviewed deccac2 · 2026-08-26 14:24 UTC
| // scope, so the status bar says what the answers are grounded in and starting a new | ||
| // conversation keeps that grounding. | ||
| func (m *replModel) resumeConversation(loaded apiclient.ChatWithMessages) { | ||
| func (m *replModel) resumeConversation(loaded transport.ChatWithMessages) { |
There was a problem hiding this comment.
Logic error — resumeConversation
Each resume appends all restored user turns to existing input history, so reopening the same chat repeatedly duplicates prompts during up-arrow recall.
Explain · Fix in Claude Code · Fix in Codex
Copy for agent
Fix this issue found by Abstraction's review of pull request #16 ("Replace self-update with local history; rename apiclient to transport") in abstraction-dev/cli.
Branch: feature/transport-and-history
Function: resumeConversation
File: internal/cli/repl.go (lines 660-698)
Category: Logic error
Each resume appends all restored user turns to existing input history, so reopening the same chat repeatedly duplicates prompts during up-arrow recall.
Restructures the CLI's support layer.
internal/apiclient→internal/transport; newtransport.OpenSettingsowns the settings-page browser hopinternal/selfupdate,abstr upgrade, background release check) — updates belong to the installerinternal/historypackage: local, size-capped log of buffered exchanges, exposed asabstr history [list|path|clear]auto_upgradebookkeeping; addbrowser_commandandhistory_limitrender.Errorfremoved in favor of plainError; newrender.Success🤖 Generated with Claude Code