Run several independent Cotal features concurrently by creating one Git worktree and one spawn-capable mesh manager per feature; each manager staffs a review panel in a dedicated channel, adds one independent cold reviewer briefed under the cold-review skill, owns plan-to-commit delivery, and escalates unresolved product decisions by DM to the coordinator for relay to the user. Use when the user asks to split multiple features across managers/worktrees, run parallel feature teams on Cotal, or have managers create their own review panels.
npx skills add https://github.com/Cotal-AI/Cotal --skill parallel-feature-managers
Use the live Cotal mesh as a hierarchy:
and relays decisions. It does not duplicate implementation or panel review.
complete plan -> implementation -> review -> test -> commit loop.
security, and critic at minimum.
cold-review skill, which is the single source for how that seat is briefed, isolated and
graded. It is a control on the panel rather than a fourth panelist.
No two seats whose agreement is load-bearing may share a model family. A finding confirmed by a
seat of the same family as the one that made it is an echo, not a confirmation. A panel of three
same-model reviewers has approved a head carrying a defect that all three missed, and what surfaced
it was a differently framed read rather than a fourth verifier.
State it that way rather than as a headcount. **Availability is a property of the moment, not of the
vendor**: the same model has joined and delivered one hour and failed to join the next, on the same
host with the same tooling. A rule phrased as "N distinct vendors" is unsatisfiable on a degraded
fleet and silently so, and a rule that can be broken by the clock gets quietly ignored rather than
obeyed. cold-review carries the degradation order and the floor.
Pin the model explicitly at spawn AND in the persona, because unrecorded capability is
ungraded-in-effect: a reviewer whose effort or model nobody recorded produces a verdict nobody can
weigh afterwards.
Managers may run a stronger model than their reviewers. Reviewers should not run the same model as
the coordinator, so that the panel cannot inherit the coordinator's blind spots.
Verify the exact model identifiers against the connector's own catalog before spawning, and treat a
declared reasoning-effort tier as unverified until a seat has actually launched with it: a catalog
can declare tiers the provider refuses, and a refused tier kills the seat at launch.
feature. Select that seat's contact and destination under cold-review. A file destination is a
norm-only fallback and cannot satisfy a gate that requires broker-attested poster identity. No
sibling instances or tester fan-out unless the user requests it.
findings with file/line references.
review.<feature-slug>, plus one dedicated cold record channel,review.<feature-slug>.cold-record. Keep acknowledgements and status chatter off the panel channel;
use it for plans, findings, reasoned dispositions, code-review requests, and final results.
owned by cold-review; enforce them there rather than restating them per lane.
A manager must not guess through an unresolved consequential choice.
processes by exact PID, never broad pkill.
For every requested feature, choose and record:
| Field | Example |
|---|---|
| Feature | channels export |
| Slug | channels-export |
| Branch | feat/channels-export |
| Worktree | sibling path such as Cotal-feature-channels-export |
| Manager persona | mgr-channels-export |
| PR | exact number, or none until one exists |
| Channel | review.channels-export |
| Contract | concrete behavior, boundaries, tests, and known non-goals |
Resolve branch/path collisions before creating anything. Inspect git status, `git worktree list
--porcelain`, and existing branches. Do not clean or revert unrelated dirty state.
Create the worktrees sequentially because they mutate shared Git metadata:
git worktree add -b feat/<slug> /absolute/sibling/Cotal-feature-<slug> <base>
Use the same base commit for all features unless the user explicitly wants stacked work.
Before launch, verify each worktree can read .internal/plans/STATUS.md and the relevant guidelines.
Normally git submodule update --init .internal is sufficient.
If initialization fails because the superproject pins an unavailable commit:
git ls-tree <base> .internal) with the active local submoduleHEAD (git -C .internal rev-parse HEAD). This is repository-state drift, not a Cotal ACL problem.
.internal commit independentlyinto each feature worktree from the active local submodule repository.
M .internal; they must read it but never stage, edit, orinclude it in feature commits.
Do not leave managers blocked merely because a fresh worktree cannot fetch a private commit that is
already available and verified locally. Do not pretend the mismatch is clean either; report the
permanent repair needed.
Manager agents need capabilities: [spawn] plus channel ACLs. Reviewer agents need channel ACLs and
must not have spawn. cotal_persona cannot grant policy, and cotal_spawn cannot override
allowSubscribe or allowPublish, so author every persona file before spawning. These files are
local/ignored in this repo. A clean machine that has only a default persona cannot staff the panel:
the spawn names below fail unless those files exist, and a leftover local persona is not a
substitute because its grants may be missing or wider than the lane.
---
name: mgr-<slug>
role: feature-manager
model: <pinned manager model>
description: Owns <feature> and its review panel.
tags: [manager, <slug>]
subscribe: [review.<slug>]
allowSubscribe: [review.<slug>, review.<slug>.cold-record]
allowPublish: [review.<slug>]
capabilities: [spawn]
---
Author matching files for the three panel seats and the cold seat before any spawn. Give every
reviewer persona a lane-scoped filename such as review-<slug>-engineer; the persona catalog is
shared by concurrent lanes, so generic filenames collide even when the worktrees and channels do
not. Panel personas subscribe and publish only on review.<slug>. The cold persona lists empty
subscribe and allowSubscribe so non-join is a property of the seat, not an instruction, and may
publish only to review.<slug>.cold-record. Do not reuse or redefine a reviewer persona from another
lane.
---
name: review-<slug>-engineer
role: reviewer
model: <pinned panel model, family A>
subscribe: [review.<slug>]
allowSubscribe: [review.<slug>]
allowPublish: [review.<slug>]
capabilities: []
---
---
name: review-<slug>-freelance
role: reviewer
model: <pinned cold model, not the author's family>
subscribe: []
allowSubscribe: []
allowPublish: [review.<slug>.cold-record]
capabilities: []
---
Repeat the panel template for review-<slug>-security and review-<slug>-critic with different model
families. If a referee is later required, author review-<slug>-referee the same way as the cold seat,
with empty subscribe and allowSubscribe plus one dedicated record-channel allowPublish grant, before
spawning it.
The manager prompt must include all of the following:
.internal before editing.review.<slug> first.review-<slug>-engineer,review-<slug>-security, and review-<slug>-critic, seated so that **no two of them whose agreement
is load-bearing share a model family**. That is the ordinal rule above and not a headcount. Where the vendor set is short, name
the collision mechanically and the class it leaves uncovered. **Naming is disclosure, not
completion:** a panel whose load-bearing approvals are same-family echoes cannot complete, including
A, A, A and A, B, A. Do not treat a staffed-but-collided panel as a passing gate. Give each its own
detached worktree as cwd. A reviewer grades in its own tree, never in the tree it is grading, and
"read-only" must name the git write verbs explicitly (checkout, switch, stash, reset,
clean, restore) rather than only saying "do not edit source".
all three for a final disposition.
review-<slug>-freelance in its owndetached worktree and brief it under the cold-review skill, which owns what that seat is
given, where its verdict goes, what the verdict binds, and how the rules degrade when the vendor
set is short. Do not restate any of it here.
cold-review's canonical rule, never by telling that seat toreconsider. If the manager authored the change and a blocker needs independent refutation, send the
coordinator only the exact-sha finding and artifact. The coordinator provisions a fresh
review-<slug>-referee in its own detached worktree; that seat had no part in authoring, grading or
supervising the lane, does not share a model family with the author, and receives none of the
author's rationale. The coordinator provisions the
referee but does not serve as it. If a fold changes code, return the result to the channel panel for
another final pass and re-pin the cold seat to the new sha with its delivery limit explicitly reset
in writing. If that seat is gone, author a fresh cold persona with empty subscribe and
allowSubscribe plus only its dedicated record-channel allowPublish grant, spawn it, and brief it
under cold-review on the new sha as a new one-delivery seat. That is a successor, not a third
closure route for the old sha.
and again before merge, the manager or coordinator first resolves the review target. For a PR, run
git ls-remote origin refs/pull/<n>/head and cross-check gh pr view <n> --json headRefOid. For a
branch with no PR, resolve git ls-remote origin refs/heads/<branch> and omit the PR-only API
cross-check. Fetch the resolved object into the detached review worktree if it is not already
present, then run git cat-file -t on that object with a known-good control and a known-missing
full-width object id, such as forty zeroes, that must fail. Do not make the negative control by
appending a character to the real id: Git may resolve the valid leading object id and return
success. Name the actor who ran the instruments. If applicable instruments disagree, stop.
A verdict or refutation that names a different sha does not close this head.
DECISION NEEDED: <one-line question>
Options: <A>; <B>; ...
Recommendation: <manager's recommendation and why>
Impact: <observable behavior / compatibility / risk>
Blocked: <what cannot proceed>; Continuing: <what can proceed>
terminal cold verdict and any public refutations, and residual risks.
Create the panel channel and dedicated cold record channel before inviting the team, with replay
enabled and a short operator note. Then spawn each manager through cotal_spawn:
name: mgr-<slug>
role: feature-manager
agent: <connector>
model: <pinned manager model>
cwd: /absolute/path/to/feature-worktree
Launch managers in parallel only after all worktrees, personas, and channels exist. Track the
returned reviewer identity, not an assumed name; a restarted or duplicated launch may still be
auto-numbered even though the persona filename is lane-scoped.
Verify with cotal_roster that every manager appears and holds its full panel. Do not spawn
missing-looking duplicates prematurely; allow startup time and recheck first.
A spawn that reports a timeout is not evidence the spawn failed. It may already have succeeded,
and retrying submits a second goal that duplicates the effect. Read the outcome from the process
listing before acting, and never retry on a timeout alone.
Verify a seat by REPLY, never by presence. A seat can report as running and be silently
unreachable. Ask for a nonce artifact it must produce, such as an echo of a random token joined to
the short commit it is sitting on, and check the raw output. A handshake that states the expected
answer ("confirm you are at <path> on <sha>") is leading: an echo-compatible reply proves something
can mirror text, not that a shell ran.
The independent reviewer is intentionally absent during initial staffing. The feature manager spawns
it only at the cold-review gate, and briefs it by applying the cold-review skill itself: that
file addresses the briefer, and the graded seat never loads it. It owns that seat's isolation,
briefing, and verdict rules. Do not restate them here: one source for the rule, or the two copies
drift and the stale one is invisible to whoever is editing the other.
Auto-numbering applies to the lane-scoped cold persona too, so track the returned identity.
Join each review channel and set it quiet, so channel traffic is available on demand without
waking the coordinator. Keep DMs open: decisions and completion reports must wake the coordinator.
Use:
cotal_roster for staffing and current activity.cotal_inbox for decisions, findings, and completions.git status --short --branch and git log --oneline in each worktree for branch state.Do not redo the manager's implementation, review its diff in parallel, or send acknowledgement
noise. Intervene only for infrastructure, violated team policy, a real decision, or a stalled team.
When a manager sends DECISION NEEDED:
Infrastructure blockers are coordinator work, not user decisions. Resolve worktree, submodule,
dependency, or mesh-access issues directly when safe.
A feature is complete only when:
only by the dedicated closure rule below; this bullet must not privately override them.
share a model family**. "Spans more than one vendor" is NOT this condition: a panel staffed A, B, A
satisfies it and violates the rule, and an A-A pair is the same-family echo the rule exists to
reject. Where the vendor set is too short, name the collision mechanically and the failure class it
leaves uncovered, per cold-review. A named collision is not a third completion path. If the
remaining load-bearing approvals share a family, the feature is not complete. Refuse below that
floor rather than recording a same-family panel as reviewed.
blockers at the exact sha, at the destination the brief named. A silent, failed, or non-verdict cold
lifecycle is not completion. On the broker-attested route, the cold persona has empty subscribe and
allowSubscribe, may publish only to its dedicated record channel, and panel personas may not read
it. A file is a norm-only fallback and cannot satisfy a gate requiring broker-attested poster
identity.
and no third: the cold seat posted APPROVE at the exact sha; or each blocker at that sha was
answered by a public refutation from a
permitted party under cold-review's override rule, naming the same exact sha and left standing in
the record beside the finding. An unanswered cold blocker is neither, and is not completion.
Requiring the seat's own approval *alone* would deadlock the override the first time it was used
correctly: the seat is one-delivery and may never be told to reconsider, so a refuted blocker could
be cleared only by changing code to satisfy a finding just publicly refuted, or by a zero-delta
re-pin to manufacture an approval, which is laundering. The override answered the question and the
gate has to let the answer count.
landed by re-fetching the destination. The sha and destination are retrospective evidence. A post
on the dedicated Cotal record channel also attests the cold seat's principal. A GitHub comment
attests only a GitHub account and is not cold-seat evidence when the workstation credential is
shared. Historical non-join is auditable only from retained launch-time ACL evidence; a current
subscription snapshot is not proof. For a file destination, poster is a norm: the file's
presence does not prove the seat wrote it. That the brief carried no findings is also a norm
resting on the briefer, so it is deliberately not a gate condition here; listing a norm in the
grammar of a control is the false assurance cold-review exists to prevent.
coordinator re-resolves that head at briefing, at the completion claim, and again at merge, using
the instruments in the manager prompt: Git ref and object type for every lane, plus the exact PR
API cross-check when a PR exists. Neither a verdict nor a refutation is ever carried across a sha.
git status is clean except an explicitly acknowledged local .internal pointer mismatch.refutations, and residual risk.
Park completed teams until integration is requested. Report progress to the user as a compact matrix:
completed commit, in-review findings, implementing, or decision needed.
When asked to land the work, inspect all feature commits and expected shared-file conflicts first.
Parallel features commonly touch docs/cli.md, generated docs bundles, package.json, flag
inventories, and changesets. Merge/cherry-pick deliberately, resolve by preserving both behaviors,
then run the aggregate gate once on the integrated result and request a final cross-feature review
when conflicts changed code.
After landing and verification:
cotal_despawn the three panel reviewers, independent reviewer, and manager for each feature.Never tear down peers before their final result is captured, never remove an unmerged worktree, and
do not delete the dedicated cold record channel or its retained verdict history as routine cleanup.
Take cotal-ai/parallel-feature-managers from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.