Repository navigation
[1/3] docs+test(squad-2.0): Squad feature x host matrix with live Claude/OpenCode runs and bridge tests - #2277
Merged
Merged
Conversation
Contributor
🛫 PR Readiness Check
PR Scope: 🔧 Infrastructure
|
| Status | Check | Details |
|---|---|---|
| ❌ | Single commit | 5 commits — consider squashing before review |
| ✅ | Not in draft | Ready for review |
| ✅ | Branch up to date | Up to date with dev |
| ❌ | Copilot review | No Copilot review yet — it may still be processing |
| ✅ | Changeset present | No source files changed — changeset not required |
| ✅ | Scope clean | No .squad/ or docs/proposals/ files |
| ✅ | No merge conflicts | No merge conflicts |
| ✅ | Copilot threads resolved | 0 active Copilot thread(s) resolved (4 outdated skipped) |
| ✅ | CI passing | All checks passing |
Files Changed (11 files, +6882 −3)
| File | +/− |
|---|---|
cspell.json |
+2 −0 |
docs/src/content/docs/features/enterprise-platforms.md |
+2 −0 |
docs/src/content/docs/features/gitlab-issues.md |
+1 −1 |
docs/src/content/docs/reference/host-feature-matrix.md |
+1056 −0 |
docs/src/content/docs/scenarios/using-squad-across-clients.md |
+1 −1 |
docs/src/content/docs/tour-gitlab-issues.md |
+1 −1 |
docs/src/navigation.ts |
+1 −0 |
scripts/render-host-feature-matrix.mjs |
+206 −0 |
test-fixtures/spec/suite-v0.2/host-feature-matrix.json |
+5082 −0 |
test/clients.test.ts |
+39 −0 |
test/squad-20-host-feature-matrix.test.ts |
+491 −0 |
Total: +6882 −3
This check runs automatically on every push. Fix any ❌ items and push again.
See CONTRIBUTING.md and PR Requirements for details.
Contributor
🟡 Impact Analysis — PR #2277Risk tier: 🟡 MEDIUM 📊 Summary
🎯 Risk Factors
📦 Modules Affecteddocs (6 files)
root (2 files)
scripts (1 file)
tests (2 files)
This report is generated automatically for every PR. See #733 for details. |
10 of 11 tasks
Contributor
There was a problem hiding this comment.
🟡 Changes recommended
The evidence checks can accept missing bridge calls, miss individual host transitions, and allow inconsistent matrix statuses and test references.
4 open issues
What changed in this PR
Establishes the documentation and test evidence baseline for the Squad 2.0 follow-up stack, without changing product code.
Changes:
- Adds a generated host-feature reference page with validation evidence and recorded live-run outcomes.
- Adds matrix-integrity checks, bridge scenarios, opt-in host tests, and expected-failure digest checks.
- Clarifies GitLab availability, Azure DevOps support scope, and headless Claude configuration.
| File | Description |
|---|---|
test/squad-20-host-feature-matrix.test.ts |
Adds integrity, bridge, and opt-in host checks. |
test/clients.test.ts |
Records digest coverage and expected gaps. |
scripts/render-host-feature-matrix.mjs |
Renders the matrix and checks synchronization. |
docs/src/navigation.ts |
Adds the matrix to reference navigation. |
docs/src/content/docs/tour-gitlab-issues.md |
Marks the walkthrough as planned functionality. |
docs/src/content/docs/scenarios/using-squad-across-clients.md |
Clarifies headless Claude MCP setup. |
docs/src/content/docs/reference/host-feature-matrix.md |
Publishes feature support and validation evidence. |
docs/src/content/docs/features/gitlab-issues.md |
Clarifies that GitLab integration is not shipped. |
docs/src/content/docs/features/enterprise-platforms.md |
Distinguishes Azure DevOps CLI and interactive support. |
cspell.json |
Adds names used in the evidence documentation. |
Review effort: Balanced
This was referenced Oct 22, 2026
tamirdresher
force-pushed
the
squad2-a-host-feature-matrix
branch
from
October 22, 2026 22:09
d42159f to
697481b
Compare
5 tasks done
…enCode runs and bridge tests [1/3] Adds test-fixtures/spec/suite-v0.2/host-feature-matrix.json (source of truth), scripts/render-host-feature-matrix.mjs, the rendered reference page, and test/squad-20-host-feature-matrix.test.ts (schema/evidence integrity, rendered page in sync, runtime flags vs capability tokens, deterministic bridge scenarios: monorepo subfolder, remote-mode satellite, orphan/two-layer squad_decide; F6 pinned as it.fails). Live validation: Claude Code 2.1.296 + OpenCode across 15 scenarios; Kiro/Antigravity/Cursor/Codex blocked (quota/auth) and kept static-only. Findings F1-F9 recorded as degraded cells and it.fails digest gaps in test/clients.test.ts for Layers 2/3 to flip. Follow-ups folded in (no product code): - renderer escapes `|` in feature names (markdownlint) and compares line-ending-insensitively in --check; cspell words for live-run names; "behaviour" -> "behavior". - the satellite fixture uses '../base' (the Windows separator failed lstat on Linux CI). - expected-fail digest gaps are labelled `failing` with a note on every degraded cell and listed in an `expectedFailures` block rendered as "Expected failures (it.fails)" — never counted as supported. - docs: headless Claude needs `claude -p … --mcp-config .mcp.json` (F5; Squad does not project enableAllProjectMcpServers), ADO support = detection + `squad triage|watch` via `az`, interactive Issues mode is GitHub-only (F3), GitLab Issues pages marked planned, not shipped (F2). Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: b822a455-fa94-49a2-9127-eee479ab954e
…ells, tee'd bridge evidence [1/3] Review follow-ups on the host feature matrix (Worf LA-2..7, Copilot threads 1-4): - expectedFailures now resolve to the exact generated it.fails titles: one test per host and gap (`digest gap (expected until the stack adds it): <gap> [<host>]`); the integrity suite validates every entry against test/clients.test.ts, requires every listed cell to be `failing` and not `supported`, and every `failing` cell to be covered by an expected failure. - Cells that were `supported` while carrying an expected-fail digest gap (team-root on copilot/claude/opencode, model-selection and marketplace on copilot) are now `degraded` with the gap test attached; `failing` cells can never be `supported`. - Retired `consult-personal-squad` row, gap test and expected failure removed. - Cursor: installed on the reference machine (live run blocked by a usage limit); its evidence kinds follow the no-live-run rule (`untested`), like kiro/codex/antigravity. - Live-model tests assert a successful `squad_state_read(team.md)` tools/call in a tee'd `squad state-mcp` transcript instead of stdout substrings; parser unit-tested. - Page gains "Known limitations of this evidence". Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: b822a455-fa94-49a2-9127-eee479ab954e
…expected-failure integrity check [1/3] Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: b822a455-fa94-49a2-9127-eee479ab954e
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: b822a455-fa94-49a2-9127-eee479ab954e
…ps are unsupported [1/3] Q's taxonomy redline: capability (what the host can do) and validation confidence (how we know) are independent axes. - Cell schema v2: `capability: supported|degraded|unsupported|n/a` and `validation: validated-live|validated-test|static-only|untested|blocked` with `evidence[]` (test refs, recorded live runs, static marker), `blockedReason`, and `expectedFailure` for digest gaps. The v1 `failing` marker is gone. - Every feature whose coordinator section is absent from a host digest is `unsupported` for that host (49 cells; previously degraded/supported) — pinned per host by it.fails, so validation is `validated-test`. 12 cells stay `degraded` with a stated limitation. - `validated-live` only for Claude Code and OpenCode (passing recorded runs); cursor, kiro and antigravity cells with static-only evidence and a blocked live attempt are `blocked(reason)`. - All eight terms (4 capability + 5 validation minus overlap) defined on the page; summary shows both breakdowns; per-feature detail shows both axes plus evidence. - "through the bridge" wording in live-run notes replaced by "host-reported squad_state tool events"; the page states the tee'd JSON-RPC transcript check is the only bridge-level assertion. - Integrity tests: axes enum-checked and cross-checked against evidence kinds (validated-live needs a lab entry and a live host; validated-test needs a test ref; static/untested/blocked must not list test/live evidence; blocked needs a reason; n/a is static-only); expected-failure cells must be unsupported and cite the gap test. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: b822a455-fa94-49a2-9127-eee479ab954e
tamirdresher
force-pushed
the
squad2-a-host-feature-matrix
branch
from
October 23, 2026 05:02
33f3408 to
86402cc
Compare
16 of 19 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.

What
Layer 1/3 of the Squad 2.0 pre-preview follow-up stack (supersedes #2274 once the stack is registered). Ships Data's Squad-feature × host matrix as a tested artifact:
test-fixtures/spec/suite-v0.2/host-feature-matrix.json(source of truth),scripts/render-host-feature-matrix.mjs, the rendered reference page, andtest/squad-20-host-feature-matrix.test.ts. Plus matrix-only doc corrections (F2 GitLab "planned, not shipped", F3 ADO scope note, F5 headless Claude--mcp-config). No product code.Why
The matrix is the evidence base for Layers 2 and 3: every feature × host cell carries a capability (
supported|degraded|unsupported|n/a) and an independent validation level (validated-live|validated-test|static-only|untested|blocked) backed by anevidence[]list (validated-test:<file>::<name>,validated-manual:lab:<scenario>@<date>,static-only) and the live-run log (Claude Code 2.1.296 + OpenCode across 15 scenarios; Kiro/Antigravity/Cursor/Codex blocked by quota/auth on the reference machine). Findings F1–F9 are recorded here asunsupporteddigest-gap cells (pinned by per-hostit.fails) ordegradedcells with a stated limitation, so the later layers flip them with evidence.How
tamirdresher-microsoft-squad2-host-feature-matrixand squashed with the follow-ups below.|in feature names (markdownlint MD056 was red on Data's branch) and compares line-ending-insensitively in--check(autocrlf checkouts).'../base'(the Windows separator failedlstaton Linux CI).expectedFailure: truecells withcapability: unsupported(never degraded or supported) andvalidation: validated-test(theit.failsproves the gap), listed in anexpectedFailuresblock rendered as "Expected failures (it.fails)" (Q item 5 + taxonomy redline).scenarios/using-squad-across-clients.md(F5:claude -p … --mcp-config .mcp.json; Squad does not projectenableAllProjectMcpServers),features/enterprise-platforms.md(F3: ADO = detection +squad triage|watchviaaz; interactive Issues mode GitHub-only),features/gitlab-issues.md+tour-gitlab-issues.md(F2: planned, not shipped).Review items → evidence (this layer)
test/squad-20-host-feature-matrix.test.ts› "host-feature-matrix.json integrity" (everyvalidated-testref resolves, every lab ref has a live run, page in sync, runtime flags ⇔ capability tokens)expectedFailuresblock +expectedFailure: true/unsupportedon each gap cell; rendered section; integrity test "expected-failure cells are unsupported…"--checkscripts/render-host-feature-matrix.mjs --checknormalises CRLFteamRoot: '../base'PR Readiness Checklist
Branch & Commit
dev(0446cd7 on 510aa25)devBuild & Test
SKIP_BUILD_BUMP=1 npm run build— passed (product code = dev)npm run lint— passednpm run lint:eslint— 0 errors (pre-existing warnings only)npm run lint:docs— passed (markdownlint 0, cspell 0)npx vitest run test/squad-20-host-feature-matrix.test.ts test/clients.test.ts test/template-sync.test.ts test/ux-gates.test.ts test/cli-command-wiring.test.ts test/docs-build.test.ts --testTimeout=180000— 594 passed / 7 expected-fail / 0 failed after rebuilding on this layer (the earlierux-gates/Thread 6misses were the 5 s spawn window on a host running 600+ node processes; both pass alone)npm testfull — CI requested as the authoritative run (host saturated)Changeset
packages/*/srcor template changesDocs
Exports
Breaking Changes
None.
Waivers
None requested.
Reviewer appendix — exact mapping
0446cd71→ this headSchema
{status, validation[]}→ v2 cell{capability, validation, evidence[], blockedReason?, expectedFailure?}.capability ∈ supported|degraded|unsupported|n/a;validation ∈ validated-live|validated-test|static-only|untested|blocked. Oldstatuses/validationKinds→capabilities/validationLevels/evidenceKinds(all defined on the page). The oldfailingmarker is gone; digest gaps areexpectedFailure: true+capability: unsupported.matrix-v2migration): expected-failure feature ⇒unsupported+validated-test(the per-hostit.failsproves the gap); else a passingvalidated-manual:lab:*run for that host ⇒validated-live; else anyvalidated-test:⇒validated-test; else olduntested+ a blocked live run for the host ⇒blocked(reason); else olduntested⇒untested; elsestatic-only. Capability otherwise unchanged from v1status.Features
consult-personal-squad(retired; row, gap test, expected failure and rendered section all purged —git grep -i consult test-fixtures/spec docs/src/content/docs/reference/host-feature-matrix.md test/clients.test.ts scriptsmatches only two live-run notes that use the ordinary verb "consulted")Capability changes (cells whose v1
status≠ v2capability)model-selectioncopilotit.fails⇒ unsupported (Q: a missing coordinator section is not a degradation)model-selectionclaudeit.fails⇒ unsupported (Q: a missing coordinator section is not a degradation)model-selectionkiroit.fails⇒ unsupported (Q: a missing coordinator section is not a degradation)model-selectionopencodeit.fails⇒ unsupported (Q: a missing coordinator section is not a degradation)model-selectioncursorit.fails⇒ unsupported (Q: a missing coordinator section is not a degradation)model-selectioncodexit.fails⇒ unsupported (Q: a missing coordinator section is not a degradation)model-selectionantigravityit.fails⇒ unsupported (Q: a missing coordinator section is not a degradation)gitlab-issuescopilotit.fails⇒ unsupported (Q: a missing coordinator section is not a degradation)gitlab-issuesclaudeit.fails⇒ unsupported (Q: a missing coordinator section is not a degradation)gitlab-issueskiroit.fails⇒ unsupported (Q: a missing coordinator section is not a degradation)gitlab-issuesopencodeit.fails⇒ unsupported (Q: a missing coordinator section is not a degradation)gitlab-issuescursorit.fails⇒ unsupported (Q: a missing coordinator section is not a degradation)gitlab-issuescodexit.fails⇒ unsupported (Q: a missing coordinator section is not a degradation)gitlab-issuesantigravityit.fails⇒ unsupported (Q: a missing coordinator section is not a degradation)azure-devopscopilotit.fails⇒ unsupported (Q: a missing coordinator section is not a degradation)azure-devopsclaudeit.fails⇒ unsupported (Q: a missing coordinator section is not a degradation)azure-devopskiroit.fails⇒ unsupported (Q: a missing coordinator section is not a degradation)azure-devopsopencodeit.fails⇒ unsupported (Q: a missing coordinator section is not a degradation)azure-devopscursorit.fails⇒ unsupported (Q: a missing coordinator section is not a degradation)azure-devopscodexit.fails⇒ unsupported (Q: a missing coordinator section is not a degradation)azure-devopsantigravityit.fails⇒ unsupported (Q: a missing coordinator section is not a degradation)upstream-inheritancecopilotit.fails⇒ unsupported (Q: a missing coordinator section is not a degradation)upstream-inheritanceclaudeit.fails⇒ unsupported (Q: a missing coordinator section is not a degradation)upstream-inheritancekiroit.fails⇒ unsupported (Q: a missing coordinator section is not a degradation)upstream-inheritanceopencodeit.fails⇒ unsupported (Q: a missing coordinator section is not a degradation)upstream-inheritancecursorit.fails⇒ unsupported (Q: a missing coordinator section is not a degradation)upstream-inheritancecodexit.fails⇒ unsupported (Q: a missing coordinator section is not a degradation)upstream-inheritanceantigravityit.fails⇒ unsupported (Q: a missing coordinator section is not a degradation)monorepo-team-rootcopilotit.fails⇒ unsupported (Q: a missing coordinator section is not a degradation)monorepo-team-rootclaudeit.fails⇒ unsupported (Q: a missing coordinator section is not a degradation)monorepo-team-rootkiroit.fails⇒ unsupported (Q: a missing coordinator section is not a degradation)monorepo-team-rootopencodeit.fails⇒ unsupported (Q: a missing coordinator section is not a degradation)monorepo-team-rootcursorit.fails⇒ unsupported (Q: a missing coordinator section is not a degradation)monorepo-team-rootcodexit.fails⇒ unsupported (Q: a missing coordinator section is not a degradation)monorepo-team-rootantigravityit.fails⇒ unsupported (Q: a missing coordinator section is not a degradation)dual-root-remote-modecopilotit.fails⇒ unsupported (Q: a missing coordinator section is not a degradation)dual-root-remote-modeclaudeit.fails⇒ unsupported (Q: a missing coordinator section is not a degradation)dual-root-remote-modekiroit.fails⇒ unsupported (Q: a missing coordinator section is not a degradation)dual-root-remote-modeopencodeit.fails⇒ unsupported (Q: a missing coordinator section is not a degradation)dual-root-remote-modecursorit.fails⇒ unsupported (Q: a missing coordinator section is not a degradation)dual-root-remote-modecodexit.fails⇒ unsupported (Q: a missing coordinator section is not a degradation)dual-root-remote-modeantigravityit.fails⇒ unsupported (Q: a missing coordinator section is not a degradation)marketplace-pluginscopilotit.fails⇒ unsupported (Q: a missing coordinator section is not a degradation)marketplace-pluginsclaudeit.fails⇒ unsupported (Q: a missing coordinator section is not a degradation)marketplace-pluginskiroit.fails⇒ unsupported (Q: a missing coordinator section is not a degradation)marketplace-pluginsopencodeit.fails⇒ unsupported (Q: a missing coordinator section is not a degradation)marketplace-pluginscursorit.fails⇒ unsupported (Q: a missing coordinator section is not a degradation)marketplace-pluginscodexit.fails⇒ unsupported (Q: a missing coordinator section is not a degradation)marketplace-pluginsantigravityit.fails⇒ unsupported (Q: a missing coordinator section is not a degradation)49 cells changed capability; every other cell keeps its v1 status as capability.
Validation levels per host
copilotclaudekiroopencodecursorcodexantigravityvalidated-liveappears only forclaudeandopencode(enforced by the integrity test).blocked= cursor/kiro/antigravity cells whose only evidence was static and whose live smoke run was blocked by a usage limit on 2026-10-22.Expected failures (
expectedFailures[], exact titles)monorepo-team-root→test/clients.test.ts::digest gap (expected until the stack adds it): team-root resolution (teamRoot / stateLocation / TEAM_ROOT)+[<host>]for copilot, claude, kiro, opencode, cursor, codex, antigravitydual-root-remote-mode→test/clients.test.ts::digest gap (expected until the stack adds it): team-root resolution (teamRoot / stateLocation / TEAM_ROOT)+[<host>]for copilot, claude, kiro, opencode, cursor, codex, antigravityupstream-inheritance→test/clients.test.ts::digest gap (expected until the stack adds it): upstream inheritance (upstream.json)+[<host>]for copilot, claude, kiro, opencode, cursor, codex, antigravityazure-devops→test/clients.test.ts::digest gap (expected until the stack adds it): Azure DevOps issue tracking (az boards / ADO)+[<host>]for copilot, claude, kiro, opencode, cursor, codex, antigravitygitlab-issues→test/clients.test.ts::digest gap (expected until the stack adds it): GitLab issue tracking (glab)+[<host>]for copilot, claude, kiro, opencode, cursor, codex, antigravitymodel-selection→test/clients.test.ts::digest gap (expected until the stack adds it): per-agent model / reasoning / context-tier selection+[<host>]for copilot, claude, kiro, opencode, cursor, codex, antigravitymarketplace-plugins→test/clients.test.ts::digest gap (expected until the stack adds it): plugin marketplace browse on cast+[<host>]for copilot, claude, kiro, opencode, cursor, codex, antigravityGenerated in
test/clients.test.tsasit.fails(`digest gap (expected until the stack adds it): ${name} [${id}]`)for everyidinCLIENT_IDS(6 gaps × 7 hosts = 42). The integrity test resolves each entry against the gap literal, the generating template and theCLIENT_IDSloop, and requires every listed cell to beexpectedFailure: true+unsupported, and every flagged cell to be listed.validated-testreferences (61 distinct; each file exists and each non-*name appears literally in it — asserted by "every validated-test reference names a test that exists")validated-test:test/aspire-command.test.ts::*validated-test:test/cli/doctor.test.ts::*validated-test:test/cli/export-import.test.ts::*validated-test:test/cli/init.test.ts::*validated-test:test/cli/rc.test.ts::*validated-test:test/cli/upgrade.test.ts::*validated-test:test/clients-real-cli.test.ts::antigravity discovers the squad agentvalidated-test:test/clients-real-cli.test.ts::claude discovers the squad subagents and parses .mcp.jsonvalidated-test:test/clients-real-cli.test.ts::codex loads the project config (trusted), sees squad_state MCP, discovers the squad TOML role, and activates coordinator instructions on spawnvalidated-test:test/clients-real-cli.test.ts::cursor-agent lists the squad_state server from .cursor/mcp.json (read-only)validated-test:test/clients-real-cli.test.ts::kiro validates and lists the squad agentvalidated-test:test/clients-real-cli.test.ts::opencode loads squad as a primary agent and connects the MCP servervalidated-test:test/clients.test.ts::Reviewer gate (@Bubu): /client <-> /clients export identity (===), pure projection boundary, and byte-exact rollback across all 7 hostsvalidated-test:test/clients.test.ts::coordinator Ralph modevalidated-test:test/clients.test.ts::coordinator behavioral-contract parityvalidated-test:test/clients.test.ts::coordinator digest vs. host feature matrixvalidated-test:test/clients.test.ts::portable clients[] hygienevalidated-test:test/cross-squad-registry.test.ts::*validated-test:test/cross-squad.test.ts::*validated-test:test/gh-aw-enlistment-skill.test.ts::*validated-test:test/memory-governance.test.ts::*validated-test:test/migrate.test.ts::*validated-test:test/model-selector-policy.test.ts::*validated-test:test/otel-export.test.ts::*validated-test:test/platform-adapter.test.ts::*validated-test:test/ralph-board.test.ts::*validated-test:test/ralph-commands.test.ts::*validated-test:test/ralph-monitor.test.ts::*validated-test:test/ralph-triage.test.ts::*validated-test:test/rate-limiting.test.ts::*validated-test:test/resolution.test.ts::*validated-test:test/skills.test.ts::*validated-test:test/squad-20-all-scenarios.e2e.test.ts::12. capability tokens match capability-matrix.json for all 7 hostsvalidated-test:test/squad-20-all-scenarios.e2e.test.ts::Full non-bypass journey: host adapter → broker → harness → approval → restart/reconnectvalidated-test:test/squad-20-all-scenarios.e2e.test.ts::R3-9: createMcpBackend honors a configured (non-local) state backend instead of writing .squad/backendvalidated-test:test/squad-20-all-scenarios.e2e.test.ts::RC1→stable exit 1: upgrade and rollback from a v0.1 workspacevalidated-test:test/squad-20-all-scenarios.e2e.test.ts::Scenario 1: client projections and --clientvalidated-test:test/squad-20-all-scenarios.e2e.test.ts::Scenario 2: cross-plane capability intersectionvalidated-test:test/squad-20-all-scenarios.e2e.test.ts::Scenario 4: DurableHttpSquadBackend full HTTP lifecyclevalidated-test:test/squad-20-all-scenarios.e2e.test.ts::field findings from the live demo: Init Mode, scratch files, casting registryvalidated-test:test/squad-20-host-feature-matrix.test.ts::claude --agent squad reads the roster through mcp__squad_state__squad_state_readvalidated-test:test/squad-20-host-feature-matrix.test.ts::claude lists the root .mcp.json squad_state server from packages/apivalidated-test:test/squad-20-host-feature-matrix.test.ts::opencode --agent squad reads the roster through squad_state_squad_state_readvalidated-test:test/squad-20-host-feature-matrix.test.ts::opencode resolves the squad primary agent and the squad_state MCP entry from packages/apivalidated-test:test/squad-20-host-feature-matrix.test.ts::squad_decide over the bridge lands in the squad-state branch for the %s backend, not the working treevalidated-test:test/squad-20-host-feature-matrix.test.ts::state-mcp follows config.json teamRoot from a satellite repo (remote mode)validated-test:test/squad-20-host-feature-matrix.test.ts::state-mcp resolves the root .squad when launched from a monorepo subfoldervalidated-test:test/squad-20-real-clients-stdio.e2e.test.ts::completes the MCP handshake and lists squad_state_* and all squad_backend_* tools when opted invalidated-test:test/squad-20-real-clients-stdio.e2e.test.ts::executes squad_state tools against the workspace .squad directoryvalidated-test:test/squad-20-real-clients-stdio.e2e.test.ts::negotiates capabilities for the client per capability-matrix.jsonvalidated-test:test/squad-20-real-clients-stdio.e2e.test.ts::writes the host config and agent files each client readsvalidated-test:test/state-backend.test.ts::*validated-test:test/team-capabilities-lifecycle.test.ts::*validated-test:test/upgrade-state-backend.test.ts::*validated-test:test/upstream-e2e.test.ts::*validated-test:test/upstream.test.ts::*validated-test:test/watch-fleet-dispatch.test.ts::*validated-test:test/watch-notify-level.test.ts::*validated-test:test/watch-rate-limit.test.ts::*validated-test:test/watch-subsquad-discovery.test.ts::*validated-test:test/worktree.test.ts::*Renderer
node scripts/render-host-feature-matrix.mjs --checkcompares LF- and CRLF-normalized content (autocrlf checkouts pass).capability validationglyph pairs), Per-feature detail (Capability | Validation | Mechanism | Evidence), Live run log.Copilot threads on #2277 (all resolved with commit + test)
it.fails(thread 1) →test/clients.test.tsgap loop overCLIENT_IDS.squad state-mcptranscript,successfulRosterReads()with its own unit test; the page states this is the only bridge-level assertion.