# BotHarness developer documentation Design describes the target; Reference describes the current code. ## Design - [BotHarness developer documentation](https://botharness.ai/dev.md) — Design, verified guides, generated code reference, and architecture decisions - [Design](https://botharness.ai/dev/design.md) — Canonical BotHarness product language and integrated architecture - [BotHarness Architecture & Data Flow](https://botharness.ai/dev/design/architecture.md) — System context, modules, data flow and boundaries (living doc) - [BotHarness runtime architecture on DSH](https://botharness.ai/dev/design/bot-runtime.md) — Product boundaries across PersonaBot, Inbox, Orchestrator, Work, and DSH execution - [BotHarness Product Context](https://botharness.ai/dev/design/context.md) — Canonical BotHarness product terms, distinct from DSH and Cordis vocabulary ## Guides - [Guides](https://botharness.ai/dev/guides.md) — Verified implementation and integration workflows - [Assignment Report batches and source history](https://botharness.ai/dev/guides/assignment-report-harvest.md) — Verified progress batching, native harvest and independent source history. - [Stopping an Assignment and checking recovery](https://botharness.ai/dev/guides/assignment-stop-recovery.md) — Verified stop workflow and Host restart acceptance - [客户端桥(Client Bridge)规格](https://botharness.ai/dev/guides/client-bridge.md) — 已实现的 Web Client 与 core RPC 契约(含迁移中的 legacy seams) - [Read Client startup diagnostics before accepting UI readiness](https://botharness.ai/dev/guides/client-startup-diagnostics.md) — Proactive browser console, bounded boot evidence and explicit readiness - [IM Provider integration and qualification](https://botharness.ai/dev/guides/im-provider-integration.md) — Verified Lark and Slack contracts and repeatable provider qualification - [PersonaBot Output Committed](https://botharness.ai/dev/guides/personabot-output.md) — Host public output notifications and Consumer lifecycle ## Reference - [Reference](https://botharness.ai/dev/reference.md) — Generated current-code contracts for config, tools, and public events - [Core config reference](https://botharness.ai/dev/reference/config.md) — Configuration accepted by the current BotHarness core plugin - [Cordis event reference](https://botharness.ai/dev/reference/events.md) — Public Cordis event seams used by the current BotHarness core - [Model tool reference](https://botharness.ai/dev/reference/tools.md) — Tools registered for models by the current BotHarness core ## Decisions - [Architecture decisions](https://botharness.ai/dev/adr.md) — Decision history, status, and rationale for BotHarness architecture - [Adopt dsh-im as the base plugin](https://botharness.ai/dev/adr/0001-adopt-dsh-im-as-base-plugin.md) - [Build Bot memory in-house, file-first](https://botharness.ai/dev/adr/0002-file-first-self-built-bot-memory.md) - [Memory is written only through explicit tools](https://botharness.ai/dev/adr/0003-memory-writes-are-tool-driven.md) - [Inject the memory tree; retrieve bodies on demand](https://botharness.ai/dev/adr/0004-inject-memory-tree-retrieve-on-demand.md) - [SQLite is an optional index, never a system of record](https://botharness.ai/dev/adr/0005-sqlite-is-an-optional-index.md) - [Feishu app secrets live in the DSH credentials service](https://botharness.ai/dev/adr/0006-feishu-secrets-in-dsh-credentials-service.md) - [Configuration and management UI lives inside DSH](https://botharness.ai/dev/adr/0007-configuration-ui-is-in-harness.md) - [Archive inbound chat files into the Bot workspace](https://botharness.ai/dev/adr/0008-archive-inbound-chat-files.md) - [Reply scope defaults to thread-first](https://botharness.ai/dev/adr/0009-reply-scope-defaults-to-thread-first.md) - [Keep self-built capabilities in-repo for now](https://botharness.ai/dev/adr/0010-upstream-contribution-deferred.md) - [Integrate as a standalone DSH plugin, not a dsh-im fork](https://botharness.ai/dev/adr/0011-standalone-plugin-not-a-dsh-im-fork.md) - [Adopt YAML front-matter for memory files](https://botharness.ai/dev/adr/0012-adopt-yaml-front-matter.md) - [Memory is one brain with per-entry visibility](https://botharness.ai/dev/adr/0013-memory-visibility.md) - [Persona is a human-owned memory file](https://botharness.ai/dev/adr/0014-persona-is-human-owned-memory.md) - [Ship BotHarness as a DSH plugin layer, not a fork](https://botharness.ai/dev/adr/0015-botharness-is-a-dsh-plugin-layer.md) - [PersonaBots are first-class entities; sessions are their execution](https://botharness.ai/dev/adr/0016-bots-are-first-class-entities.md) - [Assignments are represented by Sessions; there is no Task entity](https://botharness.ai/dev/adr/0017-assignments-are-sessions-no-task-entity.md) - [A workspace is a single directory](https://botharness.ai/dev/adr/0018-workspace-is-one-directory.md) - [The Soul registry is a hosted service](https://botharness.ai/dev/adr/0019-soul-registry-is-a-hosted-service.md) - [SoulSnapshot is an immutable, content-addressed package](https://botharness.ai/dev/adr/0020-soul-snapshot-is-content-addressed.md) - [Memory has no visibility](https://botharness.ai/dev/adr/0021-memory-has-no-visibility.md) - [Plugin config uses the Cordis channel; settings cards are deferred](https://botharness.ai/dev/adr/0022-dsh-config-and-manifest-conformance.md) - [The client bridge is read-model RPC, not Cordis injection](https://botharness.ai/dev/adr/0023-client-bridge-is-rpc-not-cordis.md) - [One Orchestrator Session per PersonaBot; Assignment Sessions are independent](https://botharness.ai/dev/adr/0024-orchestrator-session-per-personabot.md) - [The Inbox is an event-stream projection, and its triggers are configurable](https://botharness.ai/dev/adr/0025-inbox-is-event-stream-with-triggers.md) - [Channels are platform-native spaces; Binding connects a PersonaBot to any surface](https://botharness.ai/dev/adr/0026-channels-are-platform-native.md) - [Model selection is local; shared Bots stay model-agnostic](https://botharness.ai/dev/adr/0027-model-selection-is-local.md) - [In-harness UI follows the DSH design system; COSS stays on the docs site](https://botharness.ai/dev/adr/0028-in-harness-ui-uses-dsh-design-system.md) - [Bot mode is chat-first; PersonaBot navigation keeps Assignment subordinate](https://botharness.ai/dev/adr/0029-bot-mode-information-architecture.md) - [Channel history is an append-only file log; SQLite is only an optional index](https://botharness.ai/dev/adr/0030-channel-history-is-append-only-files.md) - [Sidebar organization is per scope: sections, sort modes, and 未分组](https://botharness.ai/dev/adr/0031-sidebar-organization-model.md) - [Default avatars are deterministic blobatars; missing glyphs are vendored, not cloned](https://botharness.ai/dev/adr/0032-avatar-identity-and-icons.md) - [DSH Dev Docs and the dsh-skill mirror](https://botharness.ai/dev/adr/0033-dsh-dev-docs-and-skill-mirror.md) - [The persistence map: files, storage domains, and the host/client split](https://botharness.ai/dev/adr/0034-persistence-map-and-host-client-split.md) - [Session ownership is explicit, exclusive, and Registry-owned](https://botharness.ai/dev/adr/0035-session-ownership-is-explicit.md) - [Messaging commands own every Messaging write](https://botharness.ai/dev/adr/0036-messaging-commands-own-messaging-writes.md) - [Messaging facts share one BotHarness-owned SQLite transaction](https://botharness.ai/dev/adr/0037-messaging-facts-share-one-sqlite-transaction.md) - [Provider Capabilities and Service Grants gate external actions](https://botharness.ai/dev/adr/0038-provider-capabilities-and-service-grants-gate-external-actions.md) - [The external outbox is durable and idempotent, not exactly-once](https://botharness.ai/dev/adr/0039-external-outbox-is-idempotent-but-not-exactly-once.md) - [PersonaBot Export wraps Soul and selected operational facets](https://botharness.ai/dev/adr/0040-personabot-export-wraps-soul-and-optional-operational-facets.md) - [One database owns all BotHarness operational state](https://botharness.ai/dev/adr/0041-one-database-owns-botharness-operational-state.md) - [Profile Backup coordinates BotHarness state and optional DSH Sessions](https://botharness.ai/dev/adr/0042-profile-backup-coordinates-database-files-and-dsh-sessions.md) - [Profile Transfer prevents identity split brain across Hosts](https://botharness.ai/dev/adr/0043-profile-transfer-prevents-identity-split-brain.md) - [Restore revalidates target runtime dependencies](https://botharness.ai/dev/adr/0044-restore-revalidates-target-runtime-dependencies.md) - [Orchestrator manages Assignments through a durable directory](https://botharness.ai/dev/adr/0045-orchestrator-manages-assignments-through-a-durable-directory.md) - [PersonaBot IDs are Host-owned; names and role badges are Human-facing](https://botharness.ai/dev/adr/0046-personabot-id-name-and-role-badges.md) - [Memory is a default Git-backed Service with file-first Agent access](https://botharness.ai/dev/adr/0047-memory-is-an-optional-git-backed-service.md) - [Workspace Grants authorize single-cwd Assignments](https://botharness.ai/dev/adr/0048-workspace-grants-authorize-single-cwd-assignments.md) - [PersonaBot activity is a projection with live Cordis notifications](https://botharness.ai/dev/adr/0049-personabot-activity-is-a-projection-with-live-events.md) - [Computer use is an optional standalone package mirroring the DSH provider seam](https://botharness.ai/dev/adr/0050-computer-use-is-an-optional-standalone-package.md) - [A Computer is a profile-scoped shared resource; PersonaBots are not a security boundary](https://botharness.ai/dev/adr/0051-computer-is-a-profile-scoped-shared-resource.md) - [Computer storage stays on a named volume; portability is an explicit profile-level export](https://botharness.ai/dev/adr/0052-computer-storage-and-export.md) - [Channel sidebar is the scoped right sidebar of Bot mode](https://botharness.ai/dev/adr/0053-channel-sidebar-is-the-scoped-right-sidebar.md) - [Channel live delivery follows durable commit](https://botharness.ai/dev/adr/0054-channel-live-delivery-follows-durable-commit.md) - [The Computer pulls the upstream webtop image and runs under hard resource bounds](https://botharness.ai/dev/adr/0055-computer-runs-the-upstream-webtop-image-under-resource-bounds.md) - [BotHarness owns a settings section instead of adding rows to the native General page](https://botharness.ai/dev/adr/0056-botharness-owns-a-settings-section.md) - [The Bot mark is a user-chosen asset; the shell-owned Settings nav wears it by DOM tagging](https://botharness.ai/dev/adr/0057-the-bot-mark-is-a-user-chosen-asset.md) - [Computer settings are runtime settings, contributed into the BotHarness section through a child slot](https://botharness.ai/dev/adr/0058-computer-settings-are-runtime-settings.md) - [Assignment collaboration round-trips through the Bot Inbox](https://botharness.ai/dev/adr/0059-assignment-collaboration-round-trips-through-the-bot-inbox.md) - [The system prompt prefix is append-only](https://botharness.ai/dev/adr/0060-system-prompt-prefix-is-append-only.md) - [Channel timeline pages use Host-owned opaque cursors](https://botharness.ai/dev/adr/0061-channel-timeline-uses-opaque-cursors.md) - [Computer exports quiesce the browser, and durable work lives in ~/workspace](https://botharness.ai/dev/adr/0062-computer-volume-quiesce-and-workspace.md) - [Operational logs live in a separate database file](https://botharness.ai/dev/adr/0063-operational-log-database.md) - [Agent log access needs no dedicated tool](https://botharness.ai/dev/adr/0064-agent-log-access-without-a-tool.md) - [PersonaBots collaborate through Channels](https://botharness.ai/dev/adr/0065-bots-collaborate-through-channels.md) - [The RC2 Client Bundle has an unambiguous package identity](https://botharness.ai/dev/adr/0066-rc2-client-bundle-identity.md) - [Workspace Grants bound PersonaBot file access](https://botharness.ai/dev/adr/0067-workspace-grants-bound-personabot-file-access.md) - [The checked-out Git working tree is current Memory](https://botharness.ai/dev/adr/0068-git-working-tree-is-current-memory.md) - [Selected Channel references do not grant membership](https://botharness.ai/dev/adr/0069-selected-channel-references-and-bot-join-requests.md) - [Bot Inbox read models project canonical Admissions](https://botharness.ai/dev/adr/0070-bot-inbox-projects-canonical-admissions.md) - [Human Inbox projects canonical Channel attention](https://botharness.ai/dev/adr/0071-human-inbox-projects-channel-attention.md) - [PersonaBot sidebar projects owned DSH Sessions](https://botharness.ai/dev/adr/0072-personabot-sidebar-projects-owned-dsh-sessions.md) - [Group membership is invitation-first with default auto-accept](https://botharness.ai/dev/adr/0073-group-membership-is-invitation-first-with-auto-accept.md) - [A PersonaBot owns its Channel attention preference](https://botharness.ai/dev/adr/0074-channel-attention-preference-belongs-to-the-personabot.md) - [Inbox handling classifies by Source class, not platform](https://botharness.ai/dev/adr/0075-inbox-handling-classifies-by-source-not-platform.md) - [A PersonaBot manages its own attention policy](https://botharness.ai/dev/adr/0076-a-personabot-manages-its-own-attention-policy.md) - [Turn-time harvest consumes the ready attention set](https://botharness.ai/dev/adr/0077-turn-time-harvest-consumes-the-ready-attention-set.md) - [Local Human Group receipts use member identity](https://botharness.ai/dev/adr/0078-local-human-group-receipts-use-member-identity.md) - [Adopt the official computer-use seam with a BotHarness-owned provider](https://botharness.ai/dev/adr/0079-adopt-official-computer-use-seam-with-own-provider.md) - [Computer Access is per-PersonaBot; Computer Authorization is session-scoped and Human-owned](https://botharness.ai/dev/adr/0080-computer-access-is-per-personabot-authorization-is-session-scoped.md) - [Group management keeps Human invitations and avatars on the Channel authority](https://botharness.ai/dev/adr/0081-group-management-uses-channel-authority.md) - [Computer Target is profile-scoped: local by default, container for headless hosts](https://botharness.ai/dev/adr/0082-computer-target-is-profile-scoped-local-by-default.md) - [Bot Screens are window-scoped work surfaces; per-Bot displays are an experimental opt-in](https://botharness.ai/dev/adr/0083-bot-screens-are-window-scoped-first-displays-experimental.md) - [Memory continuity is agent-mediated Git plus Portability](https://botharness.ai/dev/adr/0084-memory-continuity-is-agent-git-plus-portability.md) - [PersonaBot Profile is a popover plus a Channel-body view with registered Profile Cards](https://botharness.ai/dev/adr/0085-personabot-profile-is-a-popover-and-a-channel-body-view.md) - [Custom PersonaBot avatars are bounded data URLs served by a read route](https://botharness.ai/dev/adr/0086-custom-personabot-avatars-are-bounded-data-urls.md) - [DSH compatibility is a SemVer range whose floor is the verified host line](https://botharness.ai/dev/adr/0087-dsh-compatibility-is-a-semver-range-with-a-verified-floor.md) - [Memory files and evolution use separate Channel views](https://botharness.ai/dev/adr/0088-memory-files-and-evolution-are-separate-channel-views.md) - [Browser use is a profile-scoped managed Bot Browser](https://botharness.ai/dev/adr/0089-browser-use-is-a-profile-scoped-managed-bot-browser.md) - [Browser Access is per-PersonaBot; Browser Authorization is session-scoped and Human-owned](https://botharness.ai/dev/adr/0090-browser-access-is-per-personabot-authorization-is-session-scoped.md) - [Bot Tabs are window-scoped work surfaces on the shared Bot Browser](https://botharness.ai/dev/adr/0091-bot-tabs-are-window-scoped-work-surfaces.md) - [Memory changes enter Bot Inbox with durable observations](https://botharness.ai/dev/adr/0092-memory-changes-enter-bot-inbox-with-durable-observations.md) - [Model Presets are local snapshots; each Session owns its model route](https://botharness.ai/dev/adr/0093-model-presets-are-local-snapshots.md) - [Keep model usage as a Bot-owned retained statistic](https://botharness.ai/dev/adr/0094-retain-per-model-usage-after-session-deletion.md) - [Bot tabs are background tabs on the shared Bot Browser](https://botharness.ai/dev/adr/0095-bot-tabs-are-background-tabs-on-the-shared-bot-browser.md) - [Bot Browser profiles are named and assignable per PersonaBot](https://botharness.ai/dev/adr/0096-bot-browser-profiles-are-named-and-assignable-per-personabot.md) - [Memory recovery checkpoints separate observation from Git authorship](https://botharness.ai/dev/adr/0097-memory-recovery-checkpoints-separate-provenance-from-git-authorship.md) - [Activity Center separates overview from the personal Human Inbox](https://botharness.ai/dev/adr/0098-activity-center-separates-overview-and-human-inbox.md) - [A Human's all-Bot Group mention expands to ordinary direct mentions](https://botharness.ai/dev/adr/0099-human-all-bot-mention-expands-to-direct-mentions.md) - [File opening targets real Host files](https://botharness.ai/dev/adr/0100-file-open-actions-target-real-host-files.md) - [External Grants require authenticated accounts and checked targets](https://botharness.ai/dev/adr/0101-external-grants-require-authenticated-accounts-and-checked-targets.md) - [Model Channel reads budget content before consumption](https://botharness.ai/dev/adr/0102-model-channel-reads-budget-content-before-consumption.md) - [Local Human names label one stable identity across Channels](https://botharness.ai/dev/adr/0103-local-human-names-label-one-identity-across-channels.md) - [Isolated IM Profiles pin a qualified temporary provider fork](https://botharness.ai/dev/adr/0104-isolated-im-profiles-pin-a-qualified-temporary-provider-fork.md) - [Attachments use native file operations under their trusted source authority](https://botharness.ai/dev/adr/0105-attachments-use-native-file-operations-under-source-authority.md) - [Exclusive IM intake commits Bot Inbox before acknowledgement](https://botharness.ai/dev/adr/0106-exclusive-im-intake-commits-bot-inbox-before-acknowledgement.md) - [External files use trusted source capabilities and the existing Attachment owner](https://botharness.ai/dev/adr/0107-external-files-use-trusted-source-capabilities-and-existing-owner.md) - [Shared Channel bridges place canonical external sources](https://botharness.ai/dev/adr/0108-shared-channel-bridge-places-canonical-external-sources.md) - [External group collection is separate from wake](https://botharness.ai/dev/adr/0109-external-group-collection-is-separate-from-wake.md) - [External Thread following is scoped and explicit](https://botharness.ai/dev/adr/0110-external-thread-following-is-scoped-and-explicit.md) - [ADR-0111: External identity lifecycle is independent of conversation grants](https://botharness.ai/dev/adr/0111-external-identity-lifecycle-is-independent-of-grants.md) - [ADR-0112: Channel Bridge intake is managed at the existing grant](https://botharness.ai/dev/adr/0112-channel-bridge-intake-is-managed-at-the-existing-grant.md) - [ADR-0113: Shared external traffic uses member Channel harvest](https://botharness.ai/dev/adr/0113-shared-external-traffic-uses-member-channel-harvest.md) - [ADR-0114: Browser targets share capabilities with separate execution worlds](https://botharness.ai/dev/adr/0114-browser-targets-share-capabilities-with-separate-execution-worlds.md) - [ADR-0115: Explicit Inbox sharing adds a canonical Channel placement](https://botharness.ai/dev/adr/0115-explicit-inbox-sharing-adds-canonical-placement.md) - [ADR-0116: Daily Browser tabs use explicit ephemeral borrowing](https://botharness.ai/dev/adr/0116-daily-browser-tabs-use-explicit-ephemeral-borrowing.md) - [ADR-0117: External-only reports use owned Outbox correspondence](https://botharness.ai/dev/adr/0117-external-only-reports-use-owned-outbox-correspondence.md) - [Editable Avatar appearance is independent of activity presentation](https://botharness.ai/dev/adr/0118-editable-avatar-appearance-is-independent-of-activity.md) - [External platform defaults retain explicit inheritance](https://botharness.ai/dev/adr/0119-external-platform-defaults-retain-explicit-inheritance.md) - [Multiple Bridge routes retain canonical sources](https://botharness.ai/dev/adr/0120-multiple-bridge-routes-retain-canonical-sources.md) - [ADR-0121: Daily Chrome control is bound to one selected document](https://botharness.ai/dev/adr/0121-daily-chrome-control-is-bound-to-one-selected-document.md) - [ADR-0122: Shared-source replies use responder-owned authorization](https://botharness.ai/dev/adr/0122-shared-source-replies-use-responder-owned-authorization.md) - [ADR-0123: Daily Chrome Profile control uses explicit persistent pairing](https://botharness.ai/dev/adr/0123-daily-chrome-profile-control-is-an-explicit-persistent-pairing.md) - [ADR-0124: Local Browser drivers share Host authority](https://botharness.ai/dev/adr/0124-local-browser-drivers-share-host-authority.md) - [ADR-0125: Nearby context combines time coverage with count minima](https://botharness.ai/dev/adr/0125-nearby-context-combines-time-coverage-and-count-minima.md) - [ADR-0126: Slack text intake uses an exclusive checked Provider](https://botharness.ai/dev/adr/0126-slack-text-intake-uses-exclusive-checked-provider.md) - [Product artifacts compose an independently versioned IM Provider](https://botharness.ai/dev/adr/0127-product-artifacts-compose-an-independently-versioned-im-provider.md) - [ADR-0128: Discord checked replies preserve native child-channel routing](https://botharness.ai/dev/adr/0128-discord-checked-replies-preserve-native-child-channel-routing.md) - [ADR-0129: WeChat owner DMs use private source continuations](https://botharness.ai/dev/adr/0129-wechat-owner-dms-use-private-source-continuations.md) - [Deletion preserves history and makes Memory erasure explicit](https://botharness.ai/dev/adr/0130-deletion-preserves-history-and-makes-memory-erasure-explicit.md) - [The Bot Marketplace starts as a GitHub-indexed catalog](https://botharness.ai/dev/adr/0131-bot-marketplace-starts-as-a-github-indexed-catalog.md) - [Anonymous PostHog telemetry and campaign short links](https://botharness.ai/dev/adr/0132-anonymous-posthog-telemetry-and-campaign-short-links.md) - [Bot Schedules wake the Orchestrator through the Bot Inbox](https://botharness.ai/dev/adr/0133-bot-schedules-wake-the-orchestrator-through-the-bot-inbox.md) - [Soul and Core Memory are Session-frozen system prompt files](https://botharness.ai/dev/adr/0134-soul-and-core-memory-are-session-frozen-system-prompt-files.md) - [A Bot moves between people as a zip of its Memory files](https://botharness.ai/dev/adr/0135-a-bot-moves-between-people-as-a-zip-of-its-memory-files.md) - [Lark pairing is reviewed Bot-scoped operational authority](https://botharness.ai/dev/adr/0136-lark-pairing-is-reviewed-bot-scoped-operational-authority.md) - [Human Bridge media uses Channel authority and the existing Attachment owner](https://botharness.ai/dev/adr/0137-human-bridge-media-uses-channel-source-authority.md) - [Profiles hold shareable identity; configuration lives in the Channel sidebar](https://botharness.ai/dev/adr/0138-profiles-hold-shareable-identity-and-configuration-lives-in-the-channel-sidebar.md) - [ADR-0139: WeChat external reports use private owner context](https://botharness.ai/dev/adr/0139-wechat-external-reports-use-private-owner-context.md) - [The Host falls back to a Managed Git](https://botharness.ai/dev/adr/0140-the-host-falls-back-to-a-managed-git.md) - [Lark private approvals rejoin the native owner through checked controls](https://botharness.ai/dev/adr/0141-lark-private-approvals-rejoin-the-native-owner-through-checked-controls.md) - [A bound app admits its direct messages and mentions](https://botharness.ai/dev/adr/0142-a-bound-app-admits-its-direct-messages-and-mentions.md) - [An external conversation streams into a Channel as one-way context](https://botharness.ai/dev/adr/0143-an-external-conversation-streams-into-a-channel-as-one-way-context.md) - [Window Companions consume owned activity and scoped Bot output](https://botharness.ai/dev/adr/0144-window-companions-consume-owned-activity-and-scoped-output.md) - [ADR-0145: WeChat typing follows owned processing leases](https://botharness.ai/dev/adr/0145-wechat-typing-follows-owned-processing-leases.md) - [ADR-0146: Content Purge retains file selectors and settles issued effects](https://botharness.ai/dev/adr/0146-content-purge-retains-file-selectors-and-settles-issued-effects.md) - [ADR-0147: Onboarding is Profile progress over canonical DM evidence](https://botharness.ai/dev/adr/0147-onboarding-is-profile-progress-over-canonical-dm-evidence.md) - [Avatar Species and Custom Parts extend one pixel rig](https://botharness.ai/dev/adr/0148-avatar-species-and-custom-parts-extend-one-pixel-rig.md) - [ADR-0149: Lark feedback follows Admission and accepted source replies](https://botharness.ai/dev/adr/0149-lark-feedback-follows-admission-and-accepted-reply.md) - [Window Companion requests use their live owners](https://botharness.ai/dev/adr/0150-window-companion-requests-use-their-live-owners.md) - [QQ group replies use authenticated apps and process-local source proof](https://botharness.ai/dev/adr/0151-qq-group-replies-use-authenticated-apps-and-process-local-source-proof.md) - [QQ reception intervals record local observations](https://botharness.ai/dev/adr/0152-qq-reception-intervals-record-local-observations.md) - [Bot Settings is a BotHarness-owned modal; DSH settings only points into it](https://botharness.ai/dev/adr/0153-bot-settings-is-a-botharness-owned-modal.md) - [Bot Self-Records keep Memory commits and Bot actions where their cause happened](https://botharness.ai/dev/adr/0154-bot-self-records-keep-memory-commits-and-bot-actions-in-the-timeline-and-inbox.md) - [Onboarding tutorial is a floating interface walkthrough, auto-presented once and replayed from Bot Settings](https://botharness.ai/dev/adr/0155-onboarding-tutorial-is-a-floating-tour-replayed-from-bot-settings.md) - [Programmatic bot creation is a machine-first CLI over registry creation](https://botharness.ai/dev/adr/0156-programmatic-bot-creation-is-a-machine-first-cli-over-registry-creation.md) - [CLI model validation is tiered; key validity stays Host-side](https://botharness.ai/dev/adr/0157-cli-model-validation-is-tiered-key-validity-stays-host-side.md) - [secret-put writes credential refs by line-edit with backup and re-read](https://botharness.ai/dev/adr/0158-secret-put-writes-credential-refs-by-line-edit.md) - [Live CLI verbs ride the DSH HTTP unary carrier, never the database](https://botharness.ai/dev/adr/0159-live-cli-verbs-ride-the-dsh-http-carrier.md) - [DeepSeekBot default-bundles Browser, Computer and the IM Provider](https://botharness.ai/dev/adr/0160-deepseekbot-default-bundles-browser-computer-and-im-provider.md) - [CLI IM application authorization keeps Provider attempt authority](https://botharness.ai/dev/adr/0161-cli-im-authorization-keeps-provider-attempt-authority.md) - [Online CLI management keeps explicit Host authority](https://botharness.ai/dev/adr/0162-online-cli-management-keeps-explicit-host-authority.md) - [Local browser takeover reuses the Computer viewer family with an ask-permission handoff](https://botharness.ai/dev/adr/0163-local-browser-takeover-reuses-computer-viewer-family.md) - [Private input separates native credential storage from qualified execution](https://botharness.ai/dev/adr/0164-private-input-candidate-separates-native-storage-from-qualified-execution.md) - [Lark chat pairing is reviewed authority for the current Binding](https://botharness.ai/dev/adr/0165-lark-chat-pairing-is-reviewed-current-binding-authority.md) - [Private input settlement commits before continuation](https://botharness.ai/dev/adr/0166-private-input-settlement-commits-before-continuation.md) - [Private account versions fence consumption and revocation](https://botharness.ai/dev/adr/0167-private-account-versions-fence-consumption-and-revocation.md) - [ADR-0168: External groups are current scoped management authority](https://botharness.ai/dev/adr/0168-external-groups-are-current-scoped-management-authority.md) - [Private input interaction follows current turn Source Events](https://botharness.ai/dev/adr/0169-private-input-interaction-follows-current-turn-source-events.md) - [Private MCP consumption uses a fixed server and bounded projection](https://botharness.ai/dev/adr/0170-private-mcp-consumption-uses-fixed-server-and-bounded-projection.md) - [ADR-0171: Pairing cards check current review and delegation authority](https://botharness.ai/dev/adr/0171-pairing-cards-check-current-review-and-delegation-authority.md) - [IM private input keeps Owner Web authority and Source reply fences](https://botharness.ai/dev/adr/0172-im-private-input-keeps-owner-web-authority-and-source-reply-fences.md) - [ADR-0173: Group behavior items resolve by ID with explicit Deny](https://botharness.ai/dev/adr/0173-group-behavior-items-resolve-by-id-with-explicit-deny.md) - [ADR-0174: Slack DM chat pairing reuses current Binding authority](https://botharness.ai/dev/adr/0174-slack-dm-chat-pairing-reuses-current-binding-authority.md) - [ADR-0175: External tool rules retain current creator authority](https://botharness.ai/dev/adr/0175-external-tool-rules-retain-current-creator-authority.md) - [Work-failure alerts use committed facts and the existing management route](https://botharness.ai/dev/adr/0176-work-failure-alerts-use-committed-facts-and-management-route.md) - [Bot Primary Color is portable identity, not theme state](https://botharness.ai/dev/adr/0177-bot-primary-color-is-portable-identity-not-theme-state.md) - [File-open defaults are explicit Client preferences](https://botharness.ai/dev/adr/0178-file-open-defaults-are-explicit-client-preferences.md) - [The tail-following Channel window uses the journal stream; detached windows stay on timeline pages](https://botharness.ai/dev/adr/0179-tail-following-channel-window-uses-the-journal-stream.md) - [Onboarding is a getting-started checklist launched from a progress ring in the Bot-mode row](https://botharness.ai/dev/adr/0180-onboarding-is-a-checklist-launched-from-the-bot-mode-row.md) - [Application live streams use the native Remote stream carrier](https://botharness.ai/dev/adr/0181-application-live-streams-use-the-native-remote-stream-carrier.md) - [The Bot DM is the Bot's timeline, so its actions elsewhere also appear there](https://botharness.ai/dev/adr/0182-the-bot-dm-is-the-bot-timeline.md) - [The desktop Channel sidebar is tabbed, and configuration lives in Channel settings](https://botharness.ai/dev/adr/0183-channel-sidebar-is-tabbed-and-configuration-lives-in-channel-settings.md) - [ADR-0184: Client-local composer recovery is not message authority](https://botharness.ai/dev/adr/0184-client-local-composer-recovery-is-not-message-authority.md) - [Diagnostic Bundles are local, redacted, read-only exports scoped by a message range](https://botharness.ai/dev/adr/0185-diagnostic-bundles-are-local-redacted-read-only-exports.md) - [Asks follow the Channel the task came from](https://botharness.ai/dev/adr/0186-asks-follow-the-channel-the-task-came-from.md) - [PersonaBots use a product preset with timed questions](https://botharness.ai/dev/adr/0187-personabots-use-a-product-preset-with-timed-questions.md) - [The Orchestrator triages its own Bot Inbox and curates its Assignments](https://botharness.ai/dev/adr/0188-orchestrator-triages-its-inbox-and-curates-assignments.md) - [Secret input is available in ordinary Profiles](https://botharness.ai/dev/adr/0189-secret-input-is-available-in-ordinary-profiles.md) - [Restoring a Memory commit is a new commit after a backup commit](https://botharness.ai/dev/adr/0190-memory-restore-is-a-new-commit-after-a-backup.md) - [A Bot runs a command-line tool with Owner secrets, one approved call at a time](https://botharness.ai/dev/adr/0191-a-bot-runs-a-command-line-tool-with-owner-secrets-per-approved-call.md) - [The Docker-protected Profile is removed](https://botharness.ai/dev/adr/0192-the-docker-protected-profile-is-removed.md) - [Full access also unconfines the Orchestrator](https://botharness.ai/dev/adr/0193-full-access-also-unconfines-the-orchestrator.md) - [The DeepSeekBot design system is StyleX tokens and components over DSH](https://botharness.ai/dev/adr/0194-deepseekbot-design-system-is-stylex-tokens-over-dsh.md) - [A Bot starts an MCP server with Owner secrets, one approved start at a time](https://botharness.ai/dev/adr/0195-a-bot-starts-an-mcp-server-with-owner-secrets-per-approved-start.md) - [Approved secret MCP servers can be remembered](https://botharness.ai/dev/adr/0196-approved-secret-mcp-servers-can-be-remembered.md) - [Reachable posts reuse Messaging authority and Outbox](https://botharness.ai/dev/adr/0197-reachable-posts-reuse-messaging-authority-and-outbox.md) - [A remembered secret MCP server serves every PersonaBot](https://botharness.ai/dev/adr/0198-a-remembered-secret-mcp-server-serves-every-personabot.md) - [Paired devices reach the Host through a same-listener device gateway](https://botharness.ai/dev/adr/0199-paired-devices-reach-the-host-through-a-same-listener-device-gateway.md) - [The mobile app reads live state over the DSH Remote stream socket](https://botharness.ai/dev/adr/0200-the-mobile-app-reads-live-state-over-the-dsh-remote-stream-socket.md) - [The mobile design system maps the Web roles onto native components](https://botharness.ai/dev/adr/0201-the-mobile-design-system-maps-web-roles-onto-native-components.md) - [Phone push is a content-free projection of the Human Inbox](https://botharness.ai/dev/adr/0202-phone-push-is-a-content-free-projection-of-the-human-inbox.md) - [Bot mode is a dockable layout that plugins extend with Dock panels](https://botharness.ai/dev/adr/0203-bot-mode-is-a-dockable-layout-that-plugins-extend-with-dock-panels.md) - [An exact total settles omitted usage buckets](https://botharness.ai/dev/adr/0204-an-exact-total-settles-omitted-usage-buckets.md) - [Bot Sessions follow DSH's permission mode for Shell and plugin tools](https://botharness.ai/dev/adr/0205-bot-sessions-follow-dsh-permission-mode-for-shell-and-plugin-tools.md) - [A Bot's typed @Name resolves to one Group member, and mention de-duplication is per sender](https://botharness.ai/dev/adr/0206-a-bot-s-typed-mention-resolves-to-a-group-member.md) - [An Approval Template lets a reviewer Session answer a Bot's tool approvals](https://botharness.ai/dev/adr/0207-an-approval-template-lets-a-reviewer-session-answer-tool-approvals.md) - [`secret_cli` can be always allowed per program and account](https://botharness.ai/dev/adr/0208-secret-cli-can-be-always-allowed-per-program-and-account.md) - [Selkies WebRTC is switched on per phone call over the tailnet](https://botharness.ai/dev/adr/0209-selkies-webrtc-is-switched-on-per-phone-call-over-the-tailnet.md) - [The phone watches the local Computer through a screenshot stream](https://botharness.ai/dev/adr/0210-the-phone-watches-the-local-computer-through-a-screenshot-stream.md) - [The mobile app has two tabs, with Settings and Hosts in the header](https://botharness.ai/dev/adr/0211-the-mobile-app-has-two-tabs-with-settings-and-hosts-in-the-header.md) - [A Bot creates a PersonaBot through an Orchestrator tool over Registry creation](https://botharness.ai/dev/adr/0212-a-bot-creates-a-personabot-through-an-orchestrator-tool-over-registry-creation.md) - [Phone push shows the Channel and a short preview](https://botharness.ai/dev/adr/0213-phone-push-shows-the-channel-and-a-short-preview.md) - [Mobile statistics default on with an independent install ID](https://botharness.ai/dev/adr/0214-mobile-statistics-use-explicit-consent-and-an-independent-install-id.md) - [DSB product versions identify immutable package sets](https://botharness.ai/dev/adr/0216-dsb-product-versions-identify-immutable-package-sets.md) - [ADR-0217: IM conversation mirroring is an opt-in projection](https://botharness.ai/dev/adr/0217-im-conversation-mirroring-is-an-opt-in-projection.md) - [ADR-0218: Quick model selection only customizes the Orchestrator](https://botharness.ai/dev/adr/0218-quick-model-selection-only-customizes-the-orchestrator.md) - [Mobile presentation keeps caches and stream buffers local](https://botharness.ai/dev/adr/0219-mobile-presentation-keeps-caches-and-stream-buffers-local.md) - [ADR-0220: One Sessions panel with explicit Bot or Channel scope](https://botharness.ai/dev/adr/0220-one-sessions-panel-with-explicit-bot-or-channel-scope.md) - [ADR-0221: Global and Channel workspaces own panel placement](https://botharness.ai/dev/adr/0221-global-and-channel-workspaces-own-panel-placement.md) - [ADR-0222: Channel workspace persists a nested split tree](https://botharness.ai/dev/adr/0222-channel-workspace-persists-a-nested-split-tree.md) - [ADR-0223: Tob is a protected local PersonaBot behind a global Home](https://botharness.ai/dev/adr/0223-tob-is-a-protected-local-personabot.md) - [ADR-0224: Tob management uses a scoped native Shell CLI journey](https://botharness.ai/dev/adr/0224-tob-management-uses-scoped-native-shell-cli.md) - [ADR-0225: Bot creation receipts and reviewed profile lifecycle](https://botharness.ai/dev/adr/0225-bot-creation-receipts-and-reviewed-profile-lifecycle.md) - [ADR-0226: Group management receipts preserve Channel authority](https://botharness.ai/dev/adr/0226-group-management-receipts-preserve-channel-authority.md) - [ADR-0227: Group send review shares the Channel commit transaction](https://botharness.ai/dev/adr/0227-group-send-review-shares-the-channel-commit.md) - [Mobile chat backgrounds are transactional device-local presentation](https://botharness.ai/dev/adr/0228-mobile-chat-backgrounds-are-transactional-device-local-presentation.md) - [ADR-0229: Mobile cloud sessions are independent of Host pairing](https://botharness.ai/dev/adr/0229-mobile-cloud-sessions-are-independent-of-host-pairing.md) - [ADR-0230: Cloud Agent connections use native Credentials and Messaging](https://botharness.ai/dev/adr/0230-cloud-agent-connections-use-native-credentials-and-messaging.md) - [ADR-0231: Busy Group review has an explicit progress boundary](https://botharness.ai/dev/adr/0231-busy-group-review-has-an-explicit-progress-boundary.md) - [ADR-0232: Group recovery retains authorized commit receipts](https://botharness.ai/dev/adr/0232-group-recovery-retains-authorized-commit-receipts.md) - [ADR-0233: Desktop onboarding follows Tob creation receipts](https://botharness.ai/dev/adr/0233-desktop-onboarding-follows-tob-creation-receipts.md) - [Panels are native Plugins with independent binding](https://botharness.ai/dev/adr/0234-panels-are-native-plugins-with-independent-binding.md) - [ADR-0235: Mobile creation shares the existing tab navigator](https://botharness.ai/dev/adr/0235-mobile-creation-shares-the-existing-tab-navigator.md) - [ADR-0236: DeepSeekBot appearance is Client-local and scoped](https://botharness.ai/dev/adr/0236-deepseekbot-appearance-is-client-local-and-scoped.md) - [Desktop whole-window zoom is Client-owned](https://botharness.ai/dev/adr/0237-desktop-window-zoom-is-client-owned.md) - [Workspace request approval commits write authority with the Channel decision](https://botharness.ai/dev/adr/0238-workspace-request-approval-commits-write-authority-with-the-channel-decision.md) - [Three-action tool approval and Full Access use native ask](https://botharness.ai/dev/adr/0239-three-action-tool-approval-and-full-access-use-native-ask.md) - [Marketplace listings localize author-first, with generated summaries as the fallback](https://botharness.ai/dev/adr/0240-marketplace-listings-localize-author-first-with-generated-summaries.md) - [Hosted Connect reaches the Host through a managed tunnel](https://botharness.ai/dev/adr/0241-hosted-connect-reaches-the-host-through-a-managed-tunnel.md) - [A browser pairs Remote Hosts through their device gateway](https://botharness.ai/dev/adr/0242-a-browser-pairs-other-computers-through-their-device-gateway.md) - [Every client reads every Host through one Host Feed, and notification preferences belong to the device](https://botharness.ai/dev/adr/0243-every-client-reads-every-host-through-one-host-feed.md) - [Connect encrypts device traffic against pinned Host keys](https://botharness.ai/dev/adr/0244-connect-encrypts-device-traffic-against-pinned-host-keys.md) - [Local Computer video separates media, control and durable pause](https://botharness.ai/dev/adr/0245-local-computer-video-separates-media-control-and-pause.md) - [SSH tunnels preserve paired Host authority](https://botharness.ai/dev/adr/0246-ssh-tunnels-preserve-paired-host-authority.md) - [Bot creation and import recover on their chosen Host](https://botharness.ai/dev/adr/0247-bot-creation-and-import-recover-on-their-chosen-host.md) - [Tobs rebrands the product while preserving existing entry points](https://botharness.ai/dev/adr/0248-tobs-rebrands-the-product-while-preserving-existing-entry-points.md) - [Every approval card can save explicit tool authorization](https://botharness.ai/dev/adr/0249-every-approval-card-can-save-explicit-tool-authorization.md) - [Explicit messages and optional turn conclusion](https://botharness.ai/dev/adr/0250-explicit-messages-and-optional-turn-conclusion.md) - [ADR-0251: Independent Subagent preset selection](https://botharness.ai/dev/adr/0251-independent-subagent-preset-selection.md) - [ADR-0252: Native Subagent reports enter the owning Bot Runtime](https://botharness.ai/dev/adr/0252-native-subagent-reports-enter-the-owning-bot-runtime.md) - [Connection onboarding targets the owning Client](https://botharness.ai/dev/adr/0253-connection-onboarding-targets-the-owning-client.md) - [Message Feedback separates private evidence from anonymous telemetry](https://botharness.ai/dev/adr/0254-message-feedback-separates-private-evidence-from-telemetry.md) - [ADR-0255: Live Activities project one admitted DM request](https://botharness.ai/dev/adr/0255-live-activities-project-one-admitted-dm-request.md) - [Message Feedback sends ratings and keeps diagnostics local](https://botharness.ai/dev/adr/0256-message-feedback-sends-ratings-and-keeps-diagnostics-local.md) - [Profile Backup compatibility is owned by the data contract](https://botharness.ai/dev/adr/0257-profile-backup-compatibility-is-owned-by-the-data-contract.md) - [Foreign key orphans do not block the operational database](https://botharness.ai/dev/adr/0258-foreign-key-orphans-do-not-block-the-operational-database.md) - [ADR-0259: Desktop layout has Simple and Advanced modes](https://botharness.ai/dev/adr/0259-desktop-layout-has-simple-and-advanced-modes.md) - [Delegated Subagents follow their root Session's full access](https://botharness.ai/dev/adr/0260-delegated-subagents-follow-their-root-full-access.md) - [Bot messages wake colleagues on every round; a runaway-only hop limit bounds the chain](https://botharness.ai/dev/adr/0261-direct-bot-mentions-wake-every-round.md) - [Assignments carry a Title and a Description instead of one purpose](https://botharness.ai/dev/adr/0262-assignments-carry-a-title-and-description.md) - [Prompt Presets edit the behavior text of prompts, not their contracts, and apply per Session](https://botharness.ai/dev/adr/0263-prompt-presets-edit-behavior-text-not-contracts.md) - [Mobile motion uses each platform's springs](https://botharness.ai/dev/adr/0264-mobile-motion-uses-each-platforms-springs.md) - [ADR-0265: Orchestrators delegate through Assignments](https://botharness.ai/dev/adr/0265-orchestrators-delegate-through-assignments.md) - [Mobile design tokens have a shared layer and a layer per platform](https://botharness.ai/dev/adr/0266-mobile-design-tokens-have-a-shared-layer-and-a-layer-per-platform.md) - [The Bot Marketplace hosts Uploaded Bots under Connect accounts](https://botharness.ai/dev/adr/0267-the-bot-marketplace-hosts-uploaded-bots-under-connect-accounts.md) - [ADR-0268: Tob Mode replaces Home](https://botharness.ai/dev/adr/0268-tob-mode-replaces-home.md) - [ADR-0269: Simple layout keeps Messages and switches a Side column](https://botharness.ai/dev/adr/0269-simple-layout-keeps-messages-and-switches-a-side-column.md) - [ADR-0270: Telemetry events follow one tracking plan](https://botharness.ai/dev/adr/0270-telemetry-events-follow-one-tracking-plan.md) - [ADR-0271: Android profile dragging keeps the real scene](https://botharness.ai/dev/adr/0271-android-profile-drag-keeps-the-real-scene.md) - [ADR-0272: Settings is a mobile tab](https://botharness.ai/dev/adr/0272-settings-is-a-mobile-tab.md) - [ADR-0273: iOS workspace pages retain the complete Chats shell](https://botharness.ai/dev/adr/0273-ios-workspace-pages-retain-the-chats-shell.md) - [ADR-0274: Disbanding a group deletes its content](https://botharness.ai/dev/adr/0274-disbanding-a-group-deletes-its-content.md) - [QQ ordinary collection retains negotiated direct attachments](https://botharness.ai/dev/adr/0275-qq-ordinary-media-retains-negotiated-attachments.md) - [Messaging owns external readiness and receiving evidence](https://botharness.ai/dev/adr/0276-messaging-owns-external-readiness-and-reception-evidence.md) - [Cross-Host Bot DMs use online communication without outgoing queues](https://botharness.ai/dev/adr/0277-cross-host-bot-dms-use-online-communication-without-outgoing-queues.md) - [ADR-0278: Android selects its Noise key-agreement implementation](https://botharness.ai/dev/adr/0278-android-noise-key-agreement.md) - [ADR-0279: Interrupted Human DM turns continue in their Session](https://botharness.ai/dev/adr/0279-interrupted-dm-turns-continue-in-their-session.md) - [ADR-0280: TTS Providers and Bot voice messages](https://botharness.ai/dev/adr/0280-tts-providers-and-bot-voice-messages.md) - [ADR-0281: Host-owned Bot calls with built-in VAD and ASR Providers](https://botharness.ai/dev/adr/0281-host-owned-bot-calls.md) - [ADR-0282: Humans stop Sessions, not Bots from the composer](https://botharness.ai/dev/adr/0282-humans-stop-sessions-not-the-composer.md) - [ADR-0283: Bot-deployed local speech service](https://botharness.ai/dev/adr/0283-bot-deployed-local-speech-service.md) - [ADR-0284: Android Bot calls are foreground only](https://botharness.ai/dev/adr/0284-android-bot-calls-are-foreground-only.md) - [ADR-0285: Bot calls keep running in the background, with a Live Activity and a call or media audio choice](https://botharness.ai/dev/adr/0285-bot-calls-keep-running-in-the-background.md) - [ADR-0286: Video and screen-share calls send keyframe grids, not video](https://botharness.ai/dev/adr/0286-call-keyframe-grids.md) - [ADR-0287: A Bot zooms into a call grid cell with call_frame](https://botharness.ai/dev/adr/0287-call-frame-zoom.md) - [ADR-0288: Silent stretches become frame records, and frame saving can be turned off](https://botharness.ai/dev/adr/0288-call-frame-records.md) - [ADR-0289: Desktop and Web calls share the camera through the call route](https://botharness.ai/dev/adr/0289-desktop-call-camera.md) - [ADR-0290: Desktop and Web calls share a screen or window](https://botharness.ai/dev/adr/0290-desktop-call-screen.md) - [ADR-0291: iPhone calls share the camera through the same call route](https://botharness.ai/dev/adr/0291-ios-call-camera.md) - [ADR-0292: Attachments are content-versioned, cached as immutable, and served with thumbnails](https://botharness.ai/dev/adr/0292-attachments-are-versioned-and-cached-with-thumbnails.md) - [ADR-0293: Changes to placed messages are logged by database triggers](https://botharness.ai/dev/adr/0293-placed-message-changes-are-logged-by-database-triggers.md) - [ADR-0294: The phone's local message store is SQLite without an ORM](https://botharness.ai/dev/adr/0294-phone-local-store-is-sqlite-without-an-orm.md) - [ADR-0295: An Assignment stays active until its Orchestrator archives it](https://botharness.ai/dev/adr/0295-assignments-stay-active-until-archived.md) - [ADR-0296: Connect sign-in collects email codes in the app](https://botharness.ai/dev/adr/0296-connect-sign-in-collects-email-codes-natively.md) - [ADR-0297: Machine Assignment dispatch separates creation, delivery and processing](https://botharness.ai/dev/adr/0297-machine-assignment-dispatch-separates-creation-delivery-and-processing.md) - [Android local alerts share one native arbitration boundary with cloud push](https://botharness.ai/dev/adr/0298-android-local-alerts-share-native-arbitration.md) - [ADR-0299: Android calls share the camera through the same call route](https://botharness.ai/dev/adr/0299-android-call-camera.md) - [GenUI is ordinary message content with private exploration](https://botharness.ai/dev/adr/0300-genui-is-ordinary-message-content.md) - [GenUI rich documents use isolated HTML](https://botharness.ai/dev/adr/0301-genui-rich-documents-use-isolated-html.md) - [ADR-0302: GenUI diagrams compile before publication](https://botharness.ai/dev/adr/0302-genui-diagrams-compile-before-publication.md) - [ADR-0303: Call grids tile balanced rows of at most three](https://botharness.ai/dev/adr/0303-call-grids-tile-balanced-rows.md) - [ADR-0304: Call frames are harvested into a timeline without loss](https://botharness.ai/dev/adr/0304-call-frame-harvest.md) - [ADR-0305: Android Bot calls keep running in the background](https://botharness.ai/dev/adr/0305-android-bot-calls-keep-running-in-the-background.md) - [ADR-0306: Direct CLI calls create and continue Orchestrator-owned Assignments](https://botharness.ai/dev/adr/0306-direct-cli-calls-reach-orchestrator-owned-assignments.md) - [ADR-0307: Call keyframes are picked by perceptual hash, with a local check on screens](https://botharness.ai/dev/adr/0307-call-keyframes-pick-by-perceptual-hash.md) - [ADR-0308: Call grid labels sit in a strip above each tile](https://botharness.ai/dev/adr/0308-call-grid-labels-sit-above-tiles.md) - [Private relay admission does not replace Host device authority](https://botharness.ai/dev/adr/0309-private-relay-keeps-host-device-authority.md) - [ADR-0310: Desktop Bot calls keep running when the window is hidden](https://botharness.ai/dev/adr/0310-desktop-bot-calls-keep-running-when-hidden.md) - [ADR-0311: In-app updates are Host-owned runs that every surface shares](https://botharness.ai/dev/adr/0311-in-app-updates-are-host-owned-runs.md) - [ADR-0312: Notifications follow where the Human is attending](https://botharness.ai/dev/adr/0312-notifications-follow-human-attention.md) - [Connect tunnels share a multi-zone pool with eviction](https://botharness.ai/dev/adr/0313-connect-tunnels-share-a-multi-zone-pool-with-eviction.md) - [ADR-0314: Tob runs every CLI command, and every write waits for approval](https://botharness.ai/dev/adr/0314-tob-runs-every-cli-command-with-approved-writes.md) - [ADR-0315: A desktop call is alive while its heartbeat or its WebRTC connection is, and notices restore the window through a relaunch](https://botharness.ai/dev/adr/0315-desktop-call-alive-while-heartbeat-or-webrtc-is.md) - [Host capabilities degrade, or fail with HOST_INCOMPATIBLE](https://botharness.ai/dev/adr/0316-host-capabilities-degrade-or-fail-with-host-incompatible.md) - [ADR-0317: Calls play no automatic acknowledgement](https://botharness.ai/dev/adr/0317-calls-play-no-automatic-acknowledgement.md) - [ADR-0318: Steering delivers input first and scans Memory off the Host thread](https://botharness.ai/dev/adr/0318-steering-scans-memory-off-the-host-thread.md) - [ADR-0319: Android message targets acknowledge native bounds](https://botharness.ai/dev/adr/0319-android-message-targets-acknowledge-native-bounds.md) - [ADR-0320: Android RecyclerView keeps inverted coordinates](https://botharness.ai/dev/adr/0320-android-recycler-keeps-inverted-coordinates.md) - [ADR-0321: Android Markdown windowing has an opt-in native geometry owner](https://botharness.ai/dev/adr/0321-android-markdown-windowing-has-an-opt-in-native-geometry-owner.md) - [ADR-0322: Android text playback keeps conversation order in JavaScript](https://botharness.ai/dev/adr/0322-android-text-playback-keeps-conversation-order-in-javascript.md) - [ADR-0323: The iOS Conversation Timeline stays top-down](https://botharness.ai/dev/adr/0323-ios-conversation-timeline-stays-top-down.md) - [ADR-0324: The iOS Conversation Timeline uses a collection view with precomputed layout](https://botharness.ai/dev/adr/0324-ios-conversation-timeline-uses-a-collection-view-with-precomputed-layout.md) - [Phone and computer tolerate each other's older release](https://botharness.ai/dev/adr/0325-phone-and-computer-tolerate-each-others-older-release.md) - [ADR-0326: Connect password authentication stays with WorkOS](https://botharness.ai/dev/adr/0326-connect-password-authentication-stays-with-workos.md) - [ADR-0327: Connect account ownership authorizes enrollment](https://botharness.ai/dev/adr/0327-connect-account-ownership-authorizes-enrollment.md)