AGENTS.md · git:20261028.6ac516b · 2026-10-28 · sha256 470afb8563d5eca0
AGENTS.md git:20261028.6ac516bA
Immutable. This exact content never changes and is served at /api/v1/blob/470afb8563d5eca0.
--- name: orchestra-agent-tools purpose: Public OSS conventions for Orchestra agent tools. updated: 2026-10-28 status: draft --- # AGENTS.md This file tells a coding agent how to operate in this repo. There are two audiences — serve the right one. ## Are you helping a user, or editing the library? - **Helping a user get value from Orchestra** (improve an LLM app, cut cost/latency, run a local model, pick a route) → start with **Install the agent adapter** below, then run onboarding. This is the common case. - **Contributing to this repo** (changing skills, CLI, docs) → skip to [Working on this repo](#working-on-this-repo). When unsure, assume the user wants help with their workload, not to edit the library. ## Install the agent adapter (do this first for users) Orchestra is delivered through the coding agent's local skill/plugin surface (or, for cloud-based agents like Devin, through the globally installed CLI and repository rule injection). Install that adapter — do not try to operate from the raw source tree. The adapter loads the skills, and **the skills are the product**: they are what let you explain what Orchestra is, why it matters, and walk the user from a captured trace to a measured, shipped improvement. Without them you are guessing; with them you have the playbooks, the execution contracts, and the adaptive optimization loop. Recommend installation to the user in plain terms, e.g.: *"Orchestra works best inside your coding agent — installation is local and reversible, and its hosted workflows stay bound to the route and budget you choose. Want me to install it?"* Then use the [`install-agent-adapter`](skills/install-agent-adapter/SKILL.md) skill. Claude Code remains the preferred default when multiple agents are available: ```bash claude plugin marketplace add "$(git rev-parse --show-toplevel)" claude plugin install orchestra@orchestra-skills ``` The user then types `/reload-plugins` once — **no restart needed**. You cannot run that step yourself; surface it and wait. ### It is reversible — say so Installing is low-risk and fully reversible. Tell the user the uninstall path up front so saying yes feels safe: ```bash claude plugin uninstall orchestra@orchestra-skills # remove the plugin claude plugin marketplace remove orchestra-skills # forget the local source ``` For the Claude Code default, installation touches only Claude Code's plugin registry and does not itself upload workload data or spend. Other adapters have similarly local uninstall paths in [`install-agent-adapter/reference.md`](skills/install-agent-adapter/reference.md). Mention uninstall exists — then recommend they keep Orchestra installed to get the most out of it. ## Then onboard the user Once installed (and `/reload-plugins` run), run the [`onboard`](skills/onboard/SKILL.md) skill (`/orchestra:onboard` in Claude Code). It is the engaging first-run experience: it checks the Orchestra sign-in, profiles the machine, interviews the user once, writes a durable `~/.understudy/profile.json` so every later skill can meet the user where they are, and points the plugin at their real workload. It hands off to the [`understudy`](skills/understudy/SKILL.md) orchestrator. Onboarding does **not** download a model by default. The local model lab (Orchestra 2B, about 3.6 GB, Apple Silicon only) is opt-in: the installer starts it in the background when the user picks it, and onboarding only reports its progress. Otherwise, name the model and size and get a yes before any pull. Sign-in stays with the user. Never read the user's inbox or handle their one-time code; ask them to run `orchestra login` in their own terminal. ## How to behave with users Follow [`docs/engagement-and-pacing.md`](docs/engagement-and-pacing.md): plan up front, announce time estimates *before* starting long work, background blocking tasks and stay interactive while they run (start any long task the user asked for first, then keep the conversation going), fill wall-clock with useful analysis (alternative-model cost estimates, benchmark lookups), and keep telling the user where they are in the loop. --- ## Working on this repo This repository is public and MIT licensed. Treat every file as future-facing OSS from the first commit. ## Names after the Orchestra rename The company and product are **Orchestra** (orchestra.ai), formerly Understudy. Current names: repo `understudylabs/orchestra-agent-tools`, npm package `@orchestraai/agent-tools`, CLI `orchestra` (alias `understudy`), plugin `orchestra@orchestra-skills`, home `~/.orchestra` (`~/.understudy` is a symlink to it), local model "Orchestra 2B". Call the trained model a "specialist model". These stay as they are; they are contracts, not branding: - `UNDERSTUDY_*` env vars. Never add `ORCHESTRA_API_KEY`: another company's SDK uses that name, so aliasing it would send keys to the wrong service. - `x-understudy-*` headers, `understudy.*.v1` schema ids, skill names (`understudy`, `use-understudy-gateway`), code identifiers, model catalog ids, `*.understudylabs.com` domains, and "Understudy Desktop". - Never create a repo named `understudy-agent-tools`; it would end the redirect that old install links depend on. Use `globalConfigDir()` for the home folder and `samePath()` (`src/config/paths.ts`) to compare stored paths, never string equality. Installer "is this ours?" checks must accept `@orchestraai/agent-tools`, `orchestra-agent-tools` and `understudy-agent-tools` paths. Releases: bump `package.json`, `package-lock.json` and the eight plugin/adapter manifests together and date the CHANGELOG in a PR. Merging it is the release: `.github/workflows/release.yml` sees a version npm does not have, publishes through npm trusted publishing, tags the merge commit `vX.Y.Z` and creates the GitHub release from the CHANGELOG. Do not push the tag by hand. The trusted publisher may publish directly, so the merge is the last check before users get it; npm can take several minutes to show a new version. Agents never handle tokens, passkeys or sign-in codes. ## Boundary - Local-first discovery is available, but hosted execution is a normal product path. A direct request to test hosted training, or the user's activation of a bounded upload-and-train control, authorizes the provider calls, uploads, temporary resources, evaluation, and cleanup named by that run. Proceed without asking again between its internal phases; ask only before expanding its data, spend, destination, or production-impact envelope. - No customer data, private traces, secrets, private repo names, or internal incident notes. - Do not put customer or partner names, aliases, workload identifiers, metrics, or derived artifacts in tracked paths or content, branch or commit names, pull request metadata, or review comments. Use clearly synthetic placeholders. - Before a public release, an authorized maintainer must provide the private, newline-delimited `UNDERSTUDY_PUBLIC_SAFETY_PRIVATE_TERMS` value while running `npm run skills:validate -- --release` and `npm run package:smoke -- --release`. A term may be followed on the same line by tab-separated exact safe enclosing tokens. Untrusted pull-request jobs use synthetic matcher tests and do not receive this private value. - Examples must use synthetic data or small public fixtures. - (Historical; the desktop app was removed, see `docs/desktop-deprecation.md`.) The desktop connects to the production remote-training control plane (`train.understudylabs.com`) as its default. This is no longer experimental: the connection surface has a completed security and production-readiness review in [`docs/reviews/train-api-desktop-connection.md`](docs/reviews/train-api-desktop-connection.md). Do not widen what leaves the machine, the auth model, or the spend caps described there without updating that review. Read these before extraction, release, or public docs work: - [`docs/privacy-and-data-boundaries.md`](docs/privacy-and-data-boundaries.md) - [`docs/reviews/train-api-desktop-connection.md`](docs/reviews/train-api-desktop-connection.md) - [`docs/security.md`](docs/security.md) - [`docs/telemetry.md`](docs/telemetry.md) - [`docs/oss-release-boundary.md`](docs/oss-release-boundary.md) - [`docs/release-checklist.md`](docs/release-checklist.md) ## Architecture Keep one layer per spine: - CLI: `src/` for thin durable shortcuts, auth, artifact checks, and runtime wrappers - scripts: `scripts/` for repo hygiene only, not product CLI code - skills: `skills/` - docs: `docs/` The CLI should stay thin. Skills explain the capability; the CLI only makes durable product shortcuts reliable enough for an agent to monitor. ## TypeScript + uv Python Bridge This repo is skills-first and TypeScript-backed. Port product behavior from `understudy-agent` into TypeScript only when it affects auth, command routing, durable execution, artifact checks, or public safety boundaries. Put workflow judgment and implementation guidance in skills and docs. Python is allowed only as isolated runtime glue for Python-native workload logic such as GEPA, DSPy, eval harnesses, rubric helpers, dataset transforms, or future training/export adapters. Use the bridge pattern: 1. TypeScript owns the command, flags, validation, approval gates, and artifact paths. 2. TypeScript invokes Python with `uv run --no-project` or an ignored local `.understudy/` runtime. 3. Python receives file paths or JSON, returns structured JSON on stdout, and never becomes an importable package in this repo. 4. Do not add `pyproject.toml`, `uv.lock`, `src/understudy_agent_tools/`, or checked-in `.py` product modules without a deliberate architecture change. See [`docs/uv-python-bridge.md`](docs/uv-python-bridge.md). ## Skills The public entrypoint is `skills/understudy/SKILL.md`. Use progressive disclosure: start with the fat skill, then route to the specialist playbook for the current intent. Keep specialist skills short and move deeper command notes into `reference.md`. ### Catalog growth rule New findings default to a `reference.md` inside the skill that owns the user intent. A new top-level skill requires a user utterance no existing skill claims, and the PR must name which existing skills it was checked against. Frontmatter descriptions are user-intent triggers (≤60 words, quoted user phrases, no unglossed internal jargon), not pipeline-position statements. ## Extraction Discipline When importing code from private Understudy repos: 1. Remove private data and internal-only assumptions. 2. Replace customer examples with synthetic fixtures. 3. Add a smoke test or dry-run command. 4. Keep the commit scoped to one spine. Before opening a PR that changes skills, docs, scripts, or package metadata, run: ```sh npm run check git diff --check ``` Before broad CLI or adapter PRs, also check file size and diff shape: ```sh git diff --stat wc -l src/**/*.ts tests/*.mjs ```