01
OF 05
▷ aisquare / asq
v0.6.0 · shipping MIT · local-first

Govern a fleet of coding agents by talking to one of them.

Type asq and you get one full-screen view over every project you have registered and every agent running in it. On the right sits a manager you task in prose. It turns your goal into contracts, spawns coders, testers and reviewers, reopens what fails, and posts READY with the PRs and the evidence — then stops, because the merge is a human's.

$curl -fsSL https://raw.githubusercontent.com/AISquare-Studio/aisquare-cli/main/install.sh | sh

One line, on macOS, Linux and WSL2. It works out what the machine already has, installs only the gaps — uv, a private Python, tmux, git, gh, Node, Claude Code — registers the repo you ran it in, wires the hooks, and offers to open the UI. Run it again and it installs nothing.

payments-api · right now

🧭manager▶ 🔨coder-idempotency▶ 🔨coder-webhooks🔔 NEEDS YOU 🧪tester-1▶ 👀reviewer-1⏸ 🔨coder-retries💤 PR #412

Six real Claude Code sessions, one window. Click one and every key you type goes to the session itself — nothing is relayed or re-rendered as a chat. Close the UI and they all keep running.

Memoryeveryone · zero commands

Every session begins already oriented: a packed snapshot of the codebase, the context entries in scope, the project's prompt history. This half needs nothing else on this page. If you only ever use it, you are using aisquare correctly.

Orchestrationopt-in, per repo

Several agent sessions work one problem as a team against a shared board — contracts, atomic claims, adversarial verification, receipts. Skip it until you actually want parallel sessions; repos that never opt in see nothing.

Governanceopt-in, on top of either

Send sessions to an AISquare workspace and each becomes a Run you can read back — prompts, tool calls, tokens, cost, plus your prompts and board events. Off unless you ask, and a launch never waits on it.

02
OF 05

the layer that works on its own

A blank agent is an expensive agent.

Connecting Claude Code writes five lifecycle hooks into its settings — merged carefully, never clobbering yours. From then on every session opens on a directive pointing at a structure-only skeleton of the repo, your in-scope context, and what you have asked for here before.

A BLANK SESSION today ls -R grep -r read 20 files asks you three questions guesses a convention WORK rediscovery — and you pay for it again on the next session, and the one after that Same prompt. Same model. Same repo. One hook is the only difference. THE SAME SESSION on aisquare SessionStart · one payload skeleton · context · prompt history · prior decisions WORK the skeleton first, full file contents only on demand — an index of char offsets and token counts makes that one file, not the whole pack THE SESSION’S FIRST MINUTES
The same prompt, in the same repo, on the same model. The skeleton comes first and full file contents only on demand; a per-file index of character offsets and token counts lets an agent open one file's slice of the pack instead of the whole thing.

the five commands that matter

aisquare remember "prefer pytest over unittest"

Sticks everywhere, across every project.

aisquare context add "run make check" --project

Sticks in this repo only.

aisquare context search pytest

Full-text search over both pools.

aisquare why

What the last session was actually shown, and why.

aisquare doctor

Is everything wired — and the exact fix if not.

Nothing else is required reading. Context lives in two pools — user follows you everywhere, project is scoped to one repo — both searchable, exportable and injected consistently.

Set a repo's conventions up once and every worktree of it starts oriented.— identity comes from the git common dir, so branches checked out side by side share one context pool, one snapshot and one board

Prompt history, per project

aisquare log is your own captured prompts — how you tend to ask, available to the next blank session.

Long-term recall

Decisions and outcomes distil into a per-project brain off the hot path. recall "what did we decide about auth?" searches it across weeks.

03
OF 05

the loop you are buying

Intake, contracts, adversarial verification, one human gate.

The manager talks to its agents only through the board. That is the whole coordination model: no relaying, no forwarding, and no place for a decision to live where you cannot read it back.

YOU MANAGER THE BOARD CODER ×n TESTER REVIEWER VALIDATOR one prose goal, once plans · spawns · steers contract-carrying tasks atomic leased claims receipts · named signals its own git worktree opens the PR tries to break the change runs the full named check read-only by construction one effort tier above ONE SQLITE FILE · NO DAEMON your goal, in prose task next --claim task review · PR claim · the contract claim · read-only when the board clears contract-carrying tasks, one per goal a delta of what teammates did reopen + the reason rides back to whoever claims it next READY: the PRs and the evidence THE HUMAN GATE You merge. The manager never does, and neither does any agent it spawned — there is no code path that would let them.
The amber edge is the one that earns its keep. The tester runs the full check the contract named, tries to make the change fail, and then either closes the task with evidence or reopens it with the reason — and that reason rides back to whoever claims the task next. Nobody carries it there by hand.

Contracts, not tickets

Every task carries an objective, a why, acceptance criteria and boundaries. A coder blocks instead of guessing when a task has no usable contract.

Claims are atomic and leased

A single UPDATE, race-tested: exactly one winner. Leases renew from the session's own hooks, so a dead session hands its work straight back.

Dependencies are held

task next only hands out work whose dependencies are done. A rollback rehearsal cannot start before the migration it rehearses.

Signals, not substring matching

Named board states with structured payloads, so a watcher keys on a field and a note saying NOT READY can never fire it.

every role on the right model, and it is checked

$ aisquare team harness base effort: xhigh (inherited) manager fable→opus→sonnet effort=xhigh ( 0) coder sonnet→opus effort=xhigh ( 0) tester sonnet→opus effort=xhigh ( 0) reviewer sonnet→opus effort=xhigh ( 0) validator fable→opus effort=max (+1)

A ladder per role, strongest rung first. claude --model silently substitutes the default when a model is not on the account, so the harness verifies the reply before trusting a rung and demotes only on proof — an outage keeps your pick and labels it unverified rather than quietly downgrading your manager. The validator's +1 offset exists because a gate must outrank the work it checks.

04
OF 05

what it actually looks like

Real sessions. Not a chat wrapper over them.

Each agent is a Claude Code process running as a window on a tmux server that is ours alone — your own tmux sessions, config and prefix key are never touched. The UI is a view over that server and the board, which is why closing it changes nothing.

aisquare Fleet + │🔨 coder-webhooks  coder🔔 attention  task k_01k7f9 ▾🗂 payments-api│╭─────────────────────────────────────────────────────────────────────────────────────╮ 🧭 manager       ▶││🔨 coder-webhooks· wt/tsk_01k7f9 · claude --model sonnet  ·  🔔 needs you│ 🔨 coder-idempotency ▶│╰─────────────────────────────────────────────────────────────────────────────────────╯ 🔨 coder-webhooks 🔔│ 🧪 tester-1      ▶│● Claimed tsk_01k7f9 — replay-safe dispatcher behind WEBHOOK_V2 👀 reviewer-1    ⏸│contract · objective: duplicate deliveries are dropped, not retried + spawn agent│         · acceptance: make check green AND make load-test green ▾🗂 risk-engine  slate-lynx│         · boundary:   flag defaults OFF; no public route may change + spawn agent│ ▾🗂 web-console│● Update(src/webhooks/dispatch.py) 🧭 manager       ⏸│   38 ++  key = f"{endpoint.id}:{event.id}" 🔨 coder-a11y    ▶│   39 ++  if store.seen(key):  return Dropped(key) 🛡 validator-1   ▶│   52 --  retry_with_backoff(event)   # the Jul 2 double-charge + spawn agent│ │● Bash(make check) │└418 passed, 2 skipped in 51.2s — ruff · mypy strict · pytest │ │● The acceptance criteria also name make load-test, which applies the │  migration to the staging clone. That leaves this worktree. │ │╭─ Claude needs your permission ──────────────────────────────────────────────────────╮ ││ Run make load-test ?                                                            │ ││applies migrations to postgres://staging.internal/payments (writes)│ │││ ││❯ 1. Yes│ ││   2. Yes, and don't ask again for make load-test                                   │ ││   3. No, tell Claude what to do differently (esc)│ │╰─────────────────────────────────────────────────────────────────────────────────────╯ │ │  This is the pane. Your keystrokes go straight to the session — nothing is relayed. │ │ │ │ │ │ │ │ │ ─────────────────────────────│ Doctor  ✓ 18  ⚠ 1  ✗ 0│ ⚠ brain: gbrain is not on│  ↓ next  ↑ previous  ⏎ open  q quit  t theme  r refresh  ? help ▏f1 palette
The coder hit a permission prompt, so its sidebar row went 🔔 NEEDS YOU and the terminal rang. Click the row and you are in the session: the contract it claimed, the diff it wrote, make check green, and the one decision it will not take on its own. Your keystrokes go straight through. Worked example, not a customer's repo.
aisquare board — payments-api ╭─ team ───────────────────────────────────────╮╭─ live feed ──────────────────────────────────────────────────────────────────────────────────────────────────╮ │🧭 planner·ses_mgr0  ▶ working││12:54 🧭 planner·ses_mgr0 🎯 is focusing on: Make webhook delivery idempotent end to end — public API│ │claude-fable-5-1  21m││unchanged, behind the existing flag│ │   🎯 Make webhook delivery idempotent end││12:54 🧭 planner·ses_mgr0 📌 added: Idempotency keys on the webhook delivery table → coder│ │to end — public API unchanged, behind the││12:54 🧭 planner·ses_mgr0 📌 added: Replay-safe webhook dispatcher behind flag WEBHOOK_V2 → coder│ │existing flag││12:54 🧭 planner·ses_mgr0 📌 added: Load test: 10k duplicate deliveries, zero double-charges → runner│ │🤖 validator·ses_val0  ▶ working││12:54 🧭 planner·ses_mgr0 📌 added: Migration rollback rehearsal on a staging clone → runner│ │claude-fable-5-1  21m││12:54 🧭 planner·ses_mgr0 📌 added: Deprecation note in the public webhook docs → coder│ │🧪 runner·ses_tst0  ▶ working││12:54 🧭 planner·ses_mgr0 💡 decided: Idempotency key is the (endpoint_id, event_id) pair, not a random UUID│ ╰──────────────────────────────────────────────╯│— replays must collide.│ ╭─ tasks — d for done archive ─────────────────╮│12:54 🔨 coder·ses_cod0 🤝 claimed: Idempotency keys on the webhook delivery table│ │ id        st      who       title            ││12:54 🔨 coder·ses_cod0 🤝 claimed: Replay-safe webhook dispatcher behind flag WEBHOOK_V2│ │3ym4r5ev doing   ses_cod0  Idempotency keys ││12:54 🔨 coder·ses_cod0 💡 decided: Public API unchanged: the key is derived server-side, callers send│ │kgtxnjje review  ses_cod0  Replay-safe webho││nothing new.│ │fzf42k9h doing⧗  ses_tst0  Load test: 10k du││12:54 🔨 coder·ses_cod0 👀 sent to review: Idempotency keys on the webhook delivery table — PR #414. make│ │a4wj12nr todo⧗   Migration rollbac││check green. Verify: pytest tests/test_webhook_replay.py -k duplicate│ │r7jaax8t todo    Deprecation note ││12:54 🧪 runner·ses_tst0 🤝 claimed: Load test: 10k duplicate deliveries, zero double-charges│ │││12:54 🧪 runner·ses_tst0 ↩️ bounced back: Idempotency keys on the webhook delivery table — replays inside│ │││the same second still double-insert — the unique index is on (event_id) alone│ │││12:54 🔨 coder·ses_cod0 🤝 claimed: Idempotency keys on the webhook delivery table│ │││12:54 🔨 coder·ses_cod0 📊 reported: Reproduced the tester's case; widening the index to (endpoint_id,│ │││event_id) and re-running the load test.│ │││12:54 🔨 coder·ses_cod0 👀 sent to review: Replay-safe webhook dispatcher behind flag WEBHOOK_V2 — PR #417.│ │││Flag defaults off. Verify: make check && make load-test│ │││12:54 🔨 coder·ses_cod0 ❓ asked: Do we need a deprecation window for the old dispatcher, or is the flag│ │││enough? → planner│ │││12:54 🧪 runner·ses_tst0 • signal: load-test-bed: ready│ │││12:54 🧭 planner·ses_mgr0 💡 decided: Flag is enough — the old path stays until the next minor. No window│ │││needed.│ ││││ ││││ │▋│││ ╰──────────────────────────────────────────────╯╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ┏━ detail — click a task or feed line ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛  b board on/off  r refresh  a autoscroll  v select text  c copy  d done archive  o transcript  q quit  t themes  s screenshot ▏^p palette
The same work, as the board sees it. Sessions with live state and the model each reports, the open tasks with their dependency holds, and a feed of every claim, decision, review, reopen and signal — each line clickable for its full detail, and o opens the author session's transcript at that exact moment. These rows are real: produced by driving the shipping CLI through the sequence above.
05
OF 05

trust, direction, and the next hour

Built to be harmless in a repository you care about.

YOUR SESSION a real Claude Code process manager ▶ coder ×n ▶ tester ● each one a window on tmux -L asq — our server, never yours. Close the UI and every one of them keeps running. FIVE HOOKS SessionStart UserPromptSubmit Stop Notification SessionEnd merged into your settings.json, never clobbering what is there ONE SQLITE FILE ~/.aisquare/context.db · WAL context · snapshots · prompts · tasks events · sessions · signals no daemon · no account · no cloud OPTIONAL LANE off unless you ask for it Explainability Runs Collective Intelligence a launch never waits on it events orientation writes reads spooled, off the hot path FAIL-OPEN Any error inside a hook is swallowed and the session continues untouched. A repo that never opts in sees nothing at all.
aisquare sits beside the agent, never in its path. The hooks carry events out and orientation back; state is one local SQLite file; the cloud lane is spooled, opt-in and off by default.

Everything is a command

Every action the UI takes is a plain CLI command, and every command takes --json. Piped or under TERM=dumb, no script ever meets a full-screen app.

Receipts you can re-prove

Writes print ✓ … seq N. team verify 42 asks the board whether it is really there and exits 0 or 1 — and a receipt on another board is an honest not-found that names it.

Roadmap stays hidden

Unfinished commands are hidden from --help and exit 70 saying so, rather than half-working. What the help lists, works.

Contracts, not vibes

The Collective Intelligence server's JSON Schemas are vendored byte-for-byte, and every request this build can emit is validated against them in CI — never against our own reading of them.

Now · v0.6.0

  • The fleet UI and the manager loop, end to end
  • Memory: two pools, packed snapshots, prompt history
  • Board: contracts, leased claims, receipts, signals
  • Model ladder per role, probed, with effort offsets
  • Several accounts driving one board
  • Remote agents over MCP · Explainability Runs

Next

  • Sign in — one identity across your machines
  • sync: memory that follows you, and your team
  • On-limit handoff — a seat runs out, the work moves
  • Remote control: watch and steer off-terminal

Not speculative: leases already release on session end, and a seat is already just a binary plus its environment.

Later

  • Connectors — meeting notes and tickets into the knowledge base
  • Organisation policy the agents cannot cross
  • A knowledge graph of findings, decisions and preferences

Collective Intelligence runs against a live staging server today, off by default, and measures nothing yet. We will say when that changes.


a pilot is one repository and one afternoon

$ curl -fsSL …/install.sh | sh # only the gaps $ asq # point it at a repo … then press Start manager and type the goal.

Requirements are what your developers already have: a Claude Code login, tmux 3.2+, git, gh. Nothing to deploy, no account to create, and no traffic leaves the machine unless you switch that on deliberately.

what we would like from you

One repository with real parallel work in it, and a team willing to talk to a manager instead of five terminals for an afternoon. We run the loop on a live goal and hand back the transcript, the board and the Runs.

pypi.org/project/aisquare-cli
github.com/AISquare-Studio/aisquare-cli
MIT licensed · screens captured from the shipping UI at v0.6.0.