# ConnectOnion Engineering Blog > Citation-ready design decisions and implementation lessons from the team building ConnectOnion, an open-source Python toolkit for AI agents. Canonical blog: https://docs.connectonion.com/blog RSS feed: https://docs.connectonion.com/blog/feed.xml Project: https://docs.connectonion.com ## Articles - [Gmail kept the body and changed the ID](https://docs.connectonion.com/blog/gmail-kept-the-body-and-changed-the-id): A live Gmail test exposed rewritten Message-ID headers. A preserved attempt marker recovers send receipts without risking a duplicate email. Topics: Remote Browser, Release, Testing. - [The command that blamed the wrong password](https://docs.connectonion.com/blog/the-command-that-blamed-the-wrong-password): On 27 August, four emails were queued in Outlook for the next morning. An hour later the wording had to change. Topics: Remote Browser, Permissions, Release. - [The Command That Had to Run on a Broken File](https://docs.connectonion.com/blog/the-command-that-had-to-run-on-a-broken-file): Draft for 1.8.4; publish after release acceptance. Topics: Remote Browser, Release, Testing. - [The suite was green and a thread was spinning](https://docs.connectonion.com/blog/the-suite-was-green-and-a-thread-was-spinning): The test named in the timeout was a scroll test. Running it alone did not explain why the complete Linux suite kept stopping there. Topics: Remote Browser, Testing, Deployment. - [The request ended. The copy did not.](https://docs.connectonion.com/blog/the-request-ended-the-copy-did-not): The copy test lost its connection just after the NAS returned a task ID. The client had reached its waiting limit. The NAS still had a job to do. Topics: Remote Browser, Release, Testing. - [The draft that was still number one](https://docs.connectonion.com/blog/the-draft-that-was-still-number-one): The agent had just listed Gmail drafts. Its next command used a number, as the CLI invited it to do. Topics: Remote Browser, Testing. - [The refresh token we already had](https://docs.connectonion.com/blog/google-login-belongs-on-your-computer): “Why does YouTube need a database migration?” Topics: Remote Browser, Permissions, Release. - [A browser on a server, using your address](https://docs.connectonion.com/blog/a-server-browser-that-uses-your-address): Use co proxy share to authorize one remote agent to browse through your computer's internet connection; review latency and network limits. Topics: Remote Browser, Permissions, Release. - [A reason that nothing read](https://docs.connectonion.com/blog/a-reason-that-nothing-read): Check terminal_reason before browser operations so expired, revoked, or unpaid sessions cannot keep serving pages. Topics: Remote Browser, Testing, Runtime. - [Bind first, then prepare](https://docs.connectonion.com/blog/bind-first-then-prepare): Acquire the daemon socket lock before preparing shared credentials so a losing startup cannot delete the winner's files. Topics: Remote Browser, Testing, Runtime. - [The suffix list, and the table that checked itself](https://docs.connectonion.com/blog/the-suffix-list-and-the-table-that-checked-itself): Audit special-use hostname suffixes and test destination policies against independent fixtures and deliberate mutations. Topics: Remote Browser, Testing. - [The wall was the hard part, not the pipe](https://docs.connectonion.com/blog/the-wall-was-the-hard-part-not-the-pipe): Route a server browser through a home connection while refusing private-network destinations such as 192.168.0.1. Topics: Remote Browser, Release, Testing. - [Every test was green and the feature had never worked once](https://docs.connectonion.com/blog/every-test-was-green-and-it-had-never-worked): Run native egress preflight through the real browser driver and verify that forbidden destinations actually reach the denying gateway. Topics: Remote Browser, Release, Testing. - [The check and the browser read different names](https://docs.connectonion.com/blog/the-check-and-the-browser-read-different-names): Align URL policy checks with browser parsing and test generator-based deny ranges inside IPv4-mapped IPv6 addresses. Topics: Remote Browser, Release, Testing. - [The gateway held, but the answer leaked](https://docs.connectonion.com/blog/the-gateway-held-but-the-answer-leaked): Inspect client-facing proxy responses as well as outbound destination checks to expose response-smuggling gaps in egress tests. Topics: Remote Browser, Release, Testing. - [One Daemon, Many Conversations](https://docs.connectonion.com/blog/one-daemon-many-conversations): Remove daemon-wide request serialization so a long browser task does not block independent sessions; preserve ordering within each session. Topics: Remote Browser, Testing, Runtime. - [127.0.0.1 did not look like an IP address](https://docs.connectonion.com/blog/127-0-0-1-did-not-look-like-an-ip-address): Normalize numeric hostnames such as 2130706433 before applying private-address policy so the browser and validator agree. Topics: Remote Browser, Security, Chromium, Ssrf. - [A Private Tab Is Not a Private Browser](https://docs.connectonion.com/blog/a-private-tab-is-not-a-private-browser): Give remote browsing exclusive process, profile, proxy, and socket ownership; owner-bound tabs alone cannot isolate network authority. Topics: Remote Browser, Testing, Runtime. - [A Session ID Is Not Browser Authority](https://docs.connectonion.com/blog/a-session-id-is-not-browser-authority): Bind browser operations to the authenticated owner and lifecycle so a session identifier alone cannot grant access after reconnect. Topics: Remote Browser, Testing, Runtime. - [A Thread Is Not an Async Runtime](https://docs.connectonion.com/blog/a-thread-is-not-an-async-runtime): Replace a shared blocking worker with owned async execution so separate browser sessions can make progress concurrently. Topics: Remote Browser, Release, Testing. - [Focus Before Delete](https://docs.connectonion.com/blog/focus-before-delete): Check that focus reached the intended editor before select-all and delete, preventing successful commands from clearing the wrong content. Topics: Remote Browser, Testing, Runtime. - [Input Was the Uncancellable Part](https://docs.connectonion.com/blog/input-was-the-uncancellable-part): Move cancellation to the terminal-input boundary so stopping wait_for_manual_login does not leave a worker waiting for input. Topics: Remote Browser, Release, Testing. - [Sleep Was the Global Lock](https://docs.connectonion.com/blog/sleep-was-the-global-lock): Make humanized typing and pointer timing awaitable so one tab's simulated input does not freeze another tab. Topics: Remote Browser, Release, Testing. - [The Browser Opened Before We Knew It Was Safe](https://docs.connectonion.com/blog/the-browser-opened-before-we-knew-it-was-safe): Require a browser preflight after launch to prove proxy refusal and network isolation before declaring a private browser ready. Topics: Remote Browser, Permissions, Release. - [The browser worked until the caller already had a loop](https://docs.connectonion.com/blog/sync-on-the-outside-async-on-the-inside): Keep synchronous Browser methods over one owned event loop, with explicit thread ownership and shutdown joining. Topics: Remote Browser, Release, Testing. - [The command we had to send before the command](https://docs.connectonion.com/blog/one-browser-api-three-engine-promises): Check the running daemon's engine before sending commands so a paid Onion browser request cannot silently use another engine. Topics: Remote Browser, Release, Testing. - [The Matcher Left the Loop](https://docs.connectonion.com/blog/the-matcher-left-the-loop): Move synchronous model-backed element matching off the browser event loop so unrelated tabs respond while a model is pending. Topics: Remote Browser, Release, Testing. - [The paid launcher was on the wrong loop](https://docs.connectonion.com/blog/the-paid-launcher-was-on-the-wrong-loop): Expose an async Onionwright paid launcher for the Patchright event loop while preserving charge, renewal, expiry, and release ownership. Topics: Remote Browser, Release, Testing. - [The proxy replied, but the 429 disappeared](https://docs.connectonion.com/blog/the-proxy-replied-but-the-429-disappeared): A proxy that closes with unread peer bytes can reset the socket on macOS; test that the client receives the overload response before closure. Topics: Remote Browser, Proxy, Security, Testing. - [The second tab was not concurrent](https://docs.connectonion.com/blog/the-second-tab-was-not-concurrent): Time simultaneous operations to distinguish tab isolation from concurrency, then move daemon and driver work onto one async runtime. Topics: Remote Browser, Release, Testing. - [The Upload Button Was in Another Document](https://docs.connectonion.com/blog/the-upload-button-was-in-another-document): Preserve frame routing and listener timing during async migration so file inputs in another document remain reachable. Topics: Remote Browser, Release, Testing. - [The URL Passed, but the Socket Was Still Unknown](https://docs.connectonion.com/blog/the-url-passed-but-the-socket-was-still-unknown): Resolve, validate, and dial approved numeric addresses in the gateway; a URL check before page.goto cannot control later connections. Topics: Remote Browser, Release, Testing. - [A Patch Must Move Forward](https://docs.connectonion.com/blog/a-patch-must-move-forward): Require a forward-port issue for each stable fix and resolve its applicability to every active newer release before publication. Topics: Release, CI. - [A Stable Candidate Cannot Ignore Late Evidence](https://docs.connectonion.com/blog/a-stable-candidate-cannot-ignore-late-evidence): Stop stable promotion when unattended browser acceptance reveals a new failure; publish new immutable candidate bytes and repeat the gate. Topics: Remote Browser, Permissions, Release. - [An Image Prefix Is Not an Image](https://docs.connectonion.com/blog/an-image-prefix-is-not-an-image): Validate complete data URLs and image payloads before upload so base64-looking text cannot enter the image path. Topics: Reliability, Testing. - [co ai Delegates to Codex and Claude Code — and You Watch It Work](https://docs.connectonion.com/blog/connectonion-1-7): ConnectOnion 1.7 adds resumable native coding Work Rooms, explicit permission modes, and live tool activity through co ai. Topics: Release, Work Rooms. - [Headless Does Not Mean Unconfigured](https://docs.connectonion.com/blog/headless-does-not-mean-unconfigured): Honor explicit command grants in unattended Auto while rejecting broad legacy wildcards that would authorize unlimited actions. Topics: Permissions, Automation. - [One Fix, Every Newer Line](https://docs.connectonion.com/blog/one-fix-every-newer-line): The release contract checks Git ancestry and applicable behavioral fixes across supported branches, excluding old version metadata from forward-ports. Topics: Remote Browser, Release, Testing. - [A Durable Downgrade Must Also Be Live](https://docs.connectonion.com/blog/a-durable-downgrade-must-also-be-live): Publish the narrowed provider lifecycle revision when Host permissions change so open Work Rooms immediately reflect stored authority. Topics: Remote Browser, Permissions, Release. - [A new candidate needs a new name](https://docs.connectonion.com/blog/a-new-candidate-needs-a-new-name): Use a new candidate version whenever published code changes so install commands, evidence, checksums, and rollback identify the same bytes. Topics: Remote Browser, Release, Testing. - [A Permission Change Has One Public Truth](https://docs.connectonion.com/blog/a-permission-change-has-one-public-truth): Emit the final permission state after a downgrade so stopping and reopening native provider work cannot expose an intermediate authority. Topics: Remote Browser, Permissions, Release. - [A permission is a complete state](https://docs.connectonion.com/blog/a-permission-is-a-complete-state): Copy both the validated mode and positive turns_left budget into native continuations; missing budgets degrade to Auto without renewing authority. Topics: Remote Browser, Permissions, Release. - [A tool result is not a final answer](https://docs.connectonion.com/blog/a-tool-result-is-not-a-final-answer): Distinguish a successful Claude Code tool result from parent-turn completion so an empty model answer cannot strand the chat composer. Topics: Remote Browser, Release, Testing. - [Arm the deadline before the tool returns](https://docs.connectonion.com/blog/arm-the-deadline-before-the-tool-returns): Arm the parent model's 90-second settlement limit before provider work starts and recover the boundary from durable codex or claude_code traces. Topics: Remote Browser, Permissions, Release. - [Auto must mean the same promise](https://docs.connectonion.com/blog/auto-must-mean-the-same-promise): Translate Host Auto intent into each native provider's workspace controls while preserving the separately confirmed Full Access ceiling. Topics: Permissions, Release, Testing. - [One Approval Boundary Is Enough](https://docs.connectonion.com/blog/one-approval-boundary-is-enough): Define one explicit handoff from Host policy to native provider approval so a managed delegation does not stall behind nested dialogs. Topics: Permissions, Release, Testing. - [The daemon was not the slow part](https://docs.connectonion.com/blog/the-daemon-was-not-the-slow-part): Measure the command path before blaming the daemon queue; avoid importing the entire persistent service for every state query. Topics: Remote Browser, Release, Testing. - [The First Correct Snapshot Was Still Wrong](https://docs.connectonion.com/blog/the-first-correct-snapshot-was-still-wrong): Publish one provider snapshot at the final authority ceiling after Stop and downgrade, then verify reopened native sessions. Topics: Remote Browser, Permissions, Release. - [The last change is the name](https://docs.connectonion.com/blog/the-last-change-is-the-name): Change package version and Production/Stable metadata together, run twine check, and switch docs only after PyPI serves the final package. Topics: Remote Browser, Permissions, Release. - [The snapshot that arrived thirty-nine times](https://docs.connectonion.com/blog/the-snapshot-that-arrived-thirty-nine-times): Separate replacement snapshots from append-only events so repeated provider state cannot flood the chat and hide an approval. Topics: Remote Browser, Permissions, Release. - [The tool finished but the turn did not](https://docs.connectonion.com/blog/the-tool-finished-but-the-turn-did-not): Bound parent model settlement, retry once after a timeout, and end with an explicit error if the retry also expires. Topics: Release, Testing, Work Rooms. - [The workspace default was already known](https://docs.connectonion.com/blog/the-workspace-default-was-already-known): Use the Host-owned workspace when a native coding call omits a directory, while rejecting requests outside the authorized boundary. Topics: Permissions, Release, Testing. - [A Release Candidate Is a Testable Artifact](https://docs.connectonion.com/blog/a-release-candidate-is-a-testable-artifact): Test a clean public wheel through real browser and provider journeys, and keep its bytes unchanged during release acceptance. Topics: Remote Browser, Permissions, Release. - [The Work Room Needed Its Own Permissions](https://docs.connectonion.com/blog/the-work-room-needed-its-own-permissions): Keep Host authority, provider-session modes, and individual approvals distinct and visible in the native coding client. Topics: Remote Browser, Permissions, Release. - [What Makes an Agent 10x](https://docs.connectonion.com/blog/what-makes-an-agent-10x): Design agents around verifiable work, durable time, learned experience, bounded delegation, and access to real tools. Topics: Vision, Reliability. - [A Snapshot Is Not Live State](https://docs.connectonion.com/blog/a-snapshot-is-not-live-state): Update Control Center readiness from live running and approval events so a stored snapshot cannot label a busy agent available. Topics: Remote Browser, Permissions, Release. - [A Transcript Is Not a Client](https://docs.connectonion.com/blog/a-transcript-is-not-a-client): Send new messages into the same native provider conversation so users can continue work from the remote client. Topics: Remote Browser, Permissions, Release. - [A Workspace Boundary Is Not a Path](https://docs.connectonion.com/blog/a-workspace-boundary-is-not-a-path): Reject out-of-workspace provider requests without exposing private roots, missing paths, file names, or symlink targets in public errors. Topics: Remote Browser, Permissions, Release. - [An Action Is Not a Reason](https://docs.connectonion.com/blog/an-action-is-not-a-reason): Describe the operation being performed above a tool call and leave supporting evidence available without inventing model rationale. Topics: Release, Testing, API Design. - [An Invite Is Not an Environment](https://docs.connectonion.com/blog/an-invite-is-not-an-environment): Pass co ai --invite-code for a local run or --invite-code-file for automation while keeping temporary credentials out of persistent configuration. Topics: Remote Browser, Permissions, Release. - [The Approval Belonged to the Wrong Room](https://docs.connectonion.com/blog/the-approval-belonged-to-the-wrong-room): Place native session decisions in the Work Room that can answer them so Host-level approval does not silently stall provider follow-ups. Topics: Remote Browser, Permissions, Testing. - [The Beta Caught the Wrong Question](https://docs.connectonion.com/blog/the-beta-caught-the-wrong-question): Change tool summaries from inferred reasons to observable actions so type-correct UI contracts do not encourage invented explanations. Topics: Release, Testing, API Design. - [The Bill and the Counter Disagreed](https://docs.connectonion.com/blog/the-bill-and-the-counter-disagreed): Use one source of truth for new, cached, and output-token accounting so the chat can explain the charge on a managed request. Topics: Remote Browser, Testing, Deployment. - [The Timeout That Blocked Recovery](https://docs.connectonion.com/blog/the-timeout-that-blocked-recovery): Allow recovery actions after DOMContentLoaded times out instead of repeating the same blocked readiness check before every command. Topics: Remote Browser, Release, Testing. - [The Workroom Lost the Conversation](https://docs.connectonion.com/blog/the-workroom-lost-the-conversation): Carry provider requests and answers through the shared protocol so live status and tool summaries do not replace the conversation. Topics: Remote Browser, Release, Work Rooms. - [A Mode Is Not a Compatibility Shim](https://docs.connectonion.com/blog/a-mode-is-not-a-compatibility-shim): Reject legacy authority aliases rather than translating them into Auto, Read only, or Full Access permissions. Topics: Remote Browser, Permissions, Work Rooms. - [A URL Is One Piece of Data](https://docs.connectonion.com/blog/a-url-is-one-piece-of-data): Render long co auth google URLs without inserted line breaks so headless users can copy the exact credential handoff value. Topics: Remote Browser, Testing, Deployment. - [No Dialog Is Not Approval](https://docs.connectonion.com/blog/no-dialog-is-not-approval): Apply the same outside-workspace and unknown-tool policy when no approval UI exists; missing dialogs must not grant authority. Topics: Remote Browser, Permissions. - [The Log Sent Us to the Wrong File](https://docs.connectonion.com/blog/the-log-sent-us-to-the-wrong-file): Pass configuration provenance through deployment layers so invite diagnostics identify the actual source without exposing secrets. Topics: Deployment, Runtime, API Design. - [The pipeline that succeeded without doing the work](https://docs.connectonion.com/blog/an-iteration-limit-is-not-success): Use a nonzero command outcome for unfinished agent work so shell pipelines cannot treat an exhausted iteration budget as success. Topics: Testing, Runtime. - [Three Labels Were One Decision](https://docs.connectonion.com/blog/three-labels-were-one-decision): Map Host Auto, Read only, and Full Access to native provider settings so legacy Default and workspace labels cannot imply different authority. Topics: Remote Browser, Permissions, Release. - [A Server Quota Is Not a Ceiling](https://docs.connectonion.com/blog/a-server-quota-is-not-a-ceiling): Expose server region choice from the backend catalog so regional GCE address quotas do not become a global provisioning ceiling. Topics: Deployment, API Design. - [Authorise in Advance, So Nobody Signs at 3am](https://docs.connectonion.com/blog/authorise-in-advance-so-nobody-signs-at-3am): Separate connection-sharing authorization from tunnel transport and reject attempts by the proxy to authorize its own egress. Topics: Remote Browser, Permissions, Testing. - [New Feature Work Needs a New Number](https://docs.connectonion.com/blog/new-feature-work-needs-a-new-number): Move new remote-browser and server-region work to the next feature line while a frozen release accepts stabilization fixes only. Topics: Remote Browser, Permissions, Release. - [Sharing a Mailbox Is Not the Same as Giving It Away](https://docs.connectonion.com/blog/sharing-a-mailbox-is-not-the-same-as-giving-it-away): Authorize another agent against an existing mailbox identity so outreach and CRM history stay attached to the original address. Topics: Remote Browser, Permissions, Email. - [The Browser Gate Was Only Windows](https://docs.connectonion.com/blog/the-browser-gate-was-only-windows): Run clean-wheel browser acceptance on each supported platform so Windows-only coverage cannot hide macOS daemon failures. Topics: Remote Browser, Permissions, Release. - [The Model Was Holding the Browser](https://docs.connectonion.com/blog/the-model-was-holding-the-browser): Separate model waiting from the browser execution lane so spending-cap retries cannot freeze unrelated browser sessions. Topics: Remote Browser, Release, Testing. - [Your Servers, Your Regions, Your Shared Mailboxes](https://docs.connectonion.com/blog/connectonion-1-6-12): Release notes for server-region choice, shared mailboxes, collision-safe Outlook downloads, and bounded provider requests. Topics: Release, Email. - [A Message Is Not Accepted Until Codex Accepts It](https://docs.connectonion.com/blog/a-message-is-not-accepted-until-codex-accepts-it): Keep a follow-up draft until successful steering or native turn start; placing text in a Host queue is not delivery. Topics: Remote Browser, Testing, Work Rooms. - [A Stop Request Is Not a Stop](https://docs.connectonion.com/blog/a-stop-request-is-not-a-stop): Distinguish Stop intent, delivery, and terminal outcome so the client reports cancellation only for the targeted provider invocation. Topics: Remote Browser, Testing, Work Rooms. - [A Thumbnail Is Evidence, Not a Placeholder](https://docs.connectonion.com/blog/a-thumbnail-is-evidence-not-a-placeholder): Render verified workspace or inline PNG evidence and reject outside paths, malformed bytes, and stale revisions. Topics: Remote Browser, Permissions, Release. - [A Work Room Has One Writer](https://docs.connectonion.com/blog/a-workroom-has-one-writer): Let the provider-owning layer emit lifecycle revisions and retain artifacts while browser consumers reject stale or malformed state. Topics: Remote Browser, Permissions, Release. - [Auto Is a Boundary, Not a Bypass](https://docs.connectonion.com/blog/auto-is-a-boundary-not-a-bypass): Allow narrow local workspace work without repeated approval while leaving ambiguous, destructive, and broader actions under review. Topics: Remote Browser, Permissions, Release. - [The Work Room Is a Client, Not a Status Panel](https://docs.connectonion.com/blog/workroom-is-a-view): Keep provider conversation, follow-up input, lifecycle, and controls in one Work Room while the native adapter owns execution. Topics: Work Rooms, OIP. - [A Name Is Not an Adapter](https://docs.connectonion.com/blog/a-name-is-not-an-adapter): Require a Codex tool card and an openable Work Room from the native provider path; pwd and which codex do not prove a Codex session started. Topics: Remote Browser, Permissions, Release. - [A Session ID Is Not a Work Room](https://docs.connectonion.com/blog/a-session-id-is-not-a-work-room): Emit provider-owned identity, status, authority, continuation, and replay so a UUID inside a tool result becomes a usable Work Room. Topics: Remote Browser, Permissions, Release. - [A Tool Transaction Is Not a Work Room](https://docs.connectonion.com/blog/a-tool-transaction-is-not-a-work-room): Send live provider activity and approval events through OIP while keeping raw terminal detail out of the default chat surface. Topics: Work Rooms, OIP. - [A User Message Is Not Always a String](https://docs.connectonion.com/blog/a-user-message-is-not-always-a-string): Extract text from structured user content without discarding image parts or calling string methods on a list. Topics: Remote Browser, Runtime, API Design. - [A Work Room Is a Summary, Not a Transcript](https://docs.connectonion.com/blog/a-work-room-is-a-summary-not-a-transcript): Use a finite OIP Work Room summary with verified decisions and evidence instead of replaying raw terminal transcripts by default. Topics: Work Rooms, OIP. - [An Approval Is Not Execution Time](https://docs.connectonion.com/blog/an-approval-is-not-execution-time): Exclude time spent waiting for an operator's approval from the active provider execution budget. Topics: Permissions, Codex. - [Stop Is a Process-Tree Operation](https://docs.connectonion.com/blog/stop-is-a-process-tree-operation): Launch shell work in a process group, send SIGTERM on Stop or timeout, then SIGKILL after a grace period; revoke the IO lease to ignore late results. Topics: Remote Browser, Testing, Runtime. - [The Long Tail of a Default](https://docs.connectonion.com/blog/the-long-tail-of-a-default): Centralize DEFAULT_MODEL and audit examples, templates, and docs so an old model string does not survive as misleading guidance. Topics: Remote Browser, Release, Testing. - [The Screenshot Was Not the Test](https://docs.connectonion.com/blog/the-screenshot-was-not-the-test): Test screenshots alongside provider state, reconnect behavior, and operating-system resources to prove Stop and resume actually work. Topics: Remote Browser, Permissions, Release. - [The Second Connection Was Still the First](https://docs.connectonion.com/blog/the-second-connection-was-still-the-first): Preserve relay and session continuity across browser reloads while checking that identity and authority have not changed. Topics: Remote Browser, Permissions, Release. - [A label is useful only when the work has somewhere to ship](https://docs.connectonion.com/blog/labels-need-a-release-home): Classify contributions and require real release metadata so unlabeled work and placeholder milestones cannot disappear into the merge queue. Topics: Release. - [A Page Should Not Become a Wall](https://docs.connectonion.com/blog/a-page-should-not-become-a-wall): Retrieve later mailbox pages with get_emails(last=1000, offset=2000) or co email inbox --last 1000 --offset 2000. Topics: Email, API Design. - [Changing the Default Model Is a Backend Decision First](https://docs.connectonion.com/blog/gemini-37-default): Verify backend support before clients request Gemini 3.7, and preserve explicit user model choices. Topics: Models, Release. - [Codex Was Ready. Codex Had Never Opened.](https://docs.connectonion.com/blog/one-browser-boundary): Enforce requested provider identity across the browser protocol and validate the installed wheel so base-model fallback cannot fake a handoff. Topics: Remote Browser, Permissions, Testing. - [Evaluation Is a Choice](https://docs.connectonion.com/blog/evaluation-is-a-choice): Enable optional judging with co ai --eval; retain the newest 500 generated session records while keeping authored evaluation suites. Topics: Testing, API Design. - [Every PR tells its story](https://docs.connectonion.com/blog/every-pr-tells-its-story): Require a docs/blog post through the blog-gate CI check so implemented capabilities ship with CLI help, user documentation, and engineering lessons. Topics: Testing, API Design. - [One Browser Protocol, Native Coding Adapters](https://docs.connectonion.com/blog/oip-native-coding-adapters): Use one browser-facing protocol while native backend adapters retain provider sessions, approval behavior, and execution ownership. Topics: OIP, Architecture. - [One Default, Five Answers](https://docs.connectonion.com/blog/one-default-five-answers): Replace repeated model strings with one DEFAULT_MODEL while preserving explicit user configuration and a documented rollback. Topics: Remote Browser, Release, Testing. - [Ten minutes was not a timeout policy](https://docs.connectonion.com/blog/ten-minutes-was-not-a-timeout-policy): Stop silently capping caller timeouts at ten minutes and propagate real timeout errors through direct APIs and Agent traces. Topics: Testing, Runtime, API Design. - [The Agent That Was Itself, and Billed Someone Else](https://docs.connectonion.com/blog/deployed-agent-identity): Control which credentials a deployed process inherits so operator configuration cannot silently replace agent identity or billing authority. Topics: Security, Deployment. - [The cache was invisible](https://docs.connectonion.com/blog/the-cache-was-invisible): Surface provider cached-token counts in local accounting and terminal output so repeated requests show their actual charge. Topics: Remote Browser, Release, Testing. - [The CLI is the product](https://docs.connectonion.com/blog/the-cli-is-the-product): Expose API features in CLI help and route email ownership failures to co email addresses so users can find a valid next command. Topics: Release, Testing, Email. - [The Owner Needs a Door](https://docs.connectonion.com/blog/the-owner-needs-a-door): Provide a private owner recovery path that permits initial agent access without leaking invite credentials into logs. Topics: Security, Onboarding. - [The Third Argument Was Already Taken](https://docs.connectonion.com/blog/the-third-argument-was-already-taken): Preserve the reply method's existing positional arguments while adding attachment validation and regression tests for legacy callers. Topics: Remote Browser, Release, Testing. - [When “Download” Quietly Meant “Replace”](https://docs.connectonion.com/blog/outlook-attachment-collisions): Allocate unique download paths for duplicate attachment names and existing local files, then return the paths actually written. Topics: Remote Browser, Release, Testing. - [When logging looked like authoring](https://docs.connectonion.com/blog/when-logging-looked-like-authoring): Distinguish source authoring from command-output logging so append redirects and tee can write audit records without retry loops. Topics: Remote Browser, Testing, Runtime. - [ConnectOnion 1.6.0](https://docs.connectonion.com/blog/connectonion-1-6): Review the release's remote-agent controls and the separation of deployed agent credentials from operator identity. Topics: Release, Security. - [Auto-Debug Design Evolution](https://docs.connectonion.com/blog/auto-debug-evolution): Compare five debugging designs that reduced mode complexity and focused the workflow on inspecting live agent execution. Topics: Debugging, UX. - [Progressive Disclosure in CLI Design](https://docs.connectonion.com/blog/cli-ux-progressive-disclosure): Scaffold a working agent project first, then reveal configuration choices when users need them instead of requiring a setup questionnaire. Topics: CLI, UX. - [Why “Address” Beats “Identity”](https://docs.connectonion.com/blog/naming-is-hard): Use address for network routing and keep reputation, authorization, and broader identity concepts separate in the public API. Topics: API Design, Naming. - [Why Agent Addresses Use Hex-Encoded Ed25519 Keys](https://docs.connectonion.com/blog/agent-address-format): Represent the full Ed25519 public key in hexadecimal with a 0x prefix so an address directly carries the agent's public verification key. Topics: Security, Network. - [Why We Chose input() Over run()](https://docs.connectonion.com/blog/input-method): Send a task through Agent.input() so the primary method names the caller's input rather than exposing a generic execution verb. Topics: API Design, UX. - [Why We Chose llm_do() Over llm()](https://docs.connectonion.com/blog/llm-do): Use llm_do() for a single LLM task without creating an Agent; the function name states an action rather than naming a model object. Topics: API Design, Naming. - [Why We Chose “Trust”](https://docs.connectonion.com/blog/trust-keyword): Use trust as the public API concept for both accepting incoming agents and deciding which remote agents may be called. Topics: API Design, Security. - [Designing the ConnectOnion Network Protocol](https://docs.connectonion.com/blog/network-protocol-design): Compare agent addressing, messages, and direct connections with the earlier identity and session machinery. Topics: Architecture, Network.