✔ the PM gets its task verbs and the reads, and no launch (5.952717ms) ✔ the chief of staff gets launch, send_message, end_run and change_organization, and no task verbs (2.062539ms) ✔ request_staff is the pm's alone: staff.request over message.send, roles and counts bounded (7.127672ms) ✔ end_run sends role and reason, no decision; change_organization sends revision and the organization keys (1.265174ms) ✔ the organization keys change_organization takes are the broker's ORGANIZATION_KEYS (0.083198ms) ✔ a role without role.end or organization.change gets neither tool, and each tool follows its own grant (5.089895ms) ✔ the assistant gets send_message, the reads and the web tools (it holds the web grant), no launch (0.840647ms) ✔ list_requirements reads the requirement ids, for a task.create holder with a tracker (1.562099ms) ✔ a coder gets no launch, no resolve_decision, and no task tools without a tracker (0.766939ms) ✔ a coder with a tracker gets its own task tools and no task_reassign (0.794408ms) ✔ launch only when the business's launch block names the instance as launcher (1.458379ms) ✔ an action outside the instance's authority has no tool (0.821668ms) ✔ the review loop: push_working and request_review for the coder, fetch_review and review_verdict for the reviewer, none for the PM (3.303109ms) ✔ callTool: one JSON line out, the result back, a refusal rejects (7.841259ms) ✔ list_tasks takes the broker's filters and pages; get_task takes a task_ref (1.984775ms) ✔ callTool sends list_tasks done false unless the session names done; other tools as given (2.187672ms) ✔ replyText: compact JSON up to the cap, an error naming the size and the cap over it (0.541918ms) ✔ web_search's query maxLength is the web layer's SEARCH_MAX_QUERY_CHARS (2.331519ms) ℹ tests 18 ℹ suites 0 ℹ pass 18 ℹ fail 0 ℹ cancelled 0 ℹ skipped 0 ℹ todo 0 ℹ duration_ms 114.813846