✔ the PM gets its task verbs and the reads, and no launch (6.235387ms)
✔ send_message offers the BLOCK class, beside the classes it already had (1.289928ms)
✔ the chief of staff gets launch, send_message, end_run, change_organization and set_name, and no task verbs (1.159393ms)
✔ request_staff is the pm's alone: staff.request over message.send, roles and counts bounded (6.840623ms)
✔ end_run sends role and reason, no decision; change_organization sends revision and the organization keys (1.133789ms)
✔ set_name sends instance and name to name.set under instance.name, only for a holder of that grant (4.745014ms)
✔ the organization keys change_organization takes are the broker's ORGANIZATION_KEYS and the settings' SETTINGS_KEYS (0.071815ms)
✔ a role without role.end or organization.change gets none of the three tools, and each follows its own grant (4.343407ms)
✔ no role's tools send instances or instances.set, and change_organization takes no instance write keys (4.514539ms)
✔ the assistant gets send_message, the reads and the web tools (it holds the web grant), no launch (0.818244ms)
✔ list_requirements reads the requirement ids, for a task.create holder with a tracker (1.528646ms)
✔ a coder gets no launch, no resolve_decision, and no task tools without a tracker (0.705822ms)
✔ a coder with a tracker gets its own task tools and no task_reassign (0.723185ms)
✔ launch only when the business's launch block names the instance as launcher (1.300485ms)
✔ an action outside the instance's authority has no tool (0.765739ms)
✔ the review loop: push_working and request_review for the coder, fetch_review and review_verdict for the reviewer, none for the PM (2.580356ms)
✔ land_work is there only with land, after push_working, with the task and the decision (1.703074ms)
✔ callTool: one JSON line out, the result back, a refusal rejects (7.15553ms)
✔ list_tasks takes the broker's filters and pages; get_task takes a task_ref (1.472693ms)
✔ callTool sends list_tasks done false unless the session names done; other tools as given (1.745259ms)
✔ replyText: compact JSON up to the cap, an error naming the size and the cap over it (0.439861ms)
✔ web_search's query maxLength is the web layer's SEARCH_MAX_QUERY_CHARS (1.766321ms)
ℹ tests 22
ℹ suites 0
ℹ pass 22
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 121.152375
