This is DeDuva/squad, a fork of bradygaster/squad (@deduvafork/squad) being
replatformed to be model- and harness-agnostic rather than GitHub-Copilot-only, and
used as the host for two research packages of its own.
CONTRIBUTING.md and README.md are upstream's and describe upstream's project. This
file covers what is true of the fork and is not written down anywhere in the tree.
- The default branch is
dev, notmain. Base new work ondevand open PRs intodev. (The oldreplatform-0.11line is spent —devwas made default on 2026-08-07 at that branch's tip.) - GitHub does not treat this repo as a fork — its
parentisnull, sogh repo syncdoes not work. There is anupstreamremote (bradygaster/squad); fetch from it, never push to it. - All work lands through a PR. Commit messages and PR bodies carry no AI attribution.
Do not regenerate this file with /init. A codebase scan would describe upstream's
project, which is exactly what this file exists to correct. Edit it by hand;
npm run check:docs fails if a path named here stops existing.
.claude/settings.json is checked in and holds the shared permission allowlist.
.claude/settings.local.json is for personal, machine-specific entries and is ignored —
it used to be committed, carrying one contributor's PowerShell one-liners into the repo.
npm workspaces monorepo, packages/*. Node ≥22.5.0 (engines) — CONTRIBUTING.md
still says ≥20; believe package.json. That mismatch is upstream's, not the fork's,
and is deliberately left uncorrected here: upstream-owned files stay byte-identical so the
fork's diff remains small and the next sync stays conflict-free. Fix it upstream, not here.
| Package | Origin |
|---|---|
packages/squad-sdk, packages/squad-cli |
upstream — keep the diff against upstream small and intentional |
packages/squad-lab |
fork-added. Goal-setting + cross-provider A/B frontend; an A/B test is one ADP intent and N runs |
packages/duva-bench |
fork-added. The squad track of duva-bench; PLAN.md inside it is that track's plan of record |
Fork-added ADP integration lives in packages/squad-sdk/src/adp/ — recorder.ts and
spool.ts subscribe to squad's own events and record runs to ADP without blocking them.
npm run check # the gate: check:docs + lint + test
npm test # vitest run
npm run lint # tsc --noEmit across squad-sdk and squad-cli
npm run build # squad-sdk then squad-cli (prebuild wipes dist/ and re-syncs templates)
npm run -w @deduvafork/squad-lab lab # the lab CLI
npm run -w @deduvafork/squad-lab web:dev # the lab web UXBuild before trusting a test result. A stale dist/ predating the vendor registry
once hid 24 real failures — tests ran green against output that no longer matched the
source.
packages/squad-sdk/src/platform/github.ts wraps the gh CLI, and ADP's locked
success criterion is that unmodified gh works against it via GH_HOST. So squad runs
against ADP with zero code changes, and the two projects are each other's test
fixture: squad is a realistic multi-agent conformance workload for ADP, and ADP is a
hermetic GitHub stand-in for squad's tests.
Gaps that squad finds in ADP are report-only evidence for ADP's milestone ledger — file them there; they do not change ADP's scope by themselves, and they are not fixed by patching around them here.
ROADMAP.md— the single status ledger for the fork and both research packages: milestone states, gates, open decisions. A PR that changes milestone status updates it in the same PR.- The squad-track bench plan:
packages/duva-bench/PLAN.md(in-tree). It decides that track's scope. - Milestone reports and the cross-project plan moved off disk to the private
github.com/DeDuva/duva-lab-tpm.~/dev/duva_squad/PLAN.mdand~/dev/duva_squad/reports/were deleted after the remote was verified byte-identical — don't go looking for them locally. - Vendor API keys for lab runs are in
~/.config/squad/. The AI-SDK harness needs a key; squad's native backend does not.