build(agents): force prompt_async by removing supervisors from task permissions
CI / build (push) Successful in 17s
CI / lint (push) Failing after 19s
CI / helm (push) Successful in 30s
CI / quality (push) Successful in 35s
CI / security (push) Failing after 52s
CI / unit_tests (push) Failing after 1m46s
CI / typecheck (push) Successful in 3m57s
CI / coverage (push) Has been skipped
CI / docker (push) Has been skipped
CI / benchmark-regression (push) Has been skipped
CI / benchmark-publish (push) Has been cancelled
CI / integration_tests (push) Has been cancelled
CI / e2e_tests (push) Has been cancelled
CI / status-check (push) Has been cancelled

The product-builder was ignoring the prompt_async instructions and falling
back to the Task tool for launching supervisors. It was also only launching
a few supervisors instead of all 11 because the pseudocode was too abstract.

Root cause: All 11 supervisor agents were listed in the task permissions,
so the LLM had a choice between Task (familiar, simpler) and bash curl
(correct but unfamiliar). It chose Task every time.

Fix — three changes:

1. REMOVED all 11 supervisor agents from task permissions. The product-
   builder physically cannot invoke them via the Task tool anymore. Only
   one-shot agents remain in task permissions (ca-epic-planner,
   ca-session-persister, ca-product-verifier, ca-ref-reader, etc.).

2. REWROTE Phase C.2 as concrete curl command templates instead of
   abstract pseudocode. The agent now has the exact curl pattern to
   copy-paste for each supervisor, with clear variable placeholders.
   Added a mandatory validation step: wc -l the tracking file and
   confirm exactly 11 entries before proceeding.

3. ADDED aggressive warnings at three levels:
   - Top of file: bold mandatory notice about prompt_async
   - Phase C.2: large boxed warning block prohibiting the Task tool
   - Coordination rules: explicit statement that supervisors are
     removed from task permissions
   - Monitoring loop: reminder to use bash curl for re-launches
This commit is contained in:
2026-04-02 18:52:09 +00:00
parent 4ecf446360
commit 7e38aad929
+109 -147
View File
@@ -25,27 +25,22 @@ permission:
"ca-architect": allow
"ca-epic-planner": allow
"ca-session-persister": allow
"ca-pr-self-reviewer": allow
"ca-continuous-pr-reviewer": allow
"ca-milestone-reviewer": allow
"ca-architecture-guard": allow
"ca-product-verifier": allow
"ca-spec-updater": allow
"ca-docs-writer": allow
"ca-ref-reader": allow
"ca-issue-finder": allow
"issue-implementor": allow
"ca-timeline-updater": allow
"ca-final-reporter": allow
"ca-uat-tester": allow
"ca-bug-hunter": allow
"ca-backlog-groomer": allow
"ca-human-liaison": allow
"ca-agent-evolver": allow
---
# CleverAgents Product Builder
**MANDATORY: ALL 11 SUPERVISORS ARE LAUNCHED VIA BASH CURL TO THE
OPENCODE SERVER API (prompt_async). NEVER USE THE TASK TOOL FOR
SUPERVISORS. Supervisor agents have been removed from your task
permissions — any attempt to invoke them via Task will be denied.
Use Bash tool + curl + the OpenCode Server HTTP API exclusively.
See Phase C.2 for the exact curl commands.**
You are an autonomous product builder. You take a product vision — either from
the user's prompt or from existing project documentation — and build the
**entire product** through iterative milestones. You handle everything:
@@ -412,141 +407,103 @@ if unplanned_milestones:
Wait for AT LEAST ONE planner to complete (so there are issues).
Collect results.
# ── PHASE C.2: Launch ALL Supervisors via prompt_async ───────────
# For each supervisor:
# 1. Create a session via POST /session
# 2. Send the prompt via POST /session/:id/prompt_async (fire-and-forget)
# 3. Record the session ID
# ══════════════════════════════════════════════════════════════════
# ██ PHASE C.2: Launch ALL 11 Supervisors via prompt_async ██
# ══════════════════════════════════════════════════════════════════
#
# IMPORTANT: Use the Bash tool to run curl commands. Each curl call
# returns instantly (prompt_async returns 204). All 11 supervisors
# launch within seconds, fully independent of each other.
# ██████████████████████████████████████████████████████████████████
# ██ CRITICAL: DO NOT USE THE TASK TOOL FOR SUPERVISORS ██
# ██ ██
# ██ You MUST use the Bash tool to run curl commands that call ██
# ██ the OpenCode Server HTTP API's prompt_async endpoint. ██
# ██ ██
# ██ The Task tool is NOT available for supervisor agents. ██
# ██ Supervisor agents have been REMOVED from your task ██
# ██ permissions. You physically cannot invoke them via Task. ██
# ██ ██
# ██ The ONLY way to launch supervisors is: ██
# ██ 1. Bash: curl POST /session (create session) ██
# ██ 2. Bash: curl POST /session/:id/prompt_async (fire+forget) ██
# ██ ██
# ██ If you try to use the Task tool for any supervisor, it will ██
# ██ be DENIED. Use Bash + curl. No exceptions. ██
# ██████████████████████████████████████████████████████████████████
#
# Before dispatching, output a pre-flight checklist:
# You MUST launch ALL 11 supervisors. Not some. Not "the important
# ones." ALL 11. Every single one. Count them as you go.
#
# For each supervisor, run TWO bash curl commands:
# 1. Create a session: POST /session with title "[CA-AUTO] supervisor: <name>"
# 2. Launch it: POST /session/:id/prompt_async with agent and prompt
#
# The prompt_async call returns 204 immediately (fire-and-forget).
# The supervisor runs independently in its own session.
#
# BEFORE launching, substitute real values for these placeholders:
# <SERVER> = http://localhost:4096
# <PAT> = the Forgejo personal access token
# <OWNER> = the repo owner (e.g., cleveragents)
# <REPO> = the repo name (e.g., cleveragents-core)
# <GIT_NAME> = git user.name
# <GIT_EMAIL>= git user.email
# <USERNAME> = Forgejo username
# <N> = CA_MAX_PARALLEL_WORKERS value
Pre-flight: Launching 11 supervisors via prompt_async:
1. [ ] implementor-pool (issue-implementor)
2. [ ] reviewer-pool (ca-continuous-pr-reviewer)
3. [ ] tester-pool (ca-uat-tester)
4. [ ] hunter-pool (ca-bug-hunter)
5. [ ] human-liaison (ca-human-liaison)
6. [ ] agent-evolver (ca-agent-evolver)
7. [ ] arch-guard (ca-architecture-guard)
8. [ ] spec-updater (ca-spec-updater)
9. [ ] backlog-groomer (ca-backlog-groomer)
10. [ ] docs-writer (ca-docs-writer)
11. [ ] timeline-updater (ca-timeline-updater)
# ── Helper function: launch one supervisor ───────────────────────
# For EACH supervisor, SKIP if already running (adopted in Phase C.0).
function launch_supervisor(agent_name, display_name, prompt_text):
# Check if this supervisor was adopted from a previous run
if display_name in existing_supervisors:
# Already running — record its session ID and skip launch
echo "${display_name}=${existing_supervisors[display_name]}" \
>> /tmp/ca-supervisor-sessions.env
return # Do NOT create a new session
# Step 1: Create a session
SESSION_ID=$(curl -s -X POST "${SERVER}/session" \
-H "Content-Type: application/json" \
-d "{\"title\": \"[CA-AUTO] supervisor: ${display_name}\"}" \
| python3 -c "import sys,json; print(json.loads(sys.stdin.read())['id'])")
# Step 2: Fire-and-forget launch via prompt_async
curl -s -X POST "${SERVER}/session/${SESSION_ID}/prompt_async" \
-H "Content-Type: application/json" \
-d "{
\"agent\": \"${agent_name}\",
\"parts\": [{\"type\": \"text\", \"text\": \"${prompt_text}\"}]
}"
# Returns 204 immediately — supervisor is now running independently
# Step 3: Record session ID for monitoring
echo "${display_name}=${SESSION_ID}" >> /tmp/ca-supervisor-sessions.env
# ── Launch all 11 supervisors ────────────────────────────────────
# Clear any previous session tracking file
# ── Step 1: Clear tracking file ─────────────────────────────────
# Use Bash tool:
rm -f /tmp/ca-supervisor-sessions.env
# Launch each with its specific prompt containing all needed parameters:
# (Forgejo PAT, git identity, repo info, N, etc.)
# ── Step 2: Launch each supervisor with TWO curl calls ───────────
# For EACH of the 11 supervisors below, run a Bash tool call with
# the two curl commands. You may combine multiple launches into a
# single Bash call using && or ;.
#
# IMPORTANT: If a supervisor was already adopted in Phase C.0
# (exists in existing_supervisors), SKIP its launch and just record
# its session ID in the tracking file.
launch_supervisor("issue-implementor", "implementor-pool",
"You are the implementation pool supervisor.
Repo: <owner>/<repo>. Forgejo PAT: <PAT>.
Git: <name> <email>. Username: <username>.
Max parallel workers: N.
Milestone filter: all milestones.")
# The 11 supervisors to launch (agent_name | display_name | prompt):
#
# 1. issue-implementor | implementor-pool | implementation pool supervisor
# 2. ca-continuous-pr-reviewer | reviewer-pool | PR review pool supervisor
# 3. ca-uat-tester | tester-pool | UAT testing pool supervisor
# 4. ca-bug-hunter | hunter-pool | bug hunting pool supervisor
# 5. ca-human-liaison | human-liaison | human interaction liaison
# 6. ca-agent-evolver | agent-evolver | agent self-improvement
# 7. ca-architecture-guard | arch-guard | architecture coherence
# 8. ca-spec-updater | spec-updater | specification evolution
# 9. ca-backlog-groomer | backlog-groomer | backlog quality maintenance
# 10. ca-docs-writer | docs-writer | documentation updates
# 11. ca-timeline-updater | timeline-updater | timeline tracking
#
# For EACH supervisor, the Bash command pattern is:
#
# SID=$(curl -s -X POST "<SERVER>/session" \
# -H "Content-Type: application/json" \
# -d '{"title":"[CA-AUTO] supervisor: <display_name>"}' \
# | python3 -c "import sys,json;print(json.loads(sys.stdin.read())['id'])") && \
# curl -s -X POST "<SERVER>/session/${SID}/prompt_async" \
# -H "Content-Type: application/json" \
# -d '{"agent":"<agent_name>","parts":[{"type":"text","text":"<prompt>"}]}' && \
# echo "<display_name>=${SID}" >> /tmp/ca-supervisor-sessions.env
#
# Launch ALL 11 now. You may batch multiple into one Bash call or
# use one Bash call per supervisor — either is fine. But you MUST
# launch all 11 before proceeding to Phase C.2 Validation.
launch_supervisor("ca-continuous-pr-reviewer", "reviewer-pool",
"You are the PR review pool supervisor.
Repo: <owner>/<repo>. Instance ID: reviewer-pool-1.
Forgejo PAT: <PAT>. Git: <name> <email>. Username: <username>.
Max workers: N.")
launch_supervisor("ca-uat-tester", "tester-pool",
"You are the UAT testing pool supervisor.
Repo: <owner>/<repo>. Instance ID: uat-pool-1.
Forgejo PAT: <PAT>. Git: <name> <email>. Username: <username>.
max_workers: N.")
launch_supervisor("ca-bug-hunter", "hunter-pool",
"You are the bug hunting pool supervisor.
Repo: <owner>/<repo>. Instance ID: hunter-pool-1.
Forgejo PAT: <PAT>. Git: <name> <email>. Username: <username>.
max_workers: N.")
launch_supervisor("ca-human-liaison", "human-liaison",
"You are the human liaison.
Repo: <owner>/<repo>. Instance ID: human-liaison-1.
Forgejo PAT: <PAT>. Username: <username>.")
launch_supervisor("ca-agent-evolver", "agent-evolver",
"You are the agent evolver.
Repo: <owner>/<repo>. Instance ID: agent-evolver-1.
Forgejo PAT: <PAT>. Git: <name> <email>. Username: <username>.")
launch_supervisor("ca-architecture-guard", "arch-guard",
"You are the architecture guard.
Repo: <owner>/<repo>. Forgejo PAT: <PAT>.
Git: <name> <email>.")
launch_supervisor("ca-spec-updater", "spec-updater",
"You are the spec updater.
Repo: <owner>/<repo>. Forgejo PAT: <PAT>.
Git: <name> <email>.")
launch_supervisor("ca-backlog-groomer", "backlog-groomer",
"You are the backlog groomer.
Repo: <owner>/<repo>. Instance ID: groomer-1.
Username: <username>.")
launch_supervisor("ca-docs-writer", "docs-writer",
"You are the documentation writer.
Repo: <owner>/<repo>. Forgejo PAT: <PAT>.
Git: <name> <email>.")
launch_supervisor("ca-timeline-updater", "timeline-updater",
"You are the timeline updater.
Repo: <owner>/<repo>. Forgejo PAT: <PAT>.
Git: <name> <email>. Current day number: <N>.")
# ── PHASE C.2 VALIDATION ────────────────────────────────────────
# Verify all 11 sessions were created successfully.
REQUIRED = ["implementor-pool", "reviewer-pool", "tester-pool",
"hunter-pool", "human-liaison", "agent-evolver", "arch-guard",
"spec-updater", "backlog-groomer", "docs-writer", "timeline-updater"]
launched = read /tmp/ca-supervisor-sessions.env, extract display_names
missing = [s for s in REQUIRED if s not in launched]
if missing:
CRITICAL ERROR: Failed to launch all supervisors.
Missing: <missing>. Launched: <launched>.
Re-attempt launching the missing supervisors NOW.
ALL 11 supervisors are mandatory.
# ── Step 3: VALIDATION — count launched supervisors ──────────────
# After launching all 11, run this Bash tool call:
#
# wc -l /tmp/ca-supervisor-sessions.env
#
# The output MUST be 11. If it is less than 11, you MUST go back
# and launch the missing supervisors before proceeding.
# Read the file to see which are missing:
#
# cat /tmp/ca-supervisor-sessions.env
#
# Compare against the required list of 11 display names above.
# Launch any missing ones. Do NOT proceed until all 11 are confirmed.
invoke ca-session-persister with:
checkpoint: "Phase C.2: ALL 11 supervisors launched via prompt_async.
@@ -603,8 +560,11 @@ MONITORING LOOP (runs until product is verified complete):
if session is completed or errored or not found:
# ── IMMEDIATELY re-launch this supervisor ────────────
# Create new session + prompt_async (same as Phase C.2)
launch_supervisor(agent_name, display_name, prompt_text)
# Use Bash tool with curl commands (same pattern as Phase C.2):
# curl POST /session → curl POST /session/:id/prompt_async
# DO NOT use the Task tool — supervisors are not in your
# task permissions. Use bash curl only.
re-launch via bash curl prompt_async (same as Phase C.2)
supervisors_relaunched += 1
# Update the tracking file with the new session ID
@@ -963,11 +923,13 @@ No exceptions — every comment, every issue body, every PR description.
same pool supervisor. Each stream type gets exactly ONE supervisor that
manages N workers internally. Launching multiple supervisors of the same
type causes work duplication and coordination failures.
- **Supervisors are launched via prompt_async, NOT the Task tool.** The
Task tool blocks until the subagent returns — since supervisors run
indefinitely, this would block the product-builder forever. Use the
OpenCode Server's `POST /session/:id/prompt_async` endpoint which
returns 204 immediately (fire-and-forget).
- **Supervisors are launched via bash curl prompt_async, NEVER the Task
tool.** Supervisor agents have been REMOVED from your Task permissions —
you physically cannot invoke them via the Task tool. You MUST use the
Bash tool to run curl commands against the OpenCode Server HTTP API:
`POST /session` to create a session, then `POST /session/:id/prompt_async`
to launch (returns 204 immediately, fire-and-forget). If you attempt to
use the Task tool for any supervisor, it will be denied.
- **Supervisors are services, not batch jobs.** They run continuously,
polling for new work with `bash sleep` between cycles. The
product-builder monitors their session status and re-launches any