From fa5b3b3d029973b600a31941710834a397c78b93 Mon Sep 17 00:00:00 2001 From: Kishore Kumar Date: Fri, 23 Oct 2026 23:18:02 +0530 Subject: [PATCH 1/2] docs: match fleet setup recovery and dashboard controls --- billing/budgets.mdx | 10 +++++++--- changelog.mdx | 12 ++++++++++++ fleets/authoring.mdx | 29 ++++++++++++++++++++--------- fleets/connectors.mdx | 14 ++++++++++---- fleets/running.mdx | 17 +++++++++++------ fleets/secrets.mdx | 9 +++++++-- 6 files changed, 67 insertions(+), 24 deletions(-) diff --git a/billing/budgets.mdx b/billing/budgets.mdx index 88d6db3..61b1278 100644 --- a/billing/budgets.mdx +++ b/billing/budgets.mdx @@ -3,8 +3,8 @@ title: Fleet budgets description: Daily and monthly spending limits for one fleet. type: explanation audience: user -verified: 2026-10-19 -product_version: 0.62.1 +verified: 2026-10-23 +product_version: 0.65.0 executable: false --- @@ -27,7 +27,7 @@ Each limit is a decimal string of whole nanodollars. One dollar is `"1000000000" ## Why it exists -Every workspace under one tenant shares the same credit balance. A fleet budget stops one fleet from draining that shared balance. +Every workspace in one account shares the same credit balance. A fleet budget stops one fleet from draining that shared balance. The dashboard header shows what is left of that balance on every page, as a **Credits** chip beside the workspace switcher. It appears on screens at least 640px wide. Select the chip to open **Settings → Billing**, which holds the live figure and the charge history. @@ -53,6 +53,10 @@ If billing cannot answer, work continues and can exceed that bound. The full cha ### How charges are counted +In **Settings → Billing**, **Model** shows its published display name when available. **Usage** separates input and output counts. + +**Occurred** shows relative time; hover to see the exact timestamp. Unavailable usage stays marked as unavailable. + `agentsfleet` charges each provider request on its own line. A fleet run or setup chat also adds one run-time line for each stretch of time it ran. The charge history at `GET /v1/tenants/me/billing/charges` returns one row per line. Each request is priced at the rate in effect when it was made, and at the tier its whole prompt falls in. Cached reads, cache writes, and output each use their own rate. diff --git a/changelog.mdx b/changelog.mdx index cf3343f..f525447 100644 --- a/changelog.mdx +++ b/changelog.mdx @@ -7,6 +7,18 @@ description: "Stay up to date with the latest agentsfleet product updates, new f agentsfleet is in **stealth-mode testing** and pre-production. APIs and agent behavior may change between releases without long deprecation windows. Email [agentsfleet@agentmail.to](mailto:agentsfleet@agentmail.to) if you want a hand calibrating an agent or to join as a design partner. + + ## Keep fleet setup edits and recover failed replies + + Setup chat preserves manual edits when a newer proposal arrives. Review a conflict before updating instructions or saving. + + - **Recovery** — failed replies keep partial text and offer **Try again** when available. + - **Navigation** — saved fleets use their chosen names. Private drafts appear under **New fleet → Unfinished setups**. + - **Controls** — **Stop** and **Kill** share the fleet header menu and require confirmation. + - **Billing** — model display names, readable usage, and relative timestamps clarify each charge. + - **Settings** — compact secret tables and shared navigation styles match the dashboard. + + ## Edit fleet setup beside the conversation diff --git a/fleets/authoring.mdx b/fleets/authoring.mdx index 9b5bf6d..c1c27eb 100644 --- a/fleets/authoring.mdx +++ b/fleets/authoring.mdx @@ -4,7 +4,7 @@ description: Describe a fleet in a private chat, check its setup, and save it. type: how-to audience: user verified: 2026-10-23 -product_version: 0.64.0 +product_version: 0.65.0 executable: false --- @@ -35,15 +35,18 @@ Each chat message is charged to the workspace owner's balance. A message the bal 1. Open **New fleet** in the workspace sidebar. 2. Check the selected model, then describe the task. New chats select an available authoring model by default. Each reply can change the draft setup. -3. Open the chat's **… → Edit instructions**. Check the instructions and **Review and run options**. Keep chatting until the proposal matches your task. -4. Choose **Save fleet** beside the chat title. For an immediate first run, enter a message under **Optional first run** in the editor and choose **Save and run now**. +3. Open **Edit instructions manually** below the conversation. Review the instructions and **Review and publish options**. Keep chatting until the proposal matches your task. +4. Choose **Save fleet** beside the chat title. For an immediate first run, open **Review and publish options**, enter **Optional first run**, and choose **Save and run now**. 5. Saving opens the fleet conversation. Its sections are **Chat**, **Activity**, and **Memory**. The proposed setup creates no fleet and requests no run. **Save fleet** checks the current setup, then saves it. It requests no first run, but configured automatic triggers can start work once setup is ready. -**Edit instructions** opens a panel beside the chat, or across the screen on a phone. Your unsent chat message stays in place. +**Edit instructions manually** expands the editor below setup chat. Folding the editor keeps your unsaved text. -Choose **Update instructions** to apply manual edits to the draft, then **Save fleet** or **Save changes** beside the chat. **Cancel editing** discards unsubmitted edits. +Choose **Update instructions** to apply manual edits to the draft. Then choose **Save fleet** or **Save changes**. Unsaved manual edits block those save actions. + +An untouched editor follows changes from setup chat. If chat changes the setup during manual editing, your text remains available and a conflict blocks updates. +Choose **Discard manual changes and load latest** to replace that local text with the current proposal. The setup chat shows a compact saved-version summary. Setup and first-run warnings remain visible when setup needs attention. @@ -51,13 +54,19 @@ Keep unfinished setup steps and schedule registration warnings in view. Use the To change a saved fleet, choose **Edit setup** in its header. A private chat opens beside the fleet conversation, based on its saved setup revision. On a phone, the editor fills the page. -Describe the change, review it through **Edit instructions**, then choose **Save changes** beside the chat. +Describe the change, review it through **Edit instructions manually**, then choose **Save changes** below the setup composer. +Your unsent message in the fleet conversation stays in place. + New work uses the updated instructions; work already running keeps its current version. ### Recover a stopped or failed reply **Queued…** means your message is waiting to start. **Working…** means a reply has started. +A failed reply keeps any partial text and shows its failure message. Choose **Try again** when available to retry the original request. + +Open **View details** for diagnostics. A retry can incur another model charge. + If the provider outcome is uncertain, choose **Stop authoring**, then send a new message. Earlier usage stays under review, and its reserved balance can limit new work until accounting finishes. @@ -70,7 +79,9 @@ Stopping setup chat leaves saved fleets running. ### Find, rename, and delete setup chats -The sidebar lists fleets and your unsaved setup chats under **Recent**. Select a fleet to return to its conversation. +The sidebar lists saved fleets under **Fleets**. Select a fleet to return to its conversation. + +Open **New fleet → Unfinished setups** to resume a private unsaved chat. Only the person who started the chat can see it. A new chat is titled with the first line of your first message, cut to 100 characters. A chat started from a Definition or a Library revision takes the first line of its description. A chat with neither reads **New fleet**. @@ -80,7 +91,7 @@ You cannot rename a chat while a reply or Save is running, while earlier usage i To delete a chat, choose its delete action and confirm **Delete chat**. The private conversation is removed. Saved fleets keep running, and published Library revisions stay available. -Hover or focus a setup-chat row to read its full title and status. The editor identifies the saved fleet revision on which your changes are based. +Hover or focus an unfinished setup row to read its full title and status. The editor identifies the saved revision beneath your changes. ### In the terminal @@ -232,7 +243,7 @@ A Definition holds at most 8 triggers. One webhook allows 1 through 16 event nam Deleting a setup chat removes its private messages for good. Saved fleets keep running, and published Library revisions stay. -Delete a chat from the sidebar, with `/delete` in the terminal chat, or with `agentsfleet chat delete `. +Delete a chat from **Unfinished setups**, with `/delete` in the terminal chat, or with `agentsfleet chat delete `. Saving a fleet, or saving changes to one, closes its chat. `agentsfleet` keeps a closed chat and its messages for 30 days, then deletes them. The chat's `expires_at` field shows when. diff --git a/fleets/connectors.mdx b/fleets/connectors.mdx index d509dab..eb9ff86 100644 --- a/fleets/connectors.mdx +++ b/fleets/connectors.mdx @@ -3,8 +3,8 @@ title: Connect a provider description: Connect a workspace to GitHub, Slack, Zoho Desk, Jira, or Linear. type: how-to audience: user -verified: 2026-10-19 -product_version: 0.62.1 +verified: 2026-10-23 +product_version: 0.65.0 executable: false --- @@ -20,9 +20,15 @@ You must own the account that holds the workspace. You also need permission to connect the provider account. Supported providers are GitHub, Slack, Zoho Desk, Jira, and Linear. +**Connect apps** lists the providers offered by the platform. Opening this page creates no connection. + +**Connected** means the workspace holds saved connection data. Provider calls can still fail if that access expires or is revoked. + +If a provider needs platform setup, choose **Request access** to register your interest. This does not connect the provider. + ## Steps -1. Open **Settings → Integrations** in the dashboard. +1. Open the account menu and choose **Connect apps** in the dashboard. 2. Choose a provider and click **Connect**. @@ -63,7 +69,7 @@ One GitHub App installation can belong to only one workspace. Another workspace ## Remove or undo -Disconnect the connector from the Integrations page. `agentsfleet` removes the saved connection and stops routing that provider's events to the workspace. Deleting the connector's secret, such as `github`, does the same. +Disconnect the connector from **Connect apps**. `agentsfleet` removes the saved connection and stops routing that provider's events to the workspace. Deleting the connector's secret, such as `github`, does the same. Revoke the application from the provider's account settings. The next connector call fails and the dashboard asks for reconnection. diff --git a/fleets/running.mdx b/fleets/running.mdx index 51ca34a..8bc8eac 100644 --- a/fleets/running.mdx +++ b/fleets/running.mdx @@ -3,8 +3,8 @@ title: Run and control a fleet description: Inspect, message, stop, resume, kill, and delete a fleet. type: how-to audience: user -verified: 2026-10-19 -product_version: 0.62.1 +verified: 2026-10-23 +product_version: 0.65.0 executable: false --- @@ -12,6 +12,8 @@ executable: false These commands show fleet activity and change lifecycle state. Every command uses the active workspace. +The dashboard uses your chosen fleet name in **Your fleets** and the conversation header. Open a card to return to that fleet. + ## Before you begin Install a fleet. Copy its identifier from `agentsfleet list`. @@ -65,7 +67,7 @@ Install a fleet. Copy its identifier from `agentsfleet list`. If you scroll back, a turn someone else sends does not move you. Click **Jump to latest** to follow it. -4. Stop new work while keeping the fleet resumable. +4. Stop new work while keeping the fleet resumable. In the dashboard, open the fleet header’s **… → Stop** and confirm. ```bash agentsfleet stop @@ -121,9 +123,10 @@ A run with no reply may be waiting for approval. Run `agentsfleet approvals list A message with no answer after 30 seconds reads **Couldn't confirm this message was sent.** Click **Resend**. It carries the same `operation_id`, so the fleet runs the message once. -If a run fails while replying, open its event details in the dashboard and -click **Copy diagnostic**. The copy includes the event identifier and the -recorded failure cause. The chat keeps the failure message short. +A failed reply keeps any partial text in the conversation. Choose **Try again** when available to send the original request again. +A retry creates another run and can incur another charge. + +Open **View details** for diagnostics. Event details also offer **Copy diagnostic**, which includes the event identifier and recorded failure cause. A lifecycle command sends a write again only when the connection was refused, the name did not resolve, or the server declined it. A reset after sending or a timeout surfaces the error instead, because the server may have processed the write. Check `agentsfleet doctor`, then run the command again. @@ -150,6 +153,8 @@ and tool updates may remain missing. Stopping is reversible with `resume`. Killing is permanent but keeps the fleet records until deletion. +In the dashboard, choose **… → Kill** from the fleet header. Confirm the permanent action in the dialog. + Deleting removes all fleet records and cannot be undone. The client has no dry-run option for either command. ```bash diff --git a/fleets/secrets.mdx b/fleets/secrets.mdx index 627b443..4e7d08d 100644 --- a/fleets/secrets.mdx +++ b/fleets/secrets.mdx @@ -3,8 +3,8 @@ title: Manage secrets description: Store, replace, inspect, and delete workspace secrets. type: how-to audience: user -verified: 2026-10-19 -product_version: 0.62.1 +verified: 2026-10-23 +product_version: 0.65.0 executable: false --- @@ -82,6 +82,11 @@ Use `agentsfleet secret create` for a new name. ## Verify it works +In setup chat, ask to use the `api_token` field from the `stripe` secret for requests to `api.stripe.com`. + +Share the secret name and field, and keep the value out of chat. +Review the requested tools and access before saving. + Save a fleet that declares the secret name. If a required secret is missing, the fleet stays `installing`, and the readiness check names the secret to create. From 7e49bce266bdfc021af45f9e4db1cd7fde104981 Mon Sep 17 00:00:00 2001 From: Kishore Kumar Date: Fri, 23 Oct 2026 23:56:49 +0530 Subject: [PATCH 2/2] docs: correct setup directions and explain retry effects --- .orly/audits/spec-template.sh | 115 ++++------------------------------ .orly/audits/spec-template.ts | 45 +++++++++++-- .orly/dispatch/write_spec.md | 20 +++--- .orly/orly.json | 8 +-- bun.lock | 4 +- fleets/approvals.mdx | 5 +- fleets/authoring.mdx | 8 +-- fleets/overview.mdx | 4 +- fleets/running.mdx | 2 + fleets/slack.mdx | 10 +-- fleets/webhooks.mdx | 5 +- package.json | 2 +- 12 files changed, 90 insertions(+), 138 deletions(-) diff --git a/.orly/audits/spec-template.sh b/.orly/audits/spec-template.sh index aee0e1e..59bb435 100755 --- a/.orly/audits/spec-template.sh +++ b/.orly/audits/spec-template.sh @@ -1,35 +1,17 @@ #!/usr/bin/env bash -# spec-template.sh — enforce docs/TEMPLATE.md across every spec under -# docs/v*/{pending,active,done}/. Two check families: -# -# 1. PROHIBITED patterns (negative space) — TEMPLATE.md "Prohibited" section: -# time/effort estimates, effort/complexity columns, %-complete, owners, dates. -# Always BLOCK. -# 2. REQUIRED-PRESENT + NO-PLACEHOLDER (positive space) — the determinism -# sections the agent-facing template mandates (PR Intent, Applicable Gates, -# Prior-Art, Metrics, Decomposition, tiered Test Spec, Product Clarity, -# Discovery, …) must EXIST and carry content: no known unfilled slots and -# no surviving "tpl:" guidance comments (template fill grammar). A spec -# that omits them forces the executing agent to guess intent. This is the -# half that makes a spec "built for the agent". -# 2b. DECLARED-COMMAND PARITY — a pending/active spec's Acceptance Rubric -# must quote the repository's declared conform + applicable verify.* commands -# (.orly/orly.json) verbatim: the rubric and `orly gate` grade one -# boundary. Staged/file scope only; done/ specs stay historical. -# -# Dispatch façade: dispatch/write_spec.md (SPEC TEMPLATE GATE) -# Fires in: make lint (after audit-logging, before audit-error-codes). +# spec-template.sh — select specs and snapshot staged content for the shared +# validator in spec-template.ts. The native orly spec.gate criterion calls the +# same validator directly; this entry point serves script callers. +# Dispatch façade: dispatch/write_spec.md (SPEC TEMPLATE GATE). # # Modes: # --staged diff-scope: only specs in `git diff --cached` # --all (default) pending+active specs only — current/in-flight work # --include-done adds done/ specs to the scan (one-time sweep tool) # -# Family 2 runs in --staged and --file scope — the spec being authored/edited right -# now, which is exactly the agent's own output. The bulk scans (--all / -# --include-done) run Family 1 only, so they behave identically over the whole -# corpus and never break an existing spec. No legacy carve-out, no heuristics: -# author a spec → full template required; scan the tree → prohibited-only. +# Staged/file checks require complete sections, references, test mappings and +# declared commands. Bulk scans check prohibited patterns only. Bun is required +# for both scopes; bulk checks do not require repository command configuration. # # Done specs are excluded by default: historical artifacts, not work product. # Exits 0 clean, 1 on any blocking finding. @@ -44,7 +26,6 @@ cd "$ROOT" FAIL=0 fail() { printf "FAIL: %s\n" "$*" >&2; FAIL=1; } ok() { printf "OK: %s\n" "$*"; } -note() { printf "NOTE: %s\n" "$*"; } # Discover spec files in scope. case "$MODE" in @@ -62,8 +43,7 @@ case "$MODE" in while IFS= read -r s; do SPECS+=("$s"); done < <(find docs/v[0-9]* -type f -name '*.md' 2>/dev/null | grep -E '/(pending|active|done)/' || true) ;; --file|file) - # Single named spec, both families — the lifecycle engine's spec.gate - # criterion calls this so the engine and pre-commit share one enforcer. + # Single named spec, using the same checks as the native criterion. [[ -n "${2:-}" ]] || { printf "usage: %s --file \n" "$0" >&2; exit 64; } [[ -f "$2" ]] || { printf "FAIL: spec not found: %s\n" "$2" >&2; exit 1; } SPECS=("$2") @@ -79,70 +59,6 @@ if [[ ${#SPECS[@]} -eq 0 ]]; then exit 0 fi -# --------------------------------------------------------------------------- -# Family 1 — Prohibited patterns from docs/TEMPLATE.md "Prohibited" section. -# Each pattern: :: — the regex comes -# LAST because it may contain colons (e.g. the [:|] label-row class); read(1) -# assigns the remainder of the line to the final field, so the regex survives -# intact. Descriptions must stay colon-free. -# Severity: BLOCK = exit 1; INFO = stdout note only. Patterns use ERE (egrep -E) -# only — no PCRE constructs like (?:...), which grep -E rejects. -# -# DESIGN NOTE — patterns are deliberately structural, not prose-level. -# Bare regex like `\b\d+\s*days?\b` false-positives on legitimate prose -# ("Day 50", "≥7 days uptime", "within 3 days of install"). Instead we -# match where time/effort estimates LIVE structurally: -# - Section headings: `## Estimated effort`, `## Effort`, `## Sizing` -# - Label rows: `**Effort:** medium`, `**Owner:** alice` -# - Tilde-bulleted: `- ~2 h survey`, `* ~5 days OAuth setup` -# (the `~` prefix is Indy's idiom for effort estimates; -# legitimate prose doesn't use it) -# This catches the actual drift class without churning real content. -# --------------------------------------------------------------------------- -PATTERNS=( - 'BLOCK:Estimated effort section heading:^#+ .*Estimated [Ee]ffort' - 'BLOCK:Effort/Complexity/Sizing section heading:^#+ .*\b(Effort|Complexity|Sizing|Cost)\b\s*$' - 'BLOCK:Scale estimate section heading:^#+ .*\bScale\b.*estimate' - 'BLOCK:Tilde-bulleted hour estimate (e.g. "- ~2 h"):^[-*]\s*~\s*[0-9]+\s*h\b' - 'BLOCK:Tilde-bulleted time estimate:^[-*]\s*~\s*[0-9]+\s*(hours?|days?|min(utes?)?)\b' - 'BLOCK:Effort/Estimate label row:^\s*\*\*\s*(Effort|Estimate|Sizing|Complexity|Cost)\s*(:\s*\*\*|\*\*\s*[:|])' - 'BLOCK:Owner label row:^\s*\*\*\s*Owner\s*(:\s*\*\*|\*\*\s*[:|])' - 'BLOCK:Assigned-to label row:^\s*\*\*\s*Assigned to\s*(:\s*\*\*|\*\*\s*[:|])' - 'BLOCK:Date-bound deadline label:^\s*\*\*\s*(Due|Deadline)\s*(:\s*\*\*|\*\*\s*[:|])\s*[0-9]' - 'BLOCK:Percentage-complete metric:^[-*\|]?\s*\*?\*?\s*[0-9]+\s*%\s*complete' - 'BLOCK:Hour-range estimate in effort context:\b(effort|estimate|takes?|spend)\b[^.]{0,40}\b[0-9]+\s*[-–]\s*[0-9]+\s*h\b' - 'BLOCK:Effort/complexity rating:\b(low|medium|high|small|large)\s*[/|-]\s*(effort|complexity)\b' -) - -# Carve-outs — lines that look prohibited but are legitimate. Skip any match. -SAFE_LINES_RE='^\*\*Date:\*\*|^\s*```|