agents: Researcher row 132 packet (#1628, end_run and change_organization harness tools)
Round 1 packet in agents/researcher/work/queue-132/: row132.patch (8 files, +162 -19) on b6a588cd2,
candidate manifest, build.md, 28 mutants killed, full gate green. No candidate change applied here.
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
This commit is contained in:
@@ -0,0 +1,121 @@
|
||||
# Row 132 (#1628): harness tools for ending a run and changing the organization file
|
||||
|
||||
Seat: Researcher. Reviewer: Filbert (broker authority, no sandbox change). Gate owner: Sage.
|
||||
Requirements: REQ-ROLE-2, REQ-COS-1, REQ-LIMIT-1.
|
||||
Brief: `docs/plans/2026-10-14_prd-1.2-build.md`, section "Harness tools for ending a run and changing the organization file".
|
||||
|
||||
**Base: b6a588cd2** (detached worktree). Rows 119, 120, 122 and 123 are in it. No path under `packages/harness`, `packages/bus` or
|
||||
`packages/business` changed between b6a588cd2 and canonical HEAD 4a34fb0d6 (checked with `git diff --name-only`; later commits are docs and queue only).
|
||||
`row132.patch` is a diff of my changes only: 8 files, +162 −19. It applies with `git apply --cached --check` on b6a588cd2 and
|
||||
round-trips to the candidate tree `85056b71653ac02634d1742d2e72e4f3588bcbbd`.
|
||||
`candidate-manifest.sha256` lists the 8 files (`packages/bus/src/broker.mjs` among them), file sha256 `ba644f8d97cfa88175fe0157d9f77523cee7e5821ddbd676b29aae46fa73cf07`.
|
||||
Nothing is committed in the worktree, nothing is pushed, and no live store, unit, credential or `~/.mosaic` file was touched.
|
||||
|
||||
## For the 3d re-pin window: the chief's bundle manifest
|
||||
|
||||
**The chief of staff's bundle manifest lists both tools in `typed` and `untyped` is `[]`, for both harnesses.**
|
||||
Test: `packages/harness/tests/bundle.test.mjs:85`, "a chief-of-staff bundle lists end_run and change_organization as typed and nothing untyped, for either harness".
|
||||
It builds a bundle for the `chief` instance (definition `chief-of-staff`) with `buildBundle` and asserts, per harness:
|
||||
|
||||
| Harness | `manifest.typed` | `manifest.untyped` |
|
||||
|---|---|---|
|
||||
| `pi` | `send_message, launch, end_run, change_organization, raise_decision, list_agents, inbox, trail, list_tasks, get_task` | `[]` |
|
||||
| `claude-code` | the same ten, each as `mcp__mosaic__<name>` (so `mcp__mosaic__end_run`, `mcp__mosaic__change_organization`) | `[]` |
|
||||
|
||||
The same test checks the prompt's `Bus tools:` line and that the "Actions you hold that have no bus tool yet" line is absent.
|
||||
`tools.test.mjs:33` asserts `untypedActions(chief, tools)` is `[]` (it was `["role.end", "organization.change"]` after row 123).
|
||||
Controls and mutants m3b and m4b (below) fail this test if either tool goes missing from `typed`.
|
||||
|
||||
## What the row does
|
||||
|
||||
1. **`end_run`** (`packages/harness/src/tools.mjs:141`): a session gets it when its resolved `limits.authority` holds `role.end`.
|
||||
Verb `role.revoke`, parameters `role` and `reason` (1 to 500 characters), **no `decision`**. The broker already refuses the
|
||||
caller's own run and the assistant's with `role-end-refused`; the runner passes that code through (`refused: role-end-refused`).
|
||||
2. **`change_organization`** (`tools.mjs:147`): a session gets it when it holds `organization.change`. Verb `organization.set`,
|
||||
parameters `revision` (64 hex characters, required), `limits`, `models`, `instances`. A stale revision fails with `revision-conflict`.
|
||||
3. **Key list in one place, with a failing test.** `ORGANIZATION_KEYS` is exported from `tools.mjs` for the harness; the
|
||||
broker's own list at `packages/bus/src/broker.mjs:99` is now exported too, and `tools.test.mjs:64` fails if the two differ
|
||||
(mutants m15, m16).
|
||||
4. **Bundle text** (`bundle.mjs:92-96`): the "only the human stops a run" bullet is now chosen by whether the session has `end_run`.
|
||||
A `role.end` holder is told to use `end_run` with a reason and what is still the human's (`mosaic stop`, and a `role.revoke`
|
||||
decision for anything the broker refuses). Every other role keeps today's text byte for byte (test `bundle.test.mjs:98`).
|
||||
5. **README text** in `packages/harness/README.md` and `packages/business/README.md`.
|
||||
|
||||
### Bus change: the `export` is the only one
|
||||
|
||||
`packages/bus/src/broker.mjs` changes by one word, `const` to `export const`, on the line that declares `ORGANIZATION_KEYS` (line 99; +1 −1).
|
||||
**No bus behaviour changes.** No verb, check, schema, migration or message text in `packages/bus` differs. The bus suite is
|
||||
191/191 on this candidate.
|
||||
|
||||
## Out of scope: the chief cannot read the revision (row 134)
|
||||
|
||||
`change_organization` needs the file's current `revision`. The only read, the broker's `limits` verb, is human-only
|
||||
(`broker.mjs:729`: `if (!role && !s.human) fail("human-required")`), and `organization.set` takes the keys at line 732 with `revision` required.
|
||||
So **today the tool works only when the chief already has the current revision from somewhere else.** A stale or unknown
|
||||
revision fails with `revision-conflict` (`packages/business/src/organization.mjs:185`), so `change_organization` fails closed.
|
||||
This does not block the 3d window, which checks the manifest only.
|
||||
The gap is **row 134**, queued at rev 1327, brief `docs/plans/2026-10-15_organization-revision-read.md` (commit 26f4f9701). Row 132 does not grow to cover it.
|
||||
|
||||
Other items I did not touch: P19 task 299 (outcome-unknown after the writer) is not part of this row; the `reason` control-character
|
||||
decision from row 123 round 2 stands.
|
||||
|
||||
## Tests
|
||||
|
||||
| File | Change |
|
||||
|---|---|
|
||||
| `packages/harness/tests/tools.test.mjs` | chief test renamed and its tool list updated, `untypedActions` back to `[]` (line 33); shape test (46); parity with the broker's list (64); non-grant roles and per-grant (69) |
|
||||
| `packages/harness/tests/bundle.test.mjs` | chief Bus tools regex (74); typed/untyped for both harnesses (85); stop-line variants (98) |
|
||||
| `packages/harness/tests/runner.test.mjs` | fixture gains `chief` and `assistant`, `setup()` takes `as`/`organization`; test 377 runs both tools through a real broker with a fake organization writer: `{"revoked":true}`, `refused: role-end-refused` for the self and assistant cases, the writer called with `["demo","limits.set",args,"chief-of-staff.chief"]`, `refused: invalid-request` for a key outside the list, `refused: revision-conflict` for a stale revision |
|
||||
|
||||
## Mutants
|
||||
|
||||
`mutants.sh <worktree> <outdir>`, started 2026-10-15T18:00:05Z (`mutants-started.txt`), results in `mutants-run.txt`, one `.out`, `.rc` and `.patch` per mutant in `mutants/`.
|
||||
Three controls (the tools, bundle and runner tests on the unmutated candidate) pass: 16/16, 11/11, 23/23.
|
||||
**All 28 mutants fail their tests.** The worktree was restored after the run (`git status` shows the same 8 files).
|
||||
|
||||
| Mutant | What it breaks | Killed by |
|
||||
|---|---|---|
|
||||
| m1, m2 | `end_run` / `change_organization` for every role | tools test (7 failures each) |
|
||||
| m3, m3b / m4, m4b | either tool never offered (tools, bundle) | tools 3, bundle 3 / tools 3, bundle 2 |
|
||||
| m5, m5b | `end_run` verb wrong (tools; runner) | shape test; runner test 377 |
|
||||
| m6 | `end_run` carries no action, so no grant is checked | tools tests |
|
||||
| m7, m7b | `change_organization` verb wrong (tools; runner) | shape test; runner test 377 |
|
||||
| m8 | `change_organization` carries no action, so no grant is checked | tools tests |
|
||||
| m9 | `reason` optional | shape test |
|
||||
| m10 | `end_run` takes a `decision` | shape test |
|
||||
| m11 | `reason` unbounded | shape test |
|
||||
| m12 | `revision` optional | shape test |
|
||||
| m13 | `revision` pattern dropped | shape test |
|
||||
| m14 | `end_run` description loses the own-run, assistant and `role-end-refused` sentence | shape test |
|
||||
| m15 | a key dropped from the harness list | shape test, parity test |
|
||||
| m16 | a key added to the broker list | parity test |
|
||||
| m17 | the bundle keeps the old stop line for the chief | stop-line test |
|
||||
| m18 | the new stop line for every role | stop-line test, pi bundle test |
|
||||
| m19, m20, m21 | the new text loses the reason requirement, the own-run and assistant sentence, or the "anything the broker refuses" wording | stop-line test |
|
||||
| m22 | the runner drops the tool's arguments | runner test 377, capability test |
|
||||
| m23 | the runner sends the tool name as the verb | runner test 377, capability test |
|
||||
| m24 | the runner hides the broker's refusal code | runner test 377, capability test |
|
||||
|
||||
## Gate
|
||||
|
||||
`suites.sh <worktree> <outdir>`, 2026-10-15T18:01:54Z to 18:03:33Z (`gate-started.txt`, `gate-finished.txt`, `suites-run.txt`, output per suite in `suites/`).
|
||||
All rc=0; the full set, including the harness, bus and business suites the brief asks for:
|
||||
|
||||
| Suite | Result |
|
||||
|---|---|
|
||||
| business | 92/92 |
|
||||
| bus | 191/191 |
|
||||
| plugins | 21/21 |
|
||||
| tasks | 97/97 |
|
||||
| cli | 195/195 |
|
||||
| webui | 112/112 |
|
||||
| harness | 90/90 |
|
||||
| seat | 132/132 |
|
||||
| scripts/test-land-work.sh | 84 passed, 0 failed |
|
||||
|
||||
No flake (#258, #261, #262, #263) recurred. The gate left no Docker network (before and after `docker network ls` identical). A busy check (by exit status, `/proc` cwd links only) was clear at 2026-10-15T17:59:14Z before the run.
|
||||
|
||||
## Not covered
|
||||
|
||||
- The live chief session: no session was launched. The evidence is the bundle test and the runner test against a real broker.
|
||||
- Whether a model uses `end_run` well. The text tells it what to do; nothing tests the model.
|
||||
@@ -0,0 +1,8 @@
|
||||
0cbfcd4e2aac8915412d617c7f968d5c07beaddcb52a16a4516717617011aa8c packages/business/README.md
|
||||
48f405e82e2bfa5da4df964eb7191aeeed31747235c4b2db17fed41f09ad6bea packages/bus/src/broker.mjs
|
||||
a8e4a18061c0f42681399c26171f59435cbbf3f1cbc319e9fc2c9c89fc7f4147 packages/harness/README.md
|
||||
b30e34e659812df92ffa8040795688807cd2d2a84c68d957581573563b489cde packages/harness/src/bundle.mjs
|
||||
58130e3b2e04da615bf003a67848703fdd1afb7e134622c522f4c85c5fa45c39 packages/harness/src/tools.mjs
|
||||
cbc74e0c09431a5e09667c5e5d4f24f6a1995134288d637626c11fa48e4f7275 packages/harness/tests/bundle.test.mjs
|
||||
363273c580ec2c6bb4fb4305195457f023ef80a1ae00ac1bd5ec20f06d5fc54b packages/harness/tests/runner.test.mjs
|
||||
d0a43db2163a9be350b4e9c727dbac8c729c072d3f9cdfbf2e1a0d01020d145e packages/harness/tests/tools.test.mjs
|
||||
@@ -0,0 +1,8 @@
|
||||
M packages/bus/src/broker.mjs
|
||||
M packages/business/README.md
|
||||
M packages/harness/README.md
|
||||
M packages/harness/src/bundle.mjs
|
||||
M packages/harness/src/tools.mjs
|
||||
M packages/harness/tests/bundle.test.mjs
|
||||
M packages/harness/tests/runner.test.mjs
|
||||
M packages/harness/tests/tools.test.mjs
|
||||
@@ -0,0 +1 @@
|
||||
2026-10-15T18:03:33Z
|
||||
@@ -0,0 +1 @@
|
||||
2026-10-15T18:01:54Z
|
||||
@@ -0,0 +1 @@
|
||||
2026-10-15T18:01:45Z
|
||||
@@ -0,0 +1,115 @@
|
||||
control-tools: exit 0; ℹ tests 16 ℹ pass 16 ℹ fail 0
|
||||
control-bundle: exit 0; ℹ tests 11 ℹ pass 11 ℹ fail 0
|
||||
control-runner: exit 0; ℹ tests 23 ℹ pass 23 ℹ fail 0
|
||||
m1-end-run-always: exit 1; ℹ tests 16 ℹ pass 9 ℹ fail 7
|
||||
failed: ✖ a coder gets no launch, no resolve_decision, and no task tools without a tracker
|
||||
failed: ✖ a coder with a tracker gets its own task tools and no task_reassign
|
||||
failed: ✖ an action outside the instance's authority has no tool
|
||||
failed: ✖ a role without role.end or organization.change gets neither tool, and each tool follows its own grant
|
||||
failed: ✖ failing tests:
|
||||
failed: ✖ the assistant gets send_message and the reads, no launch
|
||||
failed: ✖ the PM gets its task verbs and the reads, and no launch
|
||||
failed: ✖ the review loop: push_working and request_review for the coder, fetch_review and review_verdict for the reviewer, none for the PM
|
||||
m2-change-organization-always: exit 1; ℹ tests 16 ℹ pass 9 ℹ fail 7
|
||||
failed: ✖ a coder gets no launch, no resolve_decision, and no task tools without a tracker
|
||||
failed: ✖ a coder with a tracker gets its own task tools and no task_reassign
|
||||
failed: ✖ an action outside the instance's authority has no tool
|
||||
failed: ✖ a role without role.end or organization.change gets neither tool, and each tool follows its own grant
|
||||
failed: ✖ failing tests:
|
||||
failed: ✖ the assistant gets send_message and the reads, no launch
|
||||
failed: ✖ the PM gets its task verbs and the reads, and no launch
|
||||
failed: ✖ the review loop: push_working and request_review for the coder, fetch_review and review_verdict for the reviewer, none for the PM
|
||||
m3-end-run-never: exit 1; ℹ tests 16 ℹ pass 13 ℹ fail 3
|
||||
failed: ✖ a role without role.end or organization.change gets neither tool, and each tool follows its own grant
|
||||
failed: ✖ end_run sends role and reason, no decision; change_organization sends revision and the organization keys
|
||||
failed: ✖ failing tests:
|
||||
failed: ✖ the chief of staff gets launch, send_message, end_run and change_organization, and no task verbs
|
||||
m3b-end-run-never-bundle: exit 1; ℹ tests 11 ℹ pass 8 ℹ fail 3
|
||||
failed: ✖ a chief-of-staff bundle lists end_run and change_organization as typed and nothing untyped, for either harness
|
||||
failed: ✖ a chief-of-staff bundle lists launch among the bus tools and the manifest's typed tools
|
||||
failed: ✖ failing tests:
|
||||
failed: ✖ the stop line names end_run for a role.end holder, and every other role keeps today's text
|
||||
m4-change-organization-never: exit 1; ℹ tests 16 ℹ pass 13 ℹ fail 3
|
||||
failed: ✖ a role without role.end or organization.change gets neither tool, and each tool follows its own grant
|
||||
failed: ✖ end_run sends role and reason, no decision; change_organization sends revision and the organization keys
|
||||
failed: ✖ failing tests:
|
||||
failed: ✖ the chief of staff gets launch, send_message, end_run and change_organization, and no task verbs
|
||||
m4b-change-organization-never-bundle: exit 1; ℹ tests 11 ℹ pass 9 ℹ fail 2
|
||||
failed: ✖ a chief-of-staff bundle lists end_run and change_organization as typed and nothing untyped, for either harness
|
||||
failed: ✖ a chief-of-staff bundle lists launch among the bus tools and the manifest's typed tools
|
||||
failed: ✖ failing tests:
|
||||
m5-end-run-verb: exit 1; ℹ tests 16 ℹ pass 15 ℹ fail 1
|
||||
failed: ✖ end_run sends role and reason, no decision; change_organization sends revision and the organization keys
|
||||
failed: ✖ failing tests:
|
||||
m5b-end-run-verb-runner: exit 1; ℹ tests 23 ℹ pass 22 ℹ fail 1
|
||||
failed: ✖ end_run and change_organization reach the broker with the tool's arguments, and refusals keep their codes
|
||||
failed: ✖ failing tests:
|
||||
m6-end-run-action: exit 1; ℹ tests 16 ℹ pass 14 ℹ fail 2
|
||||
failed: ✖ end_run sends role and reason, no decision; change_organization sends revision and the organization keys
|
||||
failed: ✖ failing tests:
|
||||
failed: ✖ the chief of staff gets launch, send_message, end_run and change_organization, and no task verbs
|
||||
m7-change-organization-verb: exit 1; ℹ tests 16 ℹ pass 15 ℹ fail 1
|
||||
failed: ✖ end_run sends role and reason, no decision; change_organization sends revision and the organization keys
|
||||
failed: ✖ failing tests:
|
||||
m7b-change-organization-verb-runner: exit 1; ℹ tests 23 ℹ pass 22 ℹ fail 1
|
||||
failed: ✖ end_run and change_organization reach the broker with the tool's arguments, and refusals keep their codes
|
||||
failed: ✖ failing tests:
|
||||
m8-change-organization-action: exit 1; ℹ tests 16 ℹ pass 14 ℹ fail 2
|
||||
failed: ✖ end_run sends role and reason, no decision; change_organization sends revision and the organization keys
|
||||
failed: ✖ failing tests:
|
||||
failed: ✖ the chief of staff gets launch, send_message, end_run and change_organization, and no task verbs
|
||||
m9-reason-optional: exit 1; ℹ tests 16 ℹ pass 15 ℹ fail 1
|
||||
failed: ✖ end_run sends role and reason, no decision; change_organization sends revision and the organization keys
|
||||
failed: ✖ failing tests:
|
||||
m10-end-run-decision: exit 1; ℹ tests 16 ℹ pass 15 ℹ fail 1
|
||||
failed: ✖ end_run sends role and reason, no decision; change_organization sends revision and the organization keys
|
||||
failed: ✖ failing tests:
|
||||
m11-reason-unbounded: exit 1; ℹ tests 16 ℹ pass 15 ℹ fail 1
|
||||
failed: ✖ end_run sends role and reason, no decision; change_organization sends revision and the organization keys
|
||||
failed: ✖ failing tests:
|
||||
m12-revision-optional: exit 1; ℹ tests 16 ℹ pass 15 ℹ fail 1
|
||||
failed: ✖ end_run sends role and reason, no decision; change_organization sends revision and the organization keys
|
||||
failed: ✖ failing tests:
|
||||
m13-revision-pattern: exit 1; ℹ tests 16 ℹ pass 15 ℹ fail 1
|
||||
failed: ✖ end_run sends role and reason, no decision; change_organization sends revision and the organization keys
|
||||
failed: ✖ failing tests:
|
||||
m14-description-limits: exit 1; ℹ tests 16 ℹ pass 15 ℹ fail 1
|
||||
failed: ✖ end_run sends role and reason, no decision; change_organization sends revision and the organization keys
|
||||
failed: ✖ failing tests:
|
||||
m15-harness-key-dropped: exit 1; ℹ tests 16 ℹ pass 14 ℹ fail 2
|
||||
failed: ✖ end_run sends role and reason, no decision; change_organization sends revision and the organization keys
|
||||
failed: ✖ failing tests:
|
||||
failed: ✖ the organization keys change_organization takes are the broker's ORGANIZATION_KEYS
|
||||
m16-broker-key-added: exit 1; ℹ tests 16 ℹ pass 15 ℹ fail 1
|
||||
failed: ✖ failing tests:
|
||||
failed: ✖ the organization keys change_organization takes are the broker's ORGANIZATION_KEYS
|
||||
m17-bundle-text-unchanged: exit 1; ℹ tests 11 ℹ pass 10 ℹ fail 1
|
||||
failed: ✖ failing tests:
|
||||
failed: ✖ the stop line names end_run for a role.end holder, and every other role keeps today's text
|
||||
m18-bundle-text-for-all: exit 1; ℹ tests 11 ℹ pass 9 ℹ fail 2
|
||||
failed: ✖ a pi bundle: prompt, policy, tools and manifest, 0600 in a 0700 directory
|
||||
failed: ✖ failing tests:
|
||||
failed: ✖ the stop line names end_run for a role.end holder, and every other role keeps today's text
|
||||
m19-text-reason: exit 1; ℹ tests 11 ℹ pass 10 ℹ fail 1
|
||||
failed: ✖ failing tests:
|
||||
failed: ✖ the stop line names end_run for a role.end holder, and every other role keeps today's text
|
||||
m20-text-limits: exit 1; ℹ tests 11 ℹ pass 10 ℹ fail 1
|
||||
failed: ✖ failing tests:
|
||||
failed: ✖ the stop line names end_run for a role.end holder, and every other role keeps today's text
|
||||
m21-text-fallback: exit 1; ℹ tests 11 ℹ pass 10 ℹ fail 1
|
||||
failed: ✖ failing tests:
|
||||
failed: ✖ the stop line names end_run for a role.end holder, and every other role keeps today's text
|
||||
m22-runner-drops-args: exit 1; ℹ tests 23 ℹ pass 21 ℹ fail 2
|
||||
failed: ✖ end_run and change_organization reach the broker with the tool's arguments, and refusals keep their codes
|
||||
failed: ✖ failing tests:
|
||||
failed: ✖ typed tools carry the runner's capability; launch goes to the host's launch socket
|
||||
m23-runner-name-as-verb: exit 1; ℹ tests 23 ℹ pass 21 ℹ fail 2
|
||||
failed: ✖ end_run and change_organization reach the broker with the tool's arguments, and refusals keep their codes
|
||||
failed: ✖ failing tests:
|
||||
failed: ✖ typed tools carry the runner's capability; launch goes to the host's launch socket
|
||||
m24-runner-hides-code: exit 1; ℹ tests 23 ℹ pass 21 ℹ fail 2
|
||||
failed: ✖ end_run and change_organization reach the broker with the tool's arguments, and refusals keep their codes
|
||||
failed: ✖ failing tests:
|
||||
failed: ✖ typed tools carry the runner's capability; launch goes to the host's launch socket
|
||||
done
|
||||
exit=0
|
||||
@@ -0,0 +1 @@
|
||||
2026-10-15T18:00:05Z
|
||||
Executable
+102
@@ -0,0 +1,102 @@
|
||||
#!/usr/bin/env bash
|
||||
# Row 132 (#1628): harness tools for ending a run and changing the organization file.
|
||||
# Each check must fail on a mutant. For each mutant this runs one named test file against the
|
||||
# real source (control) and against the source with one exact-once text edit, in the given worktree,
|
||||
# one test file at a time, and restores every source file on exit.
|
||||
# Usage: mutants.sh <worktree> <outdir> (MUTANT_DRY=1 only proves every edit matches exactly once)
|
||||
set -u
|
||||
WT=$(cd "$1" && pwd); OUT=$(mkdir -p "$2" && cd "$2" && pwd)
|
||||
cd "$WT" || exit 2
|
||||
BAK=$(mktemp -d "$OUT/.bak.XXXXXX")
|
||||
declare -A SAVED
|
||||
save() { [ -n "${SAVED[$1]:-}" ] || { mkdir -p "$BAK/$(dirname "$1")"; cp "$1" "$BAK/$1"; SAVED[$1]=1; }; }
|
||||
restore() { for f in "${!SAVED[@]}"; do cp "$BAK/$f" "$f"; done; rm -rf "$BAK"; }
|
||||
trap restore EXIT
|
||||
edit() { # file old new: exact-once replace
|
||||
save "$1"
|
||||
node -e '
|
||||
const fs = require("fs"); const [f, a, b] = process.argv.slice(1);
|
||||
const s = fs.readFileSync(f, "utf8"); const n = s.split(a).length - 1;
|
||||
if (n !== 1) { console.error("expected one match, found " + n); process.exit(3); }
|
||||
fs.writeFileSync(f, s.replace(a, () => b));
|
||||
' "$1" "$2" "$3"
|
||||
}
|
||||
run() { # name testfile
|
||||
if [ -n "${MUTANT_DRY:-}" ]; then echo "$1: edit ok (dry)"; return; fi
|
||||
setsid -w timeout -k 10 400 node --test "$2" > "$OUT/$1.out" 2>&1; echo "$?" > "$OUT/$1.rc"
|
||||
echo "$1: exit $(cat "$OUT/$1.rc"); $(grep -E '^ℹ (tests|pass|fail)' "$OUT/$1.out" | tr '\n' ' ')"
|
||||
grep -E '^✖' "$OUT/$1.out" | sort -u | sed 's/ ([0-9.]*ms)$//' | sed "s/^/ failed: /"
|
||||
}
|
||||
mutant() { # name testfile file old new
|
||||
edit "$3" "$4" "$5" || { echo "$1: edit failed"; return; }
|
||||
diff -u "$BAK/$3" "$3" > "$OUT/$1.patch"
|
||||
run "$1" "$2"
|
||||
cp "$BAK/$3" "$3"
|
||||
}
|
||||
H=packages/harness; TT=$H/tests/tools.test.mjs; BT=$H/tests/bundle.test.mjs; RT=$H/tests/runner.test.mjs
|
||||
T=$H/src/tools.mjs; BD=$H/src/bundle.mjs; RN=$H/src/runner.mjs; B=packages/bus/src/broker.mjs
|
||||
for t in "$TT" "$BT" "$RT"; do run "control-$(basename "$t" .test.mjs)" "$t"; done
|
||||
|
||||
# The chief gets both tools; a role without the grants gets neither
|
||||
# m1: end_run is offered to every role
|
||||
mutant m1-end-run-always "$TT" "$T" 'if (held.has("role.end")) {' 'if (true) {'
|
||||
# m2: change_organization is offered to every role
|
||||
mutant m2-change-organization-always "$TT" "$T" 'if (held.has("organization.change")) {' 'if (true) {'
|
||||
# m3: the chief gets no end_run
|
||||
mutant m3-end-run-never "$TT" "$T" 'if (held.has("role.end")) {' 'if (false) {'
|
||||
mutant m3b-end-run-never-bundle "$BT" "$T" 'if (held.has("role.end")) {' 'if (false) {'
|
||||
# m4: the chief gets no change_organization
|
||||
mutant m4-change-organization-never "$TT" "$T" 'if (held.has("organization.change")) {' 'if (false) {'
|
||||
mutant m4b-change-organization-never-bundle "$BT" "$T" 'if (held.has("organization.change")) {' 'if (false) {'
|
||||
|
||||
# What each tool sends
|
||||
# m5: end_run goes to the wrong verb
|
||||
mutant m5-end-run-verb "$TT" "$T" 'add("end_run", "role.revoke", "role.end", ' 'add("end_run", "role.end", "role.end", '
|
||||
mutant m5b-end-run-verb-runner "$RT" "$T" 'add("end_run", "role.revoke", "role.end", ' 'add("end_run", "role.end", "role.end", '
|
||||
# m6: end_run has no action, so the manifest lists role.end as untyped
|
||||
mutant m6-end-run-action "$TT" "$T" 'add("end_run", "role.revoke", "role.end", ' 'add("end_run", "role.revoke", null, '
|
||||
# m7: change_organization goes to the human's verb
|
||||
mutant m7-change-organization-verb "$TT" "$T" 'add("change_organization", "organization.set", "organization.change",' 'add("change_organization", "limits.set", "organization.change",'
|
||||
mutant m7b-change-organization-verb-runner "$RT" "$T" 'add("change_organization", "organization.set", "organization.change",' 'add("change_organization", "limits.set", "organization.change",'
|
||||
# m8: change_organization has no action, so the manifest lists organization.change as untyped
|
||||
mutant m8-change-organization-action "$TT" "$T" 'add("change_organization", "organization.set", "organization.change",' 'add("change_organization", "organization.set", null,'
|
||||
# m9: reason isn't required
|
||||
mutant m9-reason-optional "$TT" "$T" '}, ["role", "reason"]));' '}, ["role"]));'
|
||||
# m10: end_run takes a decision
|
||||
mutant m10-end-run-decision "$TT" "$T" ' }, ["role", "reason"]));' ' decision: COMMON.decision,
|
||||
}, ["role", "reason"]));'
|
||||
# m11: the reason has no useful bound
|
||||
mutant m11-reason-unbounded "$TT" "$T" 'maxLength: 500 }' 'maxLength: 50000 }'
|
||||
# m12: revision isn't required
|
||||
mutant m12-revision-optional "$TT" "$T" '}, ["revision"]));' '}, []));'
|
||||
# m13: revision takes any string
|
||||
mutant m13-revision-pattern "$TT" "$T" 'pattern: "^[a-f0-9]{64}$" }' 'pattern: "^.*$" }'
|
||||
# m14: the description drops the own-run and assistant limits
|
||||
mutant m14-description-limits "$TT" "$T" "You can't end your own run or the assistant's; the broker refuses with role-end-refused." 'The broker refuses some runs.'
|
||||
|
||||
# One key list
|
||||
# m15: the harness list drops a key
|
||||
mutant m15-harness-key-dropped "$TT" "$T" '"revision", "limits", "models", "instances"])' '"revision", "limits", "instances"])'
|
||||
# m16: the broker list gains a key
|
||||
mutant m16-broker-key-added "$TT" "$B" "export const ORGANIZATION_KEYS = ['revision', 'limits', 'models', 'instances'];" "export const ORGANIZATION_KEYS = ['revision', 'limits', 'models', 'instances', 'plugins'];"
|
||||
|
||||
# The bundle text
|
||||
# m17: a role.end holder keeps the human-only text
|
||||
mutant m17-bundle-text-unchanged "$BT" "$BD" 'lines.push(named.has("end_run")' 'lines.push(false'
|
||||
# m18: every role gets the role.end text
|
||||
mutant m18-bundle-text-for-all "$BT" "$BD" 'lines.push(named.has("end_run")' 'lines.push(true'
|
||||
# m19: the text drops the reason requirement
|
||||
mutant m19-text-reason "$BT" "$BD" '; the reason is required and goes into the log' ''
|
||||
# m20: the text drops the own-run and assistant limits
|
||||
mutant m20-text-limits "$BT" "$BD" " You can't end your own run or the assistant's." ''
|
||||
# m21: the text drops the decision fallback
|
||||
mutant m21-text-fallback "$BT" "$BD" 'For anything the broker refuses, raise a role.revoke decision' 'For anything else, raise a role.revoke decision'
|
||||
|
||||
# Through the runner
|
||||
# m22: the runner drops the tool's arguments
|
||||
mutant m22-runner-drops-args "$RT" "$RN" 'await client.call(tool.verb, args)' 'await client.call(tool.verb, {})'
|
||||
# m23: the runner sends the tool's name as the verb
|
||||
mutant m23-runner-name-as-verb "$RT" "$RN" 'await client.call(tool.verb, args)' 'await client.call(tool.name, args)'
|
||||
# m24: the runner hides the broker's refusal code
|
||||
mutant m24-runner-hides-code "$RT" "$RN" 'error: /^[a-z-]{1,64}$/.test(e.code ?? "") ? e.code : "tool-failed"' 'error: "tool-failed"'
|
||||
echo done
|
||||
@@ -0,0 +1,19 @@
|
||||
✔ sessionModel: agent vars win, then the system's execution settings (9.423776ms)
|
||||
✔ a pi bundle: prompt, policy, tools and manifest, 0600 in a 0700 directory (3.95253ms)
|
||||
✔ a chief-of-staff bundle lists launch among the bus tools and the manifest's typed tools (2.683677ms)
|
||||
✔ a chief-of-staff bundle lists end_run and change_organization as typed and nothing untyped, for either harness (5.454218ms)
|
||||
✔ the stop line names end_run for a role.end holder, and every other role keeps today's text (5.448269ms)
|
||||
✔ a claude-code bundle adds the wrapped gate hook and the MCP config (1.873611ms)
|
||||
✔ the prompt's built-in tools line is the harness's own names, as the manifest lists them (6.343566ms)
|
||||
✔ the prompt names the project clones in the workspace, and none when there are none (5.596015ms)
|
||||
✔ the prompt explains the review loop to a role with push_working, and reviews to one with fetch_review (6.415933ms)
|
||||
✔ a bundle is written once: an existing file refuses (1.349653ms)
|
||||
✔ a path with a single quote can't go into the hook command (1.398172ms)
|
||||
ℹ tests 11
|
||||
ℹ suites 0
|
||||
ℹ pass 11
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 126.870806
|
||||
@@ -0,0 +1 @@
|
||||
0
|
||||
@@ -0,0 +1,31 @@
|
||||
✔ founderCheck: founder variables, then a needed service without a usable token (1.015088ms)
|
||||
✔ turnRequest names the sender, class, reply and decision (0.164417ms)
|
||||
✔ turnRequest says a tester's message is a test and never Jason's instruction (0.198752ms)
|
||||
✔ turnRequest shows the message's own sent time, a day old as well as new (0.128126ms)
|
||||
✔ stateBlock names the launch state with its time and event, and the open tasks with the cap (0.192964ms)
|
||||
✔ a message becomes a turn, the answer goes back as a RESULT, SIGTERM releases and exits 0 (151.578237ms)
|
||||
✔ launches revoked and then restored: the turn's block reads allowed and gives the restore time (166.758658ms)
|
||||
✔ a task closed on the tracker is missing from the next turn's open list (167.364299ms)
|
||||
✔ a message read a day after it was sent shows the time it was sent (88.570547ms)
|
||||
✔ a decision the human resolves becomes a turn citing the decision and the answer (140.508184ms)
|
||||
✔ a failed state read fails the turn: no adapter runs, the sender hears why, the message is read (62.730758ms)
|
||||
✔ a SIGTERM before the claim stops the runner with exit 0 and no claim (46.539668ms)
|
||||
✔ typed tools carry the runner's capability; launch goes to the host's launch socket (296.804654ms)
|
||||
✔ end_run and change_organization reach the broker with the tool's arguments, and refusals keep their codes (279.260105ms)
|
||||
✔ a RESULT gets no automatic reply; failed turns reply with the reason (1189.586104ms)
|
||||
✔ SIGTERM during a turn kills the turn's process group and still exits 0 (95.266746ms)
|
||||
✔ founder credentials stop before the claim (20) (100.345611ms)
|
||||
✔ a refused claim exits 21; an ended run's capability exits 22 (103.316014ms)
|
||||
✔ the launch ending under a running session exits 22 (110.120185ms)
|
||||
✔ a broker that stays unreachable exits 23 after brokerRetries polls (206.614297ms)
|
||||
✔ a broker that is down at the claim exits 23, not 21 (58.453515ms)
|
||||
✔ no capability, or a malformed one, on stdin exits 2 (225.334013ms)
|
||||
✔ a missing or malformed policy exits 2 before the claim (98.220706ms)
|
||||
ℹ tests 23
|
||||
ℹ suites 0
|
||||
ℹ pass 23
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 10782.589473
|
||||
@@ -0,0 +1 @@
|
||||
0
|
||||
@@ -0,0 +1,24 @@
|
||||
✔ the PM gets its task verbs and the reads, and no launch (5.72791ms)
|
||||
✔ the chief of staff gets launch, send_message, end_run and change_organization, and no task verbs (1.495572ms)
|
||||
✔ end_run sends role and reason, no decision; change_organization sends revision and the organization keys (1.859719ms)
|
||||
✔ the organization keys change_organization takes are the broker's ORGANIZATION_KEYS (0.102406ms)
|
||||
✔ a role without role.end or organization.change gets neither tool, and each tool follows its own grant (6.185514ms)
|
||||
✔ the assistant gets send_message and the reads, no launch (1.289678ms)
|
||||
✔ list_requirements reads the requirement ids, for a task.create holder with a tracker (1.812787ms)
|
||||
✔ a coder gets no launch, no resolve_decision, and no task tools without a tracker (0.797105ms)
|
||||
✔ a coder with a tracker gets its own task tools and no task_reassign (0.764992ms)
|
||||
✔ launch only when the business's launch block names the instance as launcher (1.409117ms)
|
||||
✔ an action outside the instance's authority has no tool (0.864938ms)
|
||||
✔ the review loop: push_working and request_review for the coder, fetch_review and review_verdict for the reviewer, none for the PM (3.201676ms)
|
||||
✔ callTool: one JSON line out, the result back, a refusal rejects (7.97645ms)
|
||||
✔ list_tasks takes the broker's filters and pages; get_task takes a task_ref (1.936364ms)
|
||||
✔ callTool sends list_tasks done false unless the session names done; other tools as given (1.997791ms)
|
||||
✔ replyText: compact JSON up to the cap, an error naming the size and the cap over it (0.504972ms)
|
||||
ℹ tests 16
|
||||
ℹ suites 0
|
||||
ℹ pass 16
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 113.411797
|
||||
@@ -0,0 +1 @@
|
||||
0
|
||||
@@ -0,0 +1,257 @@
|
||||
✖ the PM gets its task verbs and the reads, and no launch (6.169621ms)
|
||||
✔ the chief of staff gets launch, send_message, end_run and change_organization, and no task verbs (1.660862ms)
|
||||
✔ end_run sends role and reason, no decision; change_organization sends revision and the organization keys (1.689635ms)
|
||||
✔ the organization keys change_organization takes are the broker's ORGANIZATION_KEYS (0.093845ms)
|
||||
✖ a role without role.end or organization.change gets neither tool, and each tool follows its own grant (1.243914ms)
|
||||
✖ the assistant gets send_message and the reads, no launch (1.321245ms)
|
||||
✔ list_requirements reads the requirement ids, for a task.create holder with a tracker (2.072423ms)
|
||||
✖ a coder gets no launch, no resolve_decision, and no task tools without a tracker (1.097724ms)
|
||||
✖ a coder with a tracker gets its own task tools and no task_reassign (1.321043ms)
|
||||
✔ launch only when the business's launch block names the instance as launcher (1.675095ms)
|
||||
✖ an action outside the instance's authority has no tool (0.93282ms)
|
||||
✖ the review loop: push_working and request_review for the coder, fetch_review and review_verdict for the reviewer, none for the PM (0.981144ms)
|
||||
✔ callTool: one JSON line out, the result back, a refusal rejects (8.341746ms)
|
||||
✔ list_tasks takes the broker's filters and pages; get_task takes a task_ref (1.918908ms)
|
||||
✔ callTool sends list_tasks done false unless the session names done; other tools as given (1.849544ms)
|
||||
✔ replyText: compact JSON up to the cap, an error naming the size and the cap over it (0.620191ms)
|
||||
ℹ tests 16
|
||||
ℹ suites 0
|
||||
ℹ pass 9
|
||||
ℹ fail 7
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 99.819535
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/harness/tests/tools.test.mjs:9:1
|
||||
✖ the PM gets its task verbs and the reads, and no launch (6.169621ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
... Skipped lines
|
||||
|
||||
[
|
||||
'send_message',
|
||||
'task_create',
|
||||
'task_assign',
|
||||
'task_reassign',
|
||||
...
|
||||
'task_close',
|
||||
+ 'end_run',
|
||||
'raise_decision',
|
||||
'resolve_decision',
|
||||
'list_agents',
|
||||
'inbox',
|
||||
'trail',
|
||||
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/researcher/q132/packages/harness/tests/tools.test.mjs:12:10)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.start (node:internal/test_runner/test:1262:17)
|
||||
at startSubtestAfterBootstrap (node:internal/test_runner/harness:387:17) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: [
|
||||
'send_message', 'task_create',
|
||||
'task_assign', 'task_reassign',
|
||||
'task_schedule', 'task_priority_change',
|
||||
'task_scope_change', 'task_update_assigned',
|
||||
'task_close', 'end_run',
|
||||
'raise_decision', 'resolve_decision',
|
||||
'list_agents', 'inbox',
|
||||
'trail', 'list_tasks',
|
||||
'get_task', 'list_requirements'
|
||||
],
|
||||
expected: [
|
||||
'send_message', 'task_create',
|
||||
'task_assign', 'task_reassign',
|
||||
'task_schedule', 'task_priority_change',
|
||||
'task_scope_change', 'task_update_assigned',
|
||||
'task_close', 'raise_decision',
|
||||
'resolve_decision', 'list_agents',
|
||||
'inbox', 'trail',
|
||||
'list_tasks', 'get_task',
|
||||
'list_requirements'
|
||||
],
|
||||
operator: 'deepStrictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
|
||||
test at packages/harness/tests/tools.test.mjs:69:1
|
||||
✖ a role without role.end or organization.change gets neither tool, and each tool follows its own grant (1.243914ms)
|
||||
AssertionError [ERR_ASSERTION]: pm
|
||||
+ actual - expected
|
||||
|
||||
+ [
|
||||
+ 'end_run'
|
||||
+ ]
|
||||
- []
|
||||
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/researcher/q132/packages/harness/tests/tools.test.mjs:72:12)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: false,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: [ 'end_run' ],
|
||||
expected: [],
|
||||
operator: 'deepStrictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
|
||||
test at packages/harness/tests/tools.test.mjs:82:1
|
||||
✖ the assistant gets send_message and the reads, no launch (1.321245ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
|
||||
[
|
||||
'send_message',
|
||||
+ 'end_run',
|
||||
'raise_decision',
|
||||
'list_agents',
|
||||
'inbox',
|
||||
'trail',
|
||||
'list_tasks',
|
||||
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/researcher/q132/packages/harness/tests/tools.test.mjs:85:10)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: [ 'send_message', 'end_run', 'raise_decision', 'list_agents', 'inbox', 'trail', 'list_tasks', 'get_task' ],
|
||||
expected: [ 'send_message', 'raise_decision', 'list_agents', 'inbox', 'trail', 'list_tasks', 'get_task' ],
|
||||
operator: 'deepStrictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
|
||||
test at packages/harness/tests/tools.test.mjs:116:1
|
||||
✖ a coder gets no launch, no resolve_decision, and no task tools without a tracker (1.097724ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
|
||||
[
|
||||
'send_message',
|
||||
'request_review',
|
||||
+ 'end_run',
|
||||
'raise_decision',
|
||||
'list_agents',
|
||||
'inbox',
|
||||
'trail'
|
||||
]
|
||||
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/researcher/q132/packages/harness/tests/tools.test.mjs:119:10)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: [ 'send_message', 'request_review', 'end_run', 'raise_decision', 'list_agents', 'inbox', 'trail' ],
|
||||
expected: [ 'send_message', 'request_review', 'raise_decision', 'list_agents', 'inbox', 'trail' ],
|
||||
operator: 'deepStrictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
|
||||
test at packages/harness/tests/tools.test.mjs:125:1
|
||||
✖ a coder with a tracker gets its own task tools and no task_reassign (1.321043ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
|
||||
[
|
||||
'send_message',
|
||||
'task_scope_change',
|
||||
'task_update_assigned',
|
||||
'request_review',
|
||||
+ 'end_run',
|
||||
'raise_decision',
|
||||
'list_agents',
|
||||
'inbox',
|
||||
'trail',
|
||||
'list_tasks',
|
||||
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/researcher/q132/packages/harness/tests/tools.test.mjs:127:10)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: [ 'send_message', 'task_scope_change', 'task_update_assigned', 'request_review', 'end_run', 'raise_decision', 'list_agents', 'inbox', 'trail', 'list_tasks', 'get_task' ],
|
||||
expected: [ 'send_message', 'task_scope_change', 'task_update_assigned', 'request_review', 'raise_decision', 'list_agents', 'inbox', 'trail', 'list_tasks', 'get_task' ],
|
||||
operator: 'deepStrictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
|
||||
test at packages/harness/tests/tools.test.mjs:140:1
|
||||
✖ an action outside the instance's authority has no tool (0.93282ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
|
||||
[
|
||||
'request_review',
|
||||
+ 'end_run',
|
||||
'raise_decision',
|
||||
'list_agents',
|
||||
'inbox',
|
||||
'trail',
|
||||
'list_tasks',
|
||||
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/researcher/q132/packages/harness/tests/tools.test.mjs:142:10)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: [ 'request_review', 'end_run', 'raise_decision', 'list_agents', 'inbox', 'trail', 'list_tasks', 'get_task' ],
|
||||
expected: [ 'request_review', 'raise_decision', 'list_agents', 'inbox', 'trail', 'list_tasks', 'get_task' ],
|
||||
operator: 'deepStrictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
|
||||
test at packages/harness/tests/tools.test.mjs:146:1
|
||||
✖ the review loop: push_working and request_review for the coder, fetch_review and review_verdict for the reviewer, none for the PM (0.981144ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
|
||||
[
|
||||
'send_message',
|
||||
'task_scope_change',
|
||||
'task_update_assigned',
|
||||
'push_working',
|
||||
'request_review',
|
||||
+ 'end_run',
|
||||
'raise_decision',
|
||||
'list_agents',
|
||||
'inbox',
|
||||
'trail',
|
||||
'list_tasks',
|
||||
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/researcher/q132/packages/harness/tests/tools.test.mjs:149:10)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: [ 'send_message', 'task_scope_change', 'task_update_assigned', 'push_working', 'request_review', 'end_run', 'raise_decision', 'list_agents', 'inbox', 'trail', 'list_tasks', 'get_task' ],
|
||||
expected: [ 'send_message', 'task_scope_change', 'task_update_assigned', 'push_working', 'request_review', 'raise_decision', 'list_agents', 'inbox', 'trail', 'list_tasks', 'get_task' ],
|
||||
operator: 'deepStrictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
--- /mnt/storage/scratch/researcher/q132-out/.bak.LfOY8j/packages/harness/src/tools.mjs 2026-10-15 13:00:17.085705946 -0500
|
||||
+++ packages/harness/src/tools.mjs 2026-10-15 13:00:17.105237088 -0500
|
||||
@@ -137,7 +137,7 @@
|
||||
}
|
||||
// Row 132 (#1628, REQ-ROLE-2, REQ-COS-1, REQ-LIMIT-1): the chief of staff's two grants from row 123.
|
||||
// end_run sends `reason` and never a decision; the broker refuses the caller's own run and the assistant's.
|
||||
- if (held.has("role.end")) {
|
||||
+ if (true) {
|
||||
add("end_run", "role.revoke", "role.end", "End another role's run. A reason is required, 1 to 500 characters, and goes into the log. You can't end your own run or the assistant's; the broker refuses with role-end-refused.", obj({
|
||||
role: str("Role instance whose run to end"),
|
||||
reason: str("Why the run ends, 1 to 500 characters", { minLength: 1, maxLength: 500 }),
|
||||
@@ -0,0 +1 @@
|
||||
1
|
||||
@@ -0,0 +1,52 @@
|
||||
✔ the PM gets its task verbs and the reads, and no launch (5.346743ms)
|
||||
✔ the chief of staff gets launch, send_message, end_run and change_organization, and no task verbs (1.384497ms)
|
||||
✖ end_run sends role and reason, no decision; change_organization sends revision and the organization keys (2.353459ms)
|
||||
✔ the organization keys change_organization takes are the broker's ORGANIZATION_KEYS (0.090586ms)
|
||||
✔ a role without role.end or organization.change gets neither tool, and each tool follows its own grant (5.941132ms)
|
||||
✔ the assistant gets send_message and the reads, no launch (1.062045ms)
|
||||
✔ list_requirements reads the requirement ids, for a task.create holder with a tracker (1.731803ms)
|
||||
✔ a coder gets no launch, no resolve_decision, and no task tools without a tracker (0.77093ms)
|
||||
✔ a coder with a tracker gets its own task tools and no task_reassign (0.724216ms)
|
||||
✔ launch only when the business's launch block names the instance as launcher (1.400979ms)
|
||||
✔ an action outside the instance's authority has no tool (0.8303ms)
|
||||
✔ the review loop: push_working and request_review for the coder, fetch_review and review_verdict for the reviewer, none for the PM (3.147051ms)
|
||||
✔ callTool: one JSON line out, the result back, a refusal rejects (7.820786ms)
|
||||
✔ list_tasks takes the broker's filters and pages; get_task takes a task_ref (1.558725ms)
|
||||
✔ callTool sends list_tasks done false unless the session names done; other tools as given (1.738179ms)
|
||||
✔ replyText: compact JSON up to the cap, an error naming the size and the cap over it (0.42861ms)
|
||||
ℹ tests 16
|
||||
ℹ suites 0
|
||||
ℹ pass 15
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 99.853791
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/harness/tests/tools.test.mjs:46:1
|
||||
✖ end_run sends role and reason, no decision; change_organization sends revision and the organization keys (2.353459ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
|
||||
[
|
||||
'role',
|
||||
'reason',
|
||||
+ 'decision'
|
||||
]
|
||||
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/researcher/q132/packages/harness/tests/tools.test.mjs:50:10)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: [ 'role', 'reason', 'decision' ],
|
||||
expected: [ 'role', 'reason' ],
|
||||
operator: 'deepStrictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
--- /mnt/storage/scratch/researcher/q132-out/.bak.LfOY8j/packages/harness/src/tools.mjs 2026-10-15 13:00:17.085705946 -0500
|
||||
+++ packages/harness/src/tools.mjs 2026-10-15 13:00:40.778412890 -0500
|
||||
@@ -141,6 +141,7 @@
|
||||
add("end_run", "role.revoke", "role.end", "End another role's run. A reason is required, 1 to 500 characters, and goes into the log. You can't end your own run or the assistant's; the broker refuses with role-end-refused.", obj({
|
||||
role: str("Role instance whose run to end"),
|
||||
reason: str("Why the run ends, 1 to 500 characters", { minLength: 1, maxLength: 500 }),
|
||||
+ decision: COMMON.decision,
|
||||
}, ["role", "reason"]));
|
||||
}
|
||||
if (held.has("organization.change")) {
|
||||
@@ -0,0 +1 @@
|
||||
1
|
||||
@@ -0,0 +1,52 @@
|
||||
✔ the PM gets its task verbs and the reads, and no launch (5.497557ms)
|
||||
✔ the chief of staff gets launch, send_message, end_run and change_organization, and no task verbs (1.650858ms)
|
||||
✖ end_run sends role and reason, no decision; change_organization sends revision and the organization keys (2.435186ms)
|
||||
✔ the organization keys change_organization takes are the broker's ORGANIZATION_KEYS (0.093819ms)
|
||||
✔ a role without role.end or organization.change gets neither tool, and each tool follows its own grant (5.940972ms)
|
||||
✔ the assistant gets send_message and the reads, no launch (1.069242ms)
|
||||
✔ list_requirements reads the requirement ids, for a task.create holder with a tracker (1.695656ms)
|
||||
✔ a coder gets no launch, no resolve_decision, and no task tools without a tracker (0.773889ms)
|
||||
✔ a coder with a tracker gets its own task tools and no task_reassign (0.695046ms)
|
||||
✔ launch only when the business's launch block names the instance as launcher (1.432286ms)
|
||||
✔ an action outside the instance's authority has no tool (0.813116ms)
|
||||
✔ the review loop: push_working and request_review for the coder, fetch_review and review_verdict for the reviewer, none for the PM (3.210531ms)
|
||||
✔ callTool: one JSON line out, the result back, a refusal rejects (8.164674ms)
|
||||
✔ list_tasks takes the broker's filters and pages; get_task takes a task_ref (1.706628ms)
|
||||
✔ callTool sends list_tasks done false unless the session names done; other tools as given (1.877664ms)
|
||||
✔ replyText: compact JSON up to the cap, an error naming the size and the cap over it (0.448855ms)
|
||||
ℹ tests 16
|
||||
ℹ suites 0
|
||||
ℹ pass 15
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 101.145366
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/harness/tests/tools.test.mjs:46:1
|
||||
✖ end_run sends role and reason, no decision; change_organization sends revision and the organization keys (2.435186ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
|
||||
[
|
||||
1,
|
||||
+ 50000
|
||||
- 500
|
||||
]
|
||||
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/researcher/q132/packages/harness/tests/tools.test.mjs:52:10)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: [ 1, 50000 ],
|
||||
expected: [ 1, 500 ],
|
||||
operator: 'deepStrictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
--- /mnt/storage/scratch/researcher/q132-out/.bak.LfOY8j/packages/harness/src/tools.mjs 2026-10-15 13:00:17.085705946 -0500
|
||||
+++ packages/harness/src/tools.mjs 2026-10-15 13:00:40.932413689 -0500
|
||||
@@ -140,7 +140,7 @@
|
||||
if (held.has("role.end")) {
|
||||
add("end_run", "role.revoke", "role.end", "End another role's run. A reason is required, 1 to 500 characters, and goes into the log. You can't end your own run or the assistant's; the broker refuses with role-end-refused.", obj({
|
||||
role: str("Role instance whose run to end"),
|
||||
- reason: str("Why the run ends, 1 to 500 characters", { minLength: 1, maxLength: 500 }),
|
||||
+ reason: str("Why the run ends, 1 to 500 characters", { minLength: 1, maxLength: 50000 }),
|
||||
}, ["role", "reason"]));
|
||||
}
|
||||
if (held.has("organization.change")) {
|
||||
@@ -0,0 +1 @@
|
||||
1
|
||||
@@ -0,0 +1,51 @@
|
||||
✔ the PM gets its task verbs and the reads, and no launch (5.486137ms)
|
||||
✔ the chief of staff gets launch, send_message, end_run and change_organization, and no task verbs (1.496816ms)
|
||||
✖ end_run sends role and reason, no decision; change_organization sends revision and the organization keys (2.327689ms)
|
||||
✔ the organization keys change_organization takes are the broker's ORGANIZATION_KEYS (0.101948ms)
|
||||
✔ a role without role.end or organization.change gets neither tool, and each tool follows its own grant (6.181514ms)
|
||||
✔ the assistant gets send_message and the reads, no launch (1.336104ms)
|
||||
✔ list_requirements reads the requirement ids, for a task.create holder with a tracker (1.801518ms)
|
||||
✔ a coder gets no launch, no resolve_decision, and no task tools without a tracker (0.788435ms)
|
||||
✔ a coder with a tracker gets its own task tools and no task_reassign (0.738255ms)
|
||||
✔ launch only when the business's launch block names the instance as launcher (1.437361ms)
|
||||
✔ an action outside the instance's authority has no tool (0.911941ms)
|
||||
✔ the review loop: push_working and request_review for the coder, fetch_review and review_verdict for the reviewer, none for the PM (3.206026ms)
|
||||
✔ callTool: one JSON line out, the result back, a refusal rejects (8.270633ms)
|
||||
✔ list_tasks takes the broker's filters and pages; get_task takes a task_ref (1.885376ms)
|
||||
✔ callTool sends list_tasks done false unless the session names done; other tools as given (1.792571ms)
|
||||
✔ replyText: compact JSON up to the cap, an error naming the size and the cap over it (0.466788ms)
|
||||
ℹ tests 16
|
||||
ℹ suites 0
|
||||
ℹ pass 15
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 104.924205
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/harness/tests/tools.test.mjs:46:1
|
||||
✖ end_run sends role and reason, no decision; change_organization sends revision and the organization keys (2.327689ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
|
||||
+ []
|
||||
- [
|
||||
- 'revision'
|
||||
- ]
|
||||
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/researcher/q132/packages/harness/tests/tools.test.mjs:58:10)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: [],
|
||||
expected: [ 'revision' ],
|
||||
operator: 'deepStrictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
--- /mnt/storage/scratch/researcher/q132-out/.bak.LfOY8j/packages/harness/src/tools.mjs 2026-10-15 13:00:17.085705946 -0500
|
||||
+++ packages/harness/src/tools.mjs 2026-10-15 13:00:41.085414485 -0500
|
||||
@@ -149,7 +149,7 @@
|
||||
limits: { type: "object", description: "The launch limits, replacing the file's launch limits" },
|
||||
models: { type: "object", description: "The model table, replacing the file's model table" },
|
||||
instances: { type: "object", description: "Role instance to model key, for the instances that change", additionalProperties: { type: "string" } },
|
||||
- }, ["revision"]));
|
||||
+ }, []));
|
||||
}
|
||||
add("raise_decision", "decision.raise", null, "Ask for a decision before a gated or cross-role action, or when you need a choice made. The answer arrives as a message.", obj({
|
||||
action: str("The action the decision is about", { enum: [...ACTIONS] }),
|
||||
@@ -0,0 +1 @@
|
||||
1
|
||||
@@ -0,0 +1,49 @@
|
||||
✔ the PM gets its task verbs and the reads, and no launch (5.403959ms)
|
||||
✔ the chief of staff gets launch, send_message, end_run and change_organization, and no task verbs (1.421009ms)
|
||||
✖ end_run sends role and reason, no decision; change_organization sends revision and the organization keys (2.206392ms)
|
||||
✔ the organization keys change_organization takes are the broker's ORGANIZATION_KEYS (0.105692ms)
|
||||
✔ a role without role.end or organization.change gets neither tool, and each tool follows its own grant (5.45542ms)
|
||||
✔ the assistant gets send_message and the reads, no launch (1.019192ms)
|
||||
✔ list_requirements reads the requirement ids, for a task.create holder with a tracker (1.637192ms)
|
||||
✔ a coder gets no launch, no resolve_decision, and no task tools without a tracker (0.75592ms)
|
||||
✔ a coder with a tracker gets its own task tools and no task_reassign (0.673672ms)
|
||||
✔ launch only when the business's launch block names the instance as launcher (1.37547ms)
|
||||
✔ an action outside the instance's authority has no tool (0.89573ms)
|
||||
✔ the review loop: push_working and request_review for the coder, fetch_review and review_verdict for the reviewer, none for the PM (3.112514ms)
|
||||
✔ callTool: one JSON line out, the result back, a refusal rejects (8.287076ms)
|
||||
✔ list_tasks takes the broker's filters and pages; get_task takes a task_ref (1.979073ms)
|
||||
✔ callTool sends list_tasks done false unless the session names done; other tools as given (1.917923ms)
|
||||
✔ replyText: compact JSON up to the cap, an error naming the size and the cap over it (0.519438ms)
|
||||
ℹ tests 16
|
||||
ℹ suites 0
|
||||
ℹ pass 15
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 100.787969
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/harness/tests/tools.test.mjs:46:1
|
||||
✖ end_run sends role and reason, no decision; change_organization sends revision and the organization keys (2.206392ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
|
||||
+ actual - expected
|
||||
|
||||
+ '^.*$'
|
||||
- '^[a-f0-9]{64}$'
|
||||
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/researcher/q132/packages/harness/tests/tools.test.mjs:60:10)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: '^.*$',
|
||||
expected: '^[a-f0-9]{64}$',
|
||||
operator: 'strictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
--- /mnt/storage/scratch/researcher/q132-out/.bak.LfOY8j/packages/harness/src/tools.mjs 2026-10-15 13:00:17.085705946 -0500
|
||||
+++ packages/harness/src/tools.mjs 2026-10-15 13:00:41.246745690 -0500
|
||||
@@ -145,7 +145,7 @@
|
||||
}
|
||||
if (held.has("organization.change")) {
|
||||
add("change_organization", "organization.set", "organization.change", "Change the organization file: the launch limits, the model table, and the model each instance runs. revision is the file's current revision; the broker refuses a stale one with revision-conflict. Send only the keys you change; each replaces what the file holds for it.", obj({
|
||||
- revision: str("The organization file's current revision", { pattern: "^[a-f0-9]{64}$" }),
|
||||
+ revision: str("The organization file's current revision", { pattern: "^.*$" }),
|
||||
limits: { type: "object", description: "The launch limits, replacing the file's launch limits" },
|
||||
models: { type: "object", description: "The model table, replacing the file's model table" },
|
||||
instances: { type: "object", description: "Role instance to model key, for the instances that change", additionalProperties: { type: "string" } },
|
||||
@@ -0,0 +1 @@
|
||||
1
|
||||
@@ -0,0 +1,47 @@
|
||||
✔ the PM gets its task verbs and the reads, and no launch (5.720349ms)
|
||||
✔ the chief of staff gets launch, send_message, end_run and change_organization, and no task verbs (1.473801ms)
|
||||
✖ end_run sends role and reason, no decision; change_organization sends revision and the organization keys (2.141755ms)
|
||||
✔ the organization keys change_organization takes are the broker's ORGANIZATION_KEYS (0.096185ms)
|
||||
✔ a role without role.end or organization.change gets neither tool, and each tool follows its own grant (5.768664ms)
|
||||
✔ the assistant gets send_message and the reads, no launch (1.043752ms)
|
||||
✔ list_requirements reads the requirement ids, for a task.create holder with a tracker (1.656561ms)
|
||||
✔ a coder gets no launch, no resolve_decision, and no task tools without a tracker (0.783234ms)
|
||||
✔ a coder with a tracker gets its own task tools and no task_reassign (0.752787ms)
|
||||
✔ launch only when the business's launch block names the instance as launcher (1.396638ms)
|
||||
✔ an action outside the instance's authority has no tool (0.814556ms)
|
||||
✔ the review loop: push_working and request_review for the coder, fetch_review and review_verdict for the reviewer, none for the PM (3.142043ms)
|
||||
✔ callTool: one JSON line out, the result back, a refusal rejects (8.89515ms)
|
||||
✔ list_tasks takes the broker's filters and pages; get_task takes a task_ref (1.798355ms)
|
||||
✔ callTool sends list_tasks done false unless the session names done; other tools as given (1.817438ms)
|
||||
✔ replyText: compact JSON up to the cap, an error naming the size and the cap over it (0.461083ms)
|
||||
ℹ tests 16
|
||||
ℹ suites 0
|
||||
ℹ pass 15
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 102.216175
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/harness/tests/tools.test.mjs:46:1
|
||||
✖ end_run sends role and reason, no decision; change_organization sends revision and the organization keys (2.141755ms)
|
||||
AssertionError [ERR_ASSERTION]: The input did not match the regular expression /can't end your own run or the assistant's/. Input:
|
||||
|
||||
"End another role's run. A reason is required, 1 to 500 characters, and goes into the log. The broker refuses some runs."
|
||||
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/researcher/q132/packages/harness/tests/tools.test.mjs:54:10)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: "End another role's run. A reason is required, 1 to 500 characters, and goes into the log. The broker refuses some runs.",
|
||||
expected: /can't end your own run or the assistant's/,
|
||||
operator: 'match',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
--- /mnt/storage/scratch/researcher/q132-out/.bak.LfOY8j/packages/harness/src/tools.mjs 2026-10-15 13:00:17.085705946 -0500
|
||||
+++ packages/harness/src/tools.mjs 2026-10-15 13:00:41.399416120 -0500
|
||||
@@ -138,7 +138,7 @@
|
||||
// Row 132 (#1628, REQ-ROLE-2, REQ-COS-1, REQ-LIMIT-1): the chief of staff's two grants from row 123.
|
||||
// end_run sends `reason` and never a decision; the broker refuses the caller's own run and the assistant's.
|
||||
if (held.has("role.end")) {
|
||||
- add("end_run", "role.revoke", "role.end", "End another role's run. A reason is required, 1 to 500 characters, and goes into the log. You can't end your own run or the assistant's; the broker refuses with role-end-refused.", obj({
|
||||
+ add("end_run", "role.revoke", "role.end", "End another role's run. A reason is required, 1 to 500 characters, and goes into the log. The broker refuses some runs.", obj({
|
||||
role: str("Role instance whose run to end"),
|
||||
reason: str("Why the run ends, 1 to 500 characters", { minLength: 1, maxLength: 500 }),
|
||||
}, ["role", "reason"]));
|
||||
@@ -0,0 +1 @@
|
||||
1
|
||||
@@ -0,0 +1,80 @@
|
||||
✔ the PM gets its task verbs and the reads, and no launch (5.636833ms)
|
||||
✔ the chief of staff gets launch, send_message, end_run and change_organization, and no task verbs (1.482344ms)
|
||||
✖ end_run sends role and reason, no decision; change_organization sends revision and the organization keys (2.503748ms)
|
||||
✖ the organization keys change_organization takes are the broker's ORGANIZATION_KEYS (0.217187ms)
|
||||
✔ a role without role.end or organization.change gets neither tool, and each tool follows its own grant (5.854267ms)
|
||||
✔ the assistant gets send_message and the reads, no launch (1.081591ms)
|
||||
✔ list_requirements reads the requirement ids, for a task.create holder with a tracker (1.674946ms)
|
||||
✔ a coder gets no launch, no resolve_decision, and no task tools without a tracker (0.762482ms)
|
||||
✔ a coder with a tracker gets its own task tools and no task_reassign (0.736724ms)
|
||||
✔ launch only when the business's launch block names the instance as launcher (1.433967ms)
|
||||
✔ an action outside the instance's authority has no tool (0.849321ms)
|
||||
✔ the review loop: push_working and request_review for the coder, fetch_review and review_verdict for the reviewer, none for the PM (3.236006ms)
|
||||
✔ callTool: one JSON line out, the result back, a refusal rejects (9.713433ms)
|
||||
✔ list_tasks takes the broker's filters and pages; get_task takes a task_ref (1.821453ms)
|
||||
✔ callTool sends list_tasks done false unless the session names done; other tools as given (1.802977ms)
|
||||
✔ replyText: compact JSON up to the cap, an error naming the size and the cap over it (0.484564ms)
|
||||
ℹ tests 16
|
||||
ℹ suites 0
|
||||
ℹ pass 14
|
||||
ℹ fail 2
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 104.078883
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/harness/tests/tools.test.mjs:46:1
|
||||
✖ end_run sends role and reason, no decision; change_organization sends revision and the organization keys (2.503748ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
|
||||
[
|
||||
'revision',
|
||||
'limits',
|
||||
+ 'models',
|
||||
'instances'
|
||||
]
|
||||
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/researcher/q132/packages/harness/tests/tools.test.mjs:57:10)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: [ 'revision', 'limits', 'models', 'instances' ],
|
||||
expected: [ 'revision', 'limits', 'instances' ],
|
||||
operator: 'deepStrictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
|
||||
test at packages/harness/tests/tools.test.mjs:64:1
|
||||
✖ the organization keys change_organization takes are the broker's ORGANIZATION_KEYS (0.217187ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
|
||||
[
|
||||
'revision',
|
||||
'limits',
|
||||
- 'models',
|
||||
'instances'
|
||||
]
|
||||
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/researcher/q132/packages/harness/tests/tools.test.mjs:65:10)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: [ 'revision', 'limits', 'instances' ],
|
||||
expected: [ 'revision', 'limits', 'models', 'instances' ],
|
||||
operator: 'deepStrictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
--- /mnt/storage/scratch/researcher/q132-out/.bak.LfOY8j/packages/harness/src/tools.mjs 2026-10-15 13:00:17.085705946 -0500
|
||||
+++ packages/harness/src/tools.mjs 2026-10-15 13:00:41.557416943 -0500
|
||||
@@ -24,7 +24,7 @@
|
||||
const TASK_PAGE_MAX = 200;
|
||||
// The keys the broker's `organization.set` accepts (ORGANIZATION_KEYS in packages/bus/src/broker.mjs;
|
||||
// a test holds the two lists equal). Kept here so the session's tool server doesn't load the broker.
|
||||
-export const ORGANIZATION_KEYS = Object.freeze(["revision", "limits", "models", "instances"]);
|
||||
+export const ORGANIZATION_KEYS = Object.freeze(["revision", "limits", "instances"]);
|
||||
const COMMON = {
|
||||
task_ref: TASK_REF,
|
||||
decision: str("Id of a resolved decision that approves this call; needed when the action is cross-role or gated for you"),
|
||||
@@ -0,0 +1 @@
|
||||
1
|
||||
@@ -0,0 +1,54 @@
|
||||
✔ the PM gets its task verbs and the reads, and no launch (5.818894ms)
|
||||
✔ the chief of staff gets launch, send_message, end_run and change_organization, and no task verbs (1.696664ms)
|
||||
✔ end_run sends role and reason, no decision; change_organization sends revision and the organization keys (1.88443ms)
|
||||
✖ the organization keys change_organization takes are the broker's ORGANIZATION_KEYS (0.958312ms)
|
||||
✔ a role without role.end or organization.change gets neither tool, and each tool follows its own grant (5.97614ms)
|
||||
✔ the assistant gets send_message and the reads, no launch (1.084917ms)
|
||||
✔ list_requirements reads the requirement ids, for a task.create holder with a tracker (1.701181ms)
|
||||
✔ a coder gets no launch, no resolve_decision, and no task tools without a tracker (0.771619ms)
|
||||
✔ a coder with a tracker gets its own task tools and no task_reassign (0.721223ms)
|
||||
✔ launch only when the business's launch block names the instance as launcher (1.418636ms)
|
||||
✔ an action outside the instance's authority has no tool (0.874042ms)
|
||||
✔ the review loop: push_working and request_review for the coder, fetch_review and review_verdict for the reviewer, none for the PM (5.075698ms)
|
||||
✔ callTool: one JSON line out, the result back, a refusal rejects (8.480643ms)
|
||||
✔ list_tasks takes the broker's filters and pages; get_task takes a task_ref (1.885008ms)
|
||||
✔ callTool sends list_tasks done false unless the session names done; other tools as given (1.888818ms)
|
||||
✔ replyText: compact JSON up to the cap, an error naming the size and the cap over it (0.490162ms)
|
||||
ℹ tests 16
|
||||
ℹ suites 0
|
||||
ℹ pass 15
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 108.209587
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/harness/tests/tools.test.mjs:64:1
|
||||
✖ the organization keys change_organization takes are the broker's ORGANIZATION_KEYS (0.958312ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
|
||||
[
|
||||
'revision',
|
||||
'limits',
|
||||
'models',
|
||||
'instances',
|
||||
- 'plugins'
|
||||
]
|
||||
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/researcher/q132/packages/harness/tests/tools.test.mjs:65:10)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: [ 'revision', 'limits', 'models', 'instances' ],
|
||||
expected: [ 'revision', 'limits', 'models', 'instances', 'plugins' ],
|
||||
operator: 'deepStrictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
--- /mnt/storage/scratch/researcher/q132-out/.bak.LfOY8j/packages/bus/src/broker.mjs 2026-10-15 13:00:41.699487107 -0500
|
||||
+++ packages/bus/src/broker.mjs 2026-10-15 13:00:41.716417771 -0500
|
||||
@@ -96,7 +96,7 @@
|
||||
// A git commit id, SHA-1 or SHA-256.
|
||||
const oid = (x) => typeof x === 'string' && /^[0-9a-f]{40}([0-9a-f]{24})?$/.test(x);
|
||||
// Row 123 (#1617): the one list of organization-file keys limits.set and organization.set accept.
|
||||
-export const ORGANIZATION_KEYS = ['revision', 'limits', 'models', 'instances'];
|
||||
+export const ORGANIZATION_KEYS = ['revision', 'limits', 'models', 'instances', 'plugins'];
|
||||
// Row 123 (#1617): role.end never reaches the assistant (the user's seat) or the caller's own run.
|
||||
const END_PROTECTED = ['assistant'];
|
||||
const VERDICTS = ['approve', 'changes'];
|
||||
@@ -0,0 +1 @@
|
||||
1
|
||||
@@ -0,0 +1,41 @@
|
||||
✔ sessionModel: agent vars win, then the system's execution settings (12.248169ms)
|
||||
✔ a pi bundle: prompt, policy, tools and manifest, 0600 in a 0700 directory (6.090715ms)
|
||||
✔ a chief-of-staff bundle lists launch among the bus tools and the manifest's typed tools (4.132497ms)
|
||||
✔ a chief-of-staff bundle lists end_run and change_organization as typed and nothing untyped, for either harness (7.498618ms)
|
||||
✖ the stop line names end_run for a role.end holder, and every other role keeps today's text (3.497316ms)
|
||||
✔ a claude-code bundle adds the wrapped gate hook and the MCP config (2.051146ms)
|
||||
✔ the prompt's built-in tools line is the harness's own names, as the manifest lists them (6.713088ms)
|
||||
✔ the prompt names the project clones in the workspace, and none when there are none (8.009714ms)
|
||||
✔ the prompt explains the review loop to a role with push_working, and reviews to one with fetch_review (6.83546ms)
|
||||
✔ a bundle is written once: an existing file refuses (1.367587ms)
|
||||
✔ a path with a single quote can't go into the hook command (1.419987ms)
|
||||
ℹ tests 11
|
||||
ℹ suites 0
|
||||
ℹ pass 10
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 142.089923
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/harness/tests/bundle.test.mjs:98:1
|
||||
✖ the stop line names end_run for a role.end holder, and every other role keeps today's text (3.497316ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected "actual" to be strictly unequal to:
|
||||
|
||||
'- Only the human stops a run, with `mosaic stop`. If you think a run should stop, raise a role.revoke decision with blocking false and the role instance as target, naming the run and saying why.'
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/researcher/q132/packages/harness/tests/bundle.test.mjs:103:10)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: '- Only the human stops a run, with `mosaic stop`. If you think a run should stop, raise a role.revoke decision with blocking false and the role instance as target, naming the run and saying why.',
|
||||
expected: '- Only the human stops a run, with `mosaic stop`. If you think a run should stop, raise a role.revoke decision with blocking false and the role instance as target, naming the run and saying why.',
|
||||
operator: 'notStrictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
--- /mnt/storage/scratch/researcher/q132-out/.bak.LfOY8j/packages/harness/src/bundle.mjs 2026-10-15 13:00:41.862446634 -0500
|
||||
+++ packages/harness/src/bundle.mjs 2026-10-15 13:00:41.882418635 -0500
|
||||
@@ -91,7 +91,7 @@
|
||||
];
|
||||
const named = new Set(tools.map((t) => t.name));
|
||||
// Row 90 (#1584): PM fault 10 (#228 c91). Row 132 (#1628): a role holding role.end has end_run.
|
||||
- lines.push(named.has("end_run")
|
||||
+ lines.push(false
|
||||
? "- You end another role's run with end_run, naming the role instance and a reason of 1 to 500 characters; the reason is required and goes into the log. You can't end your own run or the assistant's. For anything the broker refuses, raise a role.revoke decision with blocking false and the role instance as target, naming the run and saying why; the human decides, and `mosaic stop` is theirs."
|
||||
: "- Only the human stops a run, with `mosaic stop`. If you think a run should stop, raise a role.revoke decision with blocking false and the role instance as target, naming the run and saying why.");
|
||||
// Row 93 (#1587): the review loop, for the roles that have its tools.
|
||||
@@ -0,0 +1 @@
|
||||
1
|
||||
@@ -0,0 +1,80 @@
|
||||
✔ sessionModel: agent vars win, then the system's execution settings (9.006998ms)
|
||||
✖ a pi bundle: prompt, policy, tools and manifest, 0600 in a 0700 directory (4.56725ms)
|
||||
✔ a chief-of-staff bundle lists launch among the bus tools and the manifest's typed tools (2.103484ms)
|
||||
✔ a chief-of-staff bundle lists end_run and change_organization as typed and nothing untyped, for either harness (3.635528ms)
|
||||
✖ the stop line names end_run for a role.end holder, and every other role keeps today's text (4.136339ms)
|
||||
✔ a claude-code bundle adds the wrapped gate hook and the MCP config (1.843843ms)
|
||||
✔ the prompt's built-in tools line is the harness's own names, as the manifest lists them (7.71852ms)
|
||||
✔ the prompt names the project clones in the workspace, and none when there are none (7.995627ms)
|
||||
✔ the prompt explains the review loop to a role with push_working, and reviews to one with fetch_review (7.402599ms)
|
||||
✔ a bundle is written once: an existing file refuses (1.265229ms)
|
||||
✔ a path with a single quote can't go into the hook command (1.218074ms)
|
||||
ℹ tests 11
|
||||
ℹ suites 0
|
||||
ℹ pass 9
|
||||
ℹ fail 2
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 138.02734
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/harness/tests/bundle.test.mjs:37:1
|
||||
✖ a pi bundle: prompt, policy, tools and manifest, 0600 in a 0700 directory (4.56725ms)
|
||||
AssertionError [ERR_ASSERTION]: The input did not match the regular expression /^- Only the human stops a run, with `mosaic stop`\. If you think a run should stop, raise a role\.revoke decision with blocking false/m. Input:
|
||||
|
||||
'# Contract\n' +
|
||||
'\n' +
|
||||
'Do the work.\n' +
|
||||
'\n' +
|
||||
'## This session\n' +
|
||||
'\n' +
|
||||
'- Business: acme. Role instance: pm (definition pm). Run: run-1.\n' +
|
||||
'- Launched by: pm. Harness: pi, model claude-opus-5-5.\n' +
|
||||
'- Workspace: /mnt/storage/scratch/tmp/mosaic-harness-3TSPwG/ws. File tools work inside it only.\n' +
|
||||
'- Built-in tools: read, write, edit, grep, find, ls.\n' +
|
||||
'- Bus tools: send_message, task_create, task_assign, task_reassign, task_schedule, task_priority_change, task_scope_change, task_update_assigned, task_close, raise_decision, list_agents, inbox, trail, list_tasks, get_task, list_requirements. The broker decides every call; a refusal names its reason.\n' +
|
||||
'- Each message to you arrives as one turn. Your final answer goes back to the sender as the reply, so end each turn with the answer itself.\n' +
|
||||
'- You never hold a token. You act on the tracker, the forge and other roles only through the bus tools.\n' +
|
||||
"- You end another role's run with end_run, naming the role instance and a reason of 1 to 500 characters; the reason is required and goes into the log. You can't end your own run or the assistant's. For anything the broker refuses, raise a role.revoke decision with blocking false and the role instance as target, naming the run and saying why; the human decides, and `mosaic stop` is theirs.\n"
|
||||
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/researcher/q132/packages/harness/tests/bundle.test.mjs:48:10)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: "# Contract\n\nDo the work.\n\n## This session\n\n- Business: acme. Role instance: pm (definition pm). Run: run-1.\n- Launched by: pm. Harness: pi, model claude-opus-5-5.\n- Workspace: /mnt/storage/scratch/tmp/mosaic-harness-3TSPwG/ws. File tools work inside it only.\n- Built-in tools: read, write, edit, grep, find, ls.\n- Bus tools: send_message, task_create, task_assign, task_reassign, task_schedule, task_priority_change, task_scope_change, task_update_assigned, task_close, raise_decision, list_agents, inbox, trail, list_tasks, get_task, list_requirements. The broker decides every call; a refusal names its reason.\n- Each message to you arrives as one turn. Your final answer goes back to the sender as the reply, so end each turn with the answer itself.\n- You never hold a token. You act on the tracker, the forge and other roles only through the bus tools.\n- You end another role's run with end_run, naming the role instance and a reason of 1 to 500 characters; the reason is required and goes into the log. You can't end your own run or the assistant's. For anything the broker refuses, raise a role.revoke decision with blocking false and the role instance as target, naming the run and saying why; the human decides, and `mosaic stop` is theirs.\n",
|
||||
expected: /^- Only the human stops a run, with `mosaic stop`\. If you think a run should stop, raise a role\.revoke decision with blocking false/m,
|
||||
operator: 'match',
|
||||
diff: 'simple'
|
||||
}
|
||||
|
||||
test at packages/harness/tests/bundle.test.mjs:98:1
|
||||
✖ the stop line names end_run for a role.end holder, and every other role keeps today's text (4.136339ms)
|
||||
AssertionError [ERR_ASSERTION]: pm
|
||||
+ actual - expected
|
||||
|
||||
[
|
||||
+ "- You end another role's run with end_run, naming the role instance and a reason of 1 to 500 characters; the reason is required and goes into the log. You can't end your own run or the assistant's. For anything the broker refuses, raise a role.revoke decision with blocking false and the role instance as target, naming the run and saying why; the human decides, and `mosaic stop` is theirs."
|
||||
- '- Only the human stops a run, with `mosaic stop`. If you think a run should stop, raise a role.revoke decision with blocking false and the role instance as target, naming the run and saying why.'
|
||||
]
|
||||
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/researcher/q132/packages/harness/tests/bundle.test.mjs:108:50)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: false,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: [ "- You end another role's run with end_run, naming the role instance and a reason of 1 to 500 characters; the reason is required and goes into the log. You can't end your own run or the assistant's. For anything the broker refuses, raise a role.revoke decision with blocking false and the role instance as target, naming the run and saying why; the human decides, and `mosaic stop` is theirs." ],
|
||||
expected: [ '- Only the human stops a run, with `mosaic stop`. If you think a run should stop, raise a role.revoke decision with blocking false and the role instance as target, naming the run and saying why.' ],
|
||||
operator: 'deepStrictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
--- /mnt/storage/scratch/researcher/q132-out/.bak.LfOY8j/packages/harness/src/bundle.mjs 2026-10-15 13:00:41.862446634 -0500
|
||||
+++ packages/harness/src/bundle.mjs 2026-10-15 13:00:42.089419715 -0500
|
||||
@@ -91,7 +91,7 @@
|
||||
];
|
||||
const named = new Set(tools.map((t) => t.name));
|
||||
// Row 90 (#1584): PM fault 10 (#228 c91). Row 132 (#1628): a role holding role.end has end_run.
|
||||
- lines.push(named.has("end_run")
|
||||
+ lines.push(true
|
||||
? "- You end another role's run with end_run, naming the role instance and a reason of 1 to 500 characters; the reason is required and goes into the log. You can't end your own run or the assistant's. For anything the broker refuses, raise a role.revoke decision with blocking false and the role instance as target, naming the run and saying why; the human decides, and `mosaic stop` is theirs."
|
||||
: "- Only the human stops a run, with `mosaic stop`. If you think a run should stop, raise a role.revoke decision with blocking false and the role instance as target, naming the run and saying why.");
|
||||
// Row 93 (#1587): the review loop, for the roles that have its tools.
|
||||
@@ -0,0 +1 @@
|
||||
1
|
||||
@@ -0,0 +1,42 @@
|
||||
✔ sessionModel: agent vars win, then the system's execution settings (7.701223ms)
|
||||
✔ a pi bundle: prompt, policy, tools and manifest, 0600 in a 0700 directory (3.359135ms)
|
||||
✔ a chief-of-staff bundle lists launch among the bus tools and the manifest's typed tools (1.685549ms)
|
||||
✔ a chief-of-staff bundle lists end_run and change_organization as typed and nothing untyped, for either harness (3.094262ms)
|
||||
✖ the stop line names end_run for a role.end holder, and every other role keeps today's text (2.270689ms)
|
||||
✔ a claude-code bundle adds the wrapped gate hook and the MCP config (1.516212ms)
|
||||
✔ the prompt's built-in tools line is the harness's own names, as the manifest lists them (4.949634ms)
|
||||
✔ the prompt names the project clones in the workspace, and none when there are none (3.954795ms)
|
||||
✔ the prompt explains the review loop to a role with push_working, and reviews to one with fetch_review (4.916048ms)
|
||||
✔ a bundle is written once: an existing file refuses (1.005477ms)
|
||||
✔ a path with a single quote can't go into the hook command (1.048306ms)
|
||||
ℹ tests 11
|
||||
ℹ suites 0
|
||||
ℹ pass 10
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 104.755871
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/harness/tests/bundle.test.mjs:98:1
|
||||
✖ the stop line names end_run for a role.end holder, and every other role keeps today's text (2.270689ms)
|
||||
AssertionError [ERR_ASSERTION]: The input did not match the regular expression /^- You end another role's run with end_run, naming the role instance and a reason of 1 to 500 characters; the reason is required/. Input:
|
||||
|
||||
"- You end another role's run with end_run, naming the role instance and a reason of 1 to 500 characters. You can't end your own run or the assistant's. For anything the broker refuses, raise a role.revoke decision with blocking false and the role instance as target, naming the run and saying why; the human decides, and `mosaic stop` is theirs."
|
||||
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/researcher/q132/packages/harness/tests/bundle.test.mjs:104:10)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: "- You end another role's run with end_run, naming the role instance and a reason of 1 to 500 characters. You can't end your own run or the assistant's. For anything the broker refuses, raise a role.revoke decision with blocking false and the role instance as target, naming the run and saying why; the human decides, and `mosaic stop` is theirs.",
|
||||
expected: /^- You end another role's run with end_run, naming the role instance and a reason of 1 to 500 characters; the reason is required/,
|
||||
operator: 'match',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
--- /mnt/storage/scratch/researcher/q132-out/.bak.LfOY8j/packages/harness/src/bundle.mjs 2026-10-15 13:00:41.862446634 -0500
|
||||
+++ packages/harness/src/bundle.mjs 2026-10-15 13:00:42.298420805 -0500
|
||||
@@ -92,7 +92,7 @@
|
||||
const named = new Set(tools.map((t) => t.name));
|
||||
// Row 90 (#1584): PM fault 10 (#228 c91). Row 132 (#1628): a role holding role.end has end_run.
|
||||
lines.push(named.has("end_run")
|
||||
- ? "- You end another role's run with end_run, naming the role instance and a reason of 1 to 500 characters; the reason is required and goes into the log. You can't end your own run or the assistant's. For anything the broker refuses, raise a role.revoke decision with blocking false and the role instance as target, naming the run and saying why; the human decides, and `mosaic stop` is theirs."
|
||||
+ ? "- You end another role's run with end_run, naming the role instance and a reason of 1 to 500 characters. You can't end your own run or the assistant's. For anything the broker refuses, raise a role.revoke decision with blocking false and the role instance as target, naming the run and saying why; the human decides, and `mosaic stop` is theirs."
|
||||
: "- Only the human stops a run, with `mosaic stop`. If you think a run should stop, raise a role.revoke decision with blocking false and the role instance as target, naming the run and saying why.");
|
||||
// Row 93 (#1587): the review loop, for the roles that have its tools.
|
||||
if (named.has("push_working"))
|
||||
@@ -0,0 +1 @@
|
||||
1
|
||||
@@ -0,0 +1,257 @@
|
||||
✖ the PM gets its task verbs and the reads, and no launch (6.643819ms)
|
||||
✔ the chief of staff gets launch, send_message, end_run and change_organization, and no task verbs (1.911882ms)
|
||||
✔ end_run sends role and reason, no decision; change_organization sends revision and the organization keys (1.854579ms)
|
||||
✔ the organization keys change_organization takes are the broker's ORGANIZATION_KEYS (0.099149ms)
|
||||
✖ a role without role.end or organization.change gets neither tool, and each tool follows its own grant (1.266058ms)
|
||||
✖ the assistant gets send_message and the reads, no launch (1.354883ms)
|
||||
✔ list_requirements reads the requirement ids, for a task.create holder with a tracker (2.124735ms)
|
||||
✖ a coder gets no launch, no resolve_decision, and no task tools without a tracker (1.092327ms)
|
||||
✖ a coder with a tracker gets its own task tools and no task_reassign (1.343716ms)
|
||||
✔ launch only when the business's launch block names the instance as launcher (1.721603ms)
|
||||
✖ an action outside the instance's authority has no tool (0.932376ms)
|
||||
✖ the review loop: push_working and request_review for the coder, fetch_review and review_verdict for the reviewer, none for the PM (0.944012ms)
|
||||
✔ callTool: one JSON line out, the result back, a refusal rejects (8.477756ms)
|
||||
✔ list_tasks takes the broker's filters and pages; get_task takes a task_ref (2.048471ms)
|
||||
✔ callTool sends list_tasks done false unless the session names done; other tools as given (1.854148ms)
|
||||
✔ replyText: compact JSON up to the cap, an error naming the size and the cap over it (0.653826ms)
|
||||
ℹ tests 16
|
||||
ℹ suites 0
|
||||
ℹ pass 9
|
||||
ℹ fail 7
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 101.32026
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/harness/tests/tools.test.mjs:9:1
|
||||
✖ the PM gets its task verbs and the reads, and no launch (6.643819ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
... Skipped lines
|
||||
|
||||
[
|
||||
'send_message',
|
||||
'task_create',
|
||||
'task_assign',
|
||||
'task_reassign',
|
||||
...
|
||||
'task_close',
|
||||
+ 'change_organization',
|
||||
'raise_decision',
|
||||
'resolve_decision',
|
||||
'list_agents',
|
||||
'inbox',
|
||||
'trail',
|
||||
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/researcher/q132/packages/harness/tests/tools.test.mjs:12:10)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.start (node:internal/test_runner/test:1262:17)
|
||||
at startSubtestAfterBootstrap (node:internal/test_runner/harness:387:17) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: [
|
||||
'send_message', 'task_create',
|
||||
'task_assign', 'task_reassign',
|
||||
'task_schedule', 'task_priority_change',
|
||||
'task_scope_change', 'task_update_assigned',
|
||||
'task_close', 'change_organization',
|
||||
'raise_decision', 'resolve_decision',
|
||||
'list_agents', 'inbox',
|
||||
'trail', 'list_tasks',
|
||||
'get_task', 'list_requirements'
|
||||
],
|
||||
expected: [
|
||||
'send_message', 'task_create',
|
||||
'task_assign', 'task_reassign',
|
||||
'task_schedule', 'task_priority_change',
|
||||
'task_scope_change', 'task_update_assigned',
|
||||
'task_close', 'raise_decision',
|
||||
'resolve_decision', 'list_agents',
|
||||
'inbox', 'trail',
|
||||
'list_tasks', 'get_task',
|
||||
'list_requirements'
|
||||
],
|
||||
operator: 'deepStrictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
|
||||
test at packages/harness/tests/tools.test.mjs:69:1
|
||||
✖ a role without role.end or organization.change gets neither tool, and each tool follows its own grant (1.266058ms)
|
||||
AssertionError [ERR_ASSERTION]: pm
|
||||
+ actual - expected
|
||||
|
||||
+ [
|
||||
+ 'change_organization'
|
||||
+ ]
|
||||
- []
|
||||
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/researcher/q132/packages/harness/tests/tools.test.mjs:72:12)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: false,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: [ 'change_organization' ],
|
||||
expected: [],
|
||||
operator: 'deepStrictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
|
||||
test at packages/harness/tests/tools.test.mjs:82:1
|
||||
✖ the assistant gets send_message and the reads, no launch (1.354883ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
|
||||
[
|
||||
'send_message',
|
||||
+ 'change_organization',
|
||||
'raise_decision',
|
||||
'list_agents',
|
||||
'inbox',
|
||||
'trail',
|
||||
'list_tasks',
|
||||
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/researcher/q132/packages/harness/tests/tools.test.mjs:85:10)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: [ 'send_message', 'change_organization', 'raise_decision', 'list_agents', 'inbox', 'trail', 'list_tasks', 'get_task' ],
|
||||
expected: [ 'send_message', 'raise_decision', 'list_agents', 'inbox', 'trail', 'list_tasks', 'get_task' ],
|
||||
operator: 'deepStrictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
|
||||
test at packages/harness/tests/tools.test.mjs:116:1
|
||||
✖ a coder gets no launch, no resolve_decision, and no task tools without a tracker (1.092327ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
|
||||
[
|
||||
'send_message',
|
||||
'request_review',
|
||||
+ 'change_organization',
|
||||
'raise_decision',
|
||||
'list_agents',
|
||||
'inbox',
|
||||
'trail'
|
||||
]
|
||||
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/researcher/q132/packages/harness/tests/tools.test.mjs:119:10)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: [ 'send_message', 'request_review', 'change_organization', 'raise_decision', 'list_agents', 'inbox', 'trail' ],
|
||||
expected: [ 'send_message', 'request_review', 'raise_decision', 'list_agents', 'inbox', 'trail' ],
|
||||
operator: 'deepStrictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
|
||||
test at packages/harness/tests/tools.test.mjs:125:1
|
||||
✖ a coder with a tracker gets its own task tools and no task_reassign (1.343716ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
|
||||
[
|
||||
'send_message',
|
||||
'task_scope_change',
|
||||
'task_update_assigned',
|
||||
'request_review',
|
||||
+ 'change_organization',
|
||||
'raise_decision',
|
||||
'list_agents',
|
||||
'inbox',
|
||||
'trail',
|
||||
'list_tasks',
|
||||
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/researcher/q132/packages/harness/tests/tools.test.mjs:127:10)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: [ 'send_message', 'task_scope_change', 'task_update_assigned', 'request_review', 'change_organization', 'raise_decision', 'list_agents', 'inbox', 'trail', 'list_tasks', 'get_task' ],
|
||||
expected: [ 'send_message', 'task_scope_change', 'task_update_assigned', 'request_review', 'raise_decision', 'list_agents', 'inbox', 'trail', 'list_tasks', 'get_task' ],
|
||||
operator: 'deepStrictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
|
||||
test at packages/harness/tests/tools.test.mjs:140:1
|
||||
✖ an action outside the instance's authority has no tool (0.932376ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
|
||||
[
|
||||
'request_review',
|
||||
+ 'change_organization',
|
||||
'raise_decision',
|
||||
'list_agents',
|
||||
'inbox',
|
||||
'trail',
|
||||
'list_tasks',
|
||||
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/researcher/q132/packages/harness/tests/tools.test.mjs:142:10)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: [ 'request_review', 'change_organization', 'raise_decision', 'list_agents', 'inbox', 'trail', 'list_tasks', 'get_task' ],
|
||||
expected: [ 'request_review', 'raise_decision', 'list_agents', 'inbox', 'trail', 'list_tasks', 'get_task' ],
|
||||
operator: 'deepStrictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
|
||||
test at packages/harness/tests/tools.test.mjs:146:1
|
||||
✖ the review loop: push_working and request_review for the coder, fetch_review and review_verdict for the reviewer, none for the PM (0.944012ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
|
||||
[
|
||||
'send_message',
|
||||
'task_scope_change',
|
||||
'task_update_assigned',
|
||||
'push_working',
|
||||
'request_review',
|
||||
+ 'change_organization',
|
||||
'raise_decision',
|
||||
'list_agents',
|
||||
'inbox',
|
||||
'trail',
|
||||
'list_tasks',
|
||||
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/researcher/q132/packages/harness/tests/tools.test.mjs:149:10)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: [ 'send_message', 'task_scope_change', 'task_update_assigned', 'push_working', 'request_review', 'change_organization', 'raise_decision', 'list_agents', 'inbox', 'trail', 'list_tasks', 'get_task' ],
|
||||
expected: [ 'send_message', 'task_scope_change', 'task_update_assigned', 'push_working', 'request_review', 'raise_decision', 'list_agents', 'inbox', 'trail', 'list_tasks', 'get_task' ],
|
||||
operator: 'deepStrictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
--- /mnt/storage/scratch/researcher/q132-out/.bak.LfOY8j/packages/harness/src/tools.mjs 2026-10-15 13:00:17.085705946 -0500
|
||||
+++ packages/harness/src/tools.mjs 2026-10-15 13:00:17.259238954 -0500
|
||||
@@ -143,7 +143,7 @@
|
||||
reason: str("Why the run ends, 1 to 500 characters", { minLength: 1, maxLength: 500 }),
|
||||
}, ["role", "reason"]));
|
||||
}
|
||||
- if (held.has("organization.change")) {
|
||||
+ if (true) {
|
||||
add("change_organization", "organization.set", "organization.change", "Change the organization file: the launch limits, the model table, and the model each instance runs. revision is the file's current revision; the broker refuses a stale one with revision-conflict. Send only the keys you change; each replaces what the file holds for it.", obj({
|
||||
revision: str("The organization file's current revision", { pattern: "^[a-f0-9]{64}$" }),
|
||||
limits: { type: "object", description: "The launch limits, replacing the file's launch limits" },
|
||||
@@ -0,0 +1 @@
|
||||
1
|
||||
@@ -0,0 +1,42 @@
|
||||
✔ sessionModel: agent vars win, then the system's execution settings (7.543604ms)
|
||||
✔ a pi bundle: prompt, policy, tools and manifest, 0600 in a 0700 directory (3.395357ms)
|
||||
✔ a chief-of-staff bundle lists launch among the bus tools and the manifest's typed tools (1.628075ms)
|
||||
✔ a chief-of-staff bundle lists end_run and change_organization as typed and nothing untyped, for either harness (3.125889ms)
|
||||
✖ the stop line names end_run for a role.end holder, and every other role keeps today's text (2.309663ms)
|
||||
✔ a claude-code bundle adds the wrapped gate hook and the MCP config (1.516724ms)
|
||||
✔ the prompt's built-in tools line is the harness's own names, as the manifest lists them (4.800133ms)
|
||||
✔ the prompt names the project clones in the workspace, and none when there are none (3.810361ms)
|
||||
✔ the prompt explains the review loop to a role with push_working, and reviews to one with fetch_review (4.867964ms)
|
||||
✔ a bundle is written once: an existing file refuses (0.981165ms)
|
||||
✔ a path with a single quote can't go into the hook command (1.091609ms)
|
||||
ℹ tests 11
|
||||
ℹ suites 0
|
||||
ℹ pass 10
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 98.422733
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/harness/tests/bundle.test.mjs:98:1
|
||||
✖ the stop line names end_run for a role.end holder, and every other role keeps today's text (2.309663ms)
|
||||
AssertionError [ERR_ASSERTION]: The input did not match the regular expression /You can't end your own run or the assistant's\./. Input:
|
||||
|
||||
"- You end another role's run with end_run, naming the role instance and a reason of 1 to 500 characters; the reason is required and goes into the log. For anything the broker refuses, raise a role.revoke decision with blocking false and the role instance as target, naming the run and saying why; the human decides, and `mosaic stop` is theirs."
|
||||
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/researcher/q132/packages/harness/tests/bundle.test.mjs:105:10)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: "- You end another role's run with end_run, naming the role instance and a reason of 1 to 500 characters; the reason is required and goes into the log. For anything the broker refuses, raise a role.revoke decision with blocking false and the role instance as target, naming the run and saying why; the human decides, and `mosaic stop` is theirs.",
|
||||
expected: /You can't end your own run or the assistant's\./,
|
||||
operator: 'match',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
--- /mnt/storage/scratch/researcher/q132-out/.bak.LfOY8j/packages/harness/src/bundle.mjs 2026-10-15 13:00:41.862446634 -0500
|
||||
+++ packages/harness/src/bundle.mjs 2026-10-15 13:00:42.462421661 -0500
|
||||
@@ -92,7 +92,7 @@
|
||||
const named = new Set(tools.map((t) => t.name));
|
||||
// Row 90 (#1584): PM fault 10 (#228 c91). Row 132 (#1628): a role holding role.end has end_run.
|
||||
lines.push(named.has("end_run")
|
||||
- ? "- You end another role's run with end_run, naming the role instance and a reason of 1 to 500 characters; the reason is required and goes into the log. You can't end your own run or the assistant's. For anything the broker refuses, raise a role.revoke decision with blocking false and the role instance as target, naming the run and saying why; the human decides, and `mosaic stop` is theirs."
|
||||
+ ? "- You end another role's run with end_run, naming the role instance and a reason of 1 to 500 characters; the reason is required and goes into the log. For anything the broker refuses, raise a role.revoke decision with blocking false and the role instance as target, naming the run and saying why; the human decides, and `mosaic stop` is theirs."
|
||||
: "- Only the human stops a run, with `mosaic stop`. If you think a run should stop, raise a role.revoke decision with blocking false and the role instance as target, naming the run and saying why.");
|
||||
// Row 93 (#1587): the review loop, for the roles that have its tools.
|
||||
if (named.has("push_working"))
|
||||
@@ -0,0 +1 @@
|
||||
1
|
||||
@@ -0,0 +1,42 @@
|
||||
✔ sessionModel: agent vars win, then the system's execution settings (8.139609ms)
|
||||
✔ a pi bundle: prompt, policy, tools and manifest, 0600 in a 0700 directory (3.746885ms)
|
||||
✔ a chief-of-staff bundle lists launch among the bus tools and the manifest's typed tools (1.941788ms)
|
||||
✔ a chief-of-staff bundle lists end_run and change_organization as typed and nothing untyped, for either harness (4.174134ms)
|
||||
✖ the stop line names end_run for a role.end holder, and every other role keeps today's text (2.619046ms)
|
||||
✔ a claude-code bundle adds the wrapped gate hook and the MCP config (1.788768ms)
|
||||
✔ the prompt's built-in tools line is the harness's own names, as the manifest lists them (5.672566ms)
|
||||
✔ the prompt names the project clones in the workspace, and none when there are none (4.391318ms)
|
||||
✔ the prompt explains the review loop to a role with push_working, and reviews to one with fetch_review (5.356479ms)
|
||||
✔ a bundle is written once: an existing file refuses (1.105218ms)
|
||||
✔ a path with a single quote can't go into the hook command (1.143605ms)
|
||||
ℹ tests 11
|
||||
ℹ suites 0
|
||||
ℹ pass 10
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 124.279529
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/harness/tests/bundle.test.mjs:98:1
|
||||
✖ the stop line names end_run for a role.end holder, and every other role keeps today's text (2.619046ms)
|
||||
AssertionError [ERR_ASSERTION]: The input did not match the regular expression /For anything the broker refuses, raise a role\.revoke decision with blocking false/. Input:
|
||||
|
||||
"- You end another role's run with end_run, naming the role instance and a reason of 1 to 500 characters; the reason is required and goes into the log. You can't end your own run or the assistant's. For anything else, raise a role.revoke decision with blocking false and the role instance as target, naming the run and saying why; the human decides, and `mosaic stop` is theirs."
|
||||
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/researcher/q132/packages/harness/tests/bundle.test.mjs:106:10)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: "- You end another role's run with end_run, naming the role instance and a reason of 1 to 500 characters; the reason is required and goes into the log. You can't end your own run or the assistant's. For anything else, raise a role.revoke decision with blocking false and the role instance as target, naming the run and saying why; the human decides, and `mosaic stop` is theirs.",
|
||||
expected: /For anything the broker refuses, raise a role\.revoke decision with blocking false/,
|
||||
operator: 'match',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
--- /mnt/storage/scratch/researcher/q132-out/.bak.LfOY8j/packages/harness/src/bundle.mjs 2026-10-15 13:00:41.862446634 -0500
|
||||
+++ packages/harness/src/bundle.mjs 2026-10-15 13:00:42.613152046 -0500
|
||||
@@ -92,7 +92,7 @@
|
||||
const named = new Set(tools.map((t) => t.name));
|
||||
// Row 90 (#1584): PM fault 10 (#228 c91). Row 132 (#1628): a role holding role.end has end_run.
|
||||
lines.push(named.has("end_run")
|
||||
- ? "- You end another role's run with end_run, naming the role instance and a reason of 1 to 500 characters; the reason is required and goes into the log. You can't end your own run or the assistant's. For anything the broker refuses, raise a role.revoke decision with blocking false and the role instance as target, naming the run and saying why; the human decides, and `mosaic stop` is theirs."
|
||||
+ ? "- You end another role's run with end_run, naming the role instance and a reason of 1 to 500 characters; the reason is required and goes into the log. You can't end your own run or the assistant's. For anything else, raise a role.revoke decision with blocking false and the role instance as target, naming the run and saying why; the human decides, and `mosaic stop` is theirs."
|
||||
: "- Only the human stops a run, with `mosaic stop`. If you think a run should stop, raise a role.revoke decision with blocking false and the role instance as target, naming the run and saying why.");
|
||||
// Row 93 (#1587): the review loop, for the roles that have its tools.
|
||||
if (named.has("push_working"))
|
||||
@@ -0,0 +1 @@
|
||||
1
|
||||
@@ -0,0 +1,71 @@
|
||||
✔ founderCheck: founder variables, then a needed service without a usable token (0.873275ms)
|
||||
✔ turnRequest names the sender, class, reply and decision (0.148436ms)
|
||||
✔ turnRequest says a tester's message is a test and never Jason's instruction (0.159064ms)
|
||||
✔ turnRequest shows the message's own sent time, a day old as well as new (0.102965ms)
|
||||
✔ stateBlock names the launch state with its time and event, and the open tasks with the cap (0.159613ms)
|
||||
✔ a message becomes a turn, the answer goes back as a RESULT, SIGTERM releases and exits 0 (149.738065ms)
|
||||
✔ launches revoked and then restored: the turn's block reads allowed and gives the restore time (165.935355ms)
|
||||
✔ a task closed on the tracker is missing from the next turn's open list (196.022061ms)
|
||||
✔ a message read a day after it was sent shows the time it was sent (115.554552ms)
|
||||
✔ a decision the human resolves becomes a turn citing the decision and the answer (118.542715ms)
|
||||
✔ a failed state read fails the turn: no adapter runs, the sender hears why, the message is read (65.705134ms)
|
||||
✔ a SIGTERM before the claim stops the runner with exit 0 and no claim (51.698874ms)
|
||||
✖ typed tools carry the runner's capability; launch goes to the host's launch socket (15030.423343ms)
|
||||
✖ end_run and change_organization reach the broker with the tool's arguments, and refusals keep their codes (374.056597ms)
|
||||
✔ a RESULT gets no automatic reply; failed turns reply with the reason (1233.466896ms)
|
||||
✔ SIGTERM during a turn kills the turn's process group and still exits 0 (351.016888ms)
|
||||
✔ founder credentials stop before the claim (20) (308.551965ms)
|
||||
✔ a refused claim exits 21; an ended run's capability exits 22 (156.188394ms)
|
||||
✔ the launch ending under a running session exits 22 (118.799239ms)
|
||||
✔ a broker that stays unreachable exits 23 after brokerRetries polls (287.13748ms)
|
||||
✔ a broker that is down at the claim exits 23, not 21 (109.305156ms)
|
||||
✔ no capability, or a malformed one, on stdin exits 2 (232.434703ms)
|
||||
✔ a missing or malformed policy exits 2 before the claim (118.619218ms)
|
||||
ℹ tests 23
|
||||
ℹ suites 0
|
||||
ℹ pass 21
|
||||
ℹ fail 2
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 25913.900441
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/harness/tests/runner.test.mjs:353:1
|
||||
✖ typed tools carry the runner's capability; launch goes to the host's launch socket (15030.423343ms)
|
||||
Error: timed out waiting
|
||||
at until (file:///mnt/storage/scratch/researcher/q132/packages/harness/tests/runner.test.mjs:177:33)
|
||||
at async TestContext.<anonymous> (file:///mnt/storage/scratch/researcher/q132/packages/harness/tests/runner.test.mjs:359:3)
|
||||
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
|
||||
|
||||
test at packages/harness/tests/runner.test.mjs:377:1
|
||||
✖ end_run and change_organization reach the broker with the tool's arguments, and refusals keep their codes (374.056597ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
|
||||
[
|
||||
- '{"revoked":true}',
|
||||
- 'refused: role-end-refused',
|
||||
- 'refused: role-end-refused',
|
||||
- '{"revision":"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"}',
|
||||
'refused: invalid-request',
|
||||
+ 'refused: invalid-request',
|
||||
+ 'refused: invalid-request',
|
||||
+ 'refused: invalid-request',
|
||||
+ 'refused: invalid-request',
|
||||
+ 'refused: invalid-request'
|
||||
- 'refused: revision-conflict'
|
||||
]
|
||||
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/researcher/q132/packages/harness/tests/runner.test.mjs:400:10)
|
||||
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: [ 'refused: invalid-request', 'refused: invalid-request', 'refused: invalid-request', 'refused: invalid-request', 'refused: invalid-request', 'refused: invalid-request' ],
|
||||
expected: [ '{"revoked":true}', 'refused: role-end-refused', 'refused: role-end-refused', '{"revision":"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"}', 'refused: invalid-request', 'refused: revision-conflict' ],
|
||||
operator: 'deepStrictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
--- /mnt/storage/scratch/researcher/q132-out/.bak.LfOY8j/packages/harness/src/runner.mjs 2026-10-15 13:00:42.778596952 -0500
|
||||
+++ packages/harness/src/runner.mjs 2026-10-15 13:00:42.797423410 -0500
|
||||
@@ -163,7 +163,7 @@
|
||||
if (!tool) return answer({ ok: false, error: "unknown-tool" });
|
||||
const args = request.args && typeof request.args === "object" && !Array.isArray(request.args) ? request.args : {};
|
||||
try {
|
||||
- const result = Object.hasOwn(local, tool.verb) ? await local[tool.verb](args) : await client.call(tool.verb, args);
|
||||
+ const result = Object.hasOwn(local, tool.verb) ? await local[tool.verb](args) : await client.call(tool.verb, {});
|
||||
answer({ ok: true, result });
|
||||
} catch (e) {
|
||||
answer({ ok: false, error: /^[a-z-]{1,64}$/.test(e.code ?? "") ? e.code : "tool-failed" });
|
||||
@@ -0,0 +1 @@
|
||||
1
|
||||
@@ -0,0 +1,72 @@
|
||||
✔ founderCheck: founder variables, then a needed service without a usable token (0.965944ms)
|
||||
✔ turnRequest names the sender, class, reply and decision (0.166594ms)
|
||||
✔ turnRequest says a tester's message is a test and never Jason's instruction (0.190471ms)
|
||||
✔ turnRequest shows the message's own sent time, a day old as well as new (0.118268ms)
|
||||
✔ stateBlock names the launch state with its time and event, and the open tasks with the cap (0.196411ms)
|
||||
✔ a message becomes a turn, the answer goes back as a RESULT, SIGTERM releases and exits 0 (150.612217ms)
|
||||
✔ launches revoked and then restored: the turn's block reads allowed and gives the restore time (194.723112ms)
|
||||
✔ a task closed on the tracker is missing from the next turn's open list (196.769085ms)
|
||||
✔ a message read a day after it was sent shows the time it was sent (143.523253ms)
|
||||
✔ a decision the human resolves becomes a turn citing the decision and the answer (168.619888ms)
|
||||
✔ a failed state read fails the turn: no adapter runs, the sender hears why, the message is read (64.705998ms)
|
||||
✔ a SIGTERM before the claim stops the runner with exit 0 and no claim (62.650038ms)
|
||||
✖ typed tools carry the runner's capability; launch goes to the host's launch socket (15027.232127ms)
|
||||
✖ end_run and change_organization reach the broker with the tool's arguments, and refusals keep their codes (254.756126ms)
|
||||
✔ a RESULT gets no automatic reply; failed turns reply with the reason (1185.007964ms)
|
||||
✔ SIGTERM during a turn kills the turn's process group and still exits 0 (92.460262ms)
|
||||
✔ founder credentials stop before the claim (20) (87.952884ms)
|
||||
✔ a refused claim exits 21; an ended run's capability exits 22 (93.104781ms)
|
||||
✔ the launch ending under a running session exits 22 (98.416121ms)
|
||||
✔ a broker that stays unreachable exits 23 after brokerRetries polls (199.585148ms)
|
||||
✔ a broker that is down at the claim exits 23, not 21 (46.839195ms)
|
||||
✔ no capability, or a malformed one, on stdin exits 2 (152.821459ms)
|
||||
✔ a missing or malformed policy exits 2 before the claim (84.350225ms)
|
||||
ℹ tests 23
|
||||
ℹ suites 0
|
||||
ℹ pass 21
|
||||
ℹ fail 2
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 25639.260169
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/harness/tests/runner.test.mjs:353:1
|
||||
✖ typed tools carry the runner's capability; launch goes to the host's launch socket (15027.232127ms)
|
||||
Error: timed out waiting
|
||||
at until (file:///mnt/storage/scratch/researcher/q132/packages/harness/tests/runner.test.mjs:177:33)
|
||||
at async TestContext.<anonymous> (file:///mnt/storage/scratch/researcher/q132/packages/harness/tests/runner.test.mjs:359:3)
|
||||
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
|
||||
|
||||
test at packages/harness/tests/runner.test.mjs:377:1
|
||||
✖ end_run and change_organization reach the broker with the tool's arguments, and refusals keep their codes (254.756126ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
|
||||
[
|
||||
+ 'refused: unknown-verb',
|
||||
+ 'refused: unknown-verb',
|
||||
+ 'refused: unknown-verb',
|
||||
+ 'refused: unknown-verb',
|
||||
+ 'refused: unknown-verb',
|
||||
+ 'refused: unknown-verb'
|
||||
- '{"revoked":true}',
|
||||
- 'refused: role-end-refused',
|
||||
- 'refused: role-end-refused',
|
||||
- '{"revision":"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"}',
|
||||
- 'refused: invalid-request',
|
||||
- 'refused: revision-conflict'
|
||||
]
|
||||
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/researcher/q132/packages/harness/tests/runner.test.mjs:400:10)
|
||||
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: [ 'refused: unknown-verb', 'refused: unknown-verb', 'refused: unknown-verb', 'refused: unknown-verb', 'refused: unknown-verb', 'refused: unknown-verb' ],
|
||||
expected: [ '{"revoked":true}', 'refused: role-end-refused', 'refused: role-end-refused', '{"revision":"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"}', 'refused: invalid-request', 'refused: revision-conflict' ],
|
||||
operator: 'deepStrictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
--- /mnt/storage/scratch/researcher/q132-out/.bak.LfOY8j/packages/harness/src/runner.mjs 2026-10-15 13:00:42.778596952 -0500
|
||||
+++ packages/harness/src/runner.mjs 2026-10-15 13:01:08.766563055 -0500
|
||||
@@ -163,7 +163,7 @@
|
||||
if (!tool) return answer({ ok: false, error: "unknown-tool" });
|
||||
const args = request.args && typeof request.args === "object" && !Array.isArray(request.args) ? request.args : {};
|
||||
try {
|
||||
- const result = Object.hasOwn(local, tool.verb) ? await local[tool.verb](args) : await client.call(tool.verb, args);
|
||||
+ const result = Object.hasOwn(local, tool.verb) ? await local[tool.verb](args) : await client.call(tool.name, args);
|
||||
answer({ ok: true, result });
|
||||
} catch (e) {
|
||||
answer({ ok: false, error: /^[a-z-]{1,64}$/.test(e.code ?? "") ? e.code : "tool-failed" });
|
||||
@@ -0,0 +1 @@
|
||||
1
|
||||
@@ -0,0 +1,87 @@
|
||||
✔ founderCheck: founder variables, then a needed service without a usable token (0.877565ms)
|
||||
✔ turnRequest names the sender, class, reply and decision (0.145884ms)
|
||||
✔ turnRequest says a tester's message is a test and never Jason's instruction (0.168057ms)
|
||||
✔ turnRequest shows the message's own sent time, a day old as well as new (0.108195ms)
|
||||
✔ stateBlock names the launch state with its time and event, and the open tasks with the cap (0.171083ms)
|
||||
✔ a message becomes a turn, the answer goes back as a RESULT, SIGTERM releases and exits 0 (149.316667ms)
|
||||
✔ launches revoked and then restored: the turn's block reads allowed and gives the restore time (167.093256ms)
|
||||
✔ a task closed on the tracker is missing from the next turn's open list (167.026289ms)
|
||||
✔ a message read a day after it was sent shows the time it was sent (88.834742ms)
|
||||
✔ a decision the human resolves becomes a turn citing the decision and the answer (137.927107ms)
|
||||
✔ a failed state read fails the turn: no adapter runs, the sender hears why, the message is read (62.794614ms)
|
||||
✔ a SIGTERM before the claim stops the runner with exit 0 and no claim (48.494028ms)
|
||||
✖ typed tools carry the runner's capability; launch goes to the host's launch socket (272.666369ms)
|
||||
✖ end_run and change_organization reach the broker with the tool's arguments, and refusals keep their codes (305.882575ms)
|
||||
✔ a RESULT gets no automatic reply; failed turns reply with the reason (1241.983071ms)
|
||||
✔ SIGTERM during a turn kills the turn's process group and still exits 0 (92.183883ms)
|
||||
✔ founder credentials stop before the claim (20) (91.869464ms)
|
||||
✔ a refused claim exits 21; an ended run's capability exits 22 (93.199989ms)
|
||||
✔ the launch ending under a running session exits 22 (96.97023ms)
|
||||
✔ a broker that stays unreachable exits 23 after brokerRetries polls (203.129531ms)
|
||||
✔ a broker that is down at the claim exits 23, not 21 (53.089349ms)
|
||||
✔ no capability, or a malformed one, on stdin exits 2 (182.149642ms)
|
||||
✔ a missing or malformed policy exits 2 before the claim (112.787116ms)
|
||||
ℹ tests 23
|
||||
ℹ suites 0
|
||||
ℹ pass 21
|
||||
ℹ fail 2
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 10829.979909
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/harness/tests/runner.test.mjs:353:1
|
||||
✖ typed tools carry the runner's capability; launch goes to the host's launch socket (272.666369ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
|
||||
[
|
||||
+ 'refused: tool-failed',
|
||||
- 'refused: capacity-full',
|
||||
'{"run":"new-run"}',
|
||||
'refused: unknown-tool',
|
||||
+ 'refused: tool-failed'
|
||||
- 'refused: unknown-role'
|
||||
]
|
||||
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/researcher/q132/packages/harness/tests/runner.test.mjs:371:10)
|
||||
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: [ 'refused: tool-failed', '{"run":"new-run"}', 'refused: unknown-tool', 'refused: tool-failed' ],
|
||||
expected: [ 'refused: capacity-full', '{"run":"new-run"}', 'refused: unknown-tool', 'refused: unknown-role' ],
|
||||
operator: 'deepStrictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
|
||||
test at packages/harness/tests/runner.test.mjs:377:1
|
||||
✖ end_run and change_organization reach the broker with the tool's arguments, and refusals keep their codes (305.882575ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
|
||||
[
|
||||
'{"revoked":true}',
|
||||
+ 'refused: tool-failed',
|
||||
+ 'refused: tool-failed',
|
||||
- 'refused: role-end-refused',
|
||||
- 'refused: role-end-refused',
|
||||
'{"revision":"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"}',
|
||||
+ 'refused: tool-failed',
|
||||
+ 'refused: tool-failed'
|
||||
- 'refused: invalid-request',
|
||||
- 'refused: revision-conflict'
|
||||
]
|
||||
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/researcher/q132/packages/harness/tests/runner.test.mjs:400:10)
|
||||
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: [ '{"revoked":true}', 'refused: tool-failed', 'refused: tool-failed', '{"revision":"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"}', 'refused: tool-failed', 'refused: tool-failed' ],
|
||||
expected: [ '{"revoked":true}', 'refused: role-end-refused', 'refused: role-end-refused', '{"revision":"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"}', 'refused: invalid-request', 'refused: revision-conflict' ],
|
||||
operator: 'deepStrictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
--- /mnt/storage/scratch/researcher/q132-out/.bak.LfOY8j/packages/harness/src/runner.mjs 2026-10-15 13:00:42.778596952 -0500
|
||||
+++ packages/harness/src/runner.mjs 2026-10-15 13:01:34.458708827 -0500
|
||||
@@ -166,7 +166,7 @@
|
||||
const result = Object.hasOwn(local, tool.verb) ? await local[tool.verb](args) : await client.call(tool.verb, args);
|
||||
answer({ ok: true, result });
|
||||
} catch (e) {
|
||||
- answer({ ok: false, error: /^[a-z-]{1,64}$/.test(e.code ?? "") ? e.code : "tool-failed" });
|
||||
+ answer({ ok: false, error: "tool-failed" });
|
||||
}
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1 @@
|
||||
1
|
||||
@@ -0,0 +1,92 @@
|
||||
✔ the PM gets its task verbs and the reads, and no launch (5.536433ms)
|
||||
✖ the chief of staff gets launch, send_message, end_run and change_organization, and no task verbs (2.215125ms)
|
||||
✖ end_run sends role and reason, no decision; change_organization sends revision and the organization keys (1.666709ms)
|
||||
✔ the organization keys change_organization takes are the broker's ORGANIZATION_KEYS (0.089201ms)
|
||||
✖ a role without role.end or organization.change gets neither tool, and each tool follows its own grant (4.941824ms)
|
||||
✔ the assistant gets send_message and the reads, no launch (1.453733ms)
|
||||
✔ list_requirements reads the requirement ids, for a task.create holder with a tracker (2.164964ms)
|
||||
✔ a coder gets no launch, no resolve_decision, and no task tools without a tracker (0.862855ms)
|
||||
✔ a coder with a tracker gets its own task tools and no task_reassign (0.796119ms)
|
||||
✔ launch only when the business's launch block names the instance as launcher (1.457507ms)
|
||||
✔ an action outside the instance's authority has no tool (0.858236ms)
|
||||
✔ the review loop: push_working and request_review for the coder, fetch_review and review_verdict for the reviewer, none for the PM (3.300116ms)
|
||||
✔ callTool: one JSON line out, the result back, a refusal rejects (8.92495ms)
|
||||
✔ list_tasks takes the broker's filters and pages; get_task takes a task_ref (1.827645ms)
|
||||
✔ callTool sends list_tasks done false unless the session names done; other tools as given (1.936302ms)
|
||||
✔ replyText: compact JSON up to the cap, an error naming the size and the cap over it (0.463678ms)
|
||||
ℹ tests 16
|
||||
ℹ suites 0
|
||||
ℹ pass 13
|
||||
ℹ fail 3
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 103.079083
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/harness/tests/tools.test.mjs:33:1
|
||||
✖ the chief of staff gets launch, send_message, end_run and change_organization, and no task verbs (2.215125ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
|
||||
[
|
||||
'send_message',
|
||||
'launch',
|
||||
- 'end_run',
|
||||
'change_organization',
|
||||
'raise_decision',
|
||||
'list_agents',
|
||||
'inbox',
|
||||
'trail',
|
||||
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/researcher/q132/packages/harness/tests/tools.test.mjs:36:10)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: [ 'send_message', 'launch', 'change_organization', 'raise_decision', 'list_agents', 'inbox', 'trail', 'list_tasks', 'get_task' ],
|
||||
expected: [ 'send_message', 'launch', 'end_run', 'change_organization', 'raise_decision', 'list_agents', 'inbox', 'trail', 'list_tasks', 'get_task' ],
|
||||
operator: 'deepStrictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
|
||||
test at packages/harness/tests/tools.test.mjs:46:1
|
||||
✖ end_run sends role and reason, no decision; change_organization sends revision and the organization keys (1.666709ms)
|
||||
TypeError: Cannot read properties of undefined (reading 'verb')
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/researcher/q132/packages/harness/tests/tools.test.mjs:49:25)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
|
||||
|
||||
test at packages/harness/tests/tools.test.mjs:69:1
|
||||
✖ a role without role.end or organization.change gets neither tool, and each tool follows its own grant (4.941824ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
|
||||
+ []
|
||||
- [
|
||||
- 'end_run'
|
||||
- ]
|
||||
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/researcher/q132/packages/harness/tests/tools.test.mjs:77:10)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: [],
|
||||
expected: [ 'end_run' ],
|
||||
operator: 'deepStrictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
--- /mnt/storage/scratch/researcher/q132-out/.bak.LfOY8j/packages/harness/src/tools.mjs 2026-10-15 13:00:17.085705946 -0500
|
||||
+++ packages/harness/src/tools.mjs 2026-10-15 13:00:17.413240821 -0500
|
||||
@@ -137,7 +137,7 @@
|
||||
}
|
||||
// Row 132 (#1628, REQ-ROLE-2, REQ-COS-1, REQ-LIMIT-1): the chief of staff's two grants from row 123.
|
||||
// end_run sends `reason` and never a decision; the broker refuses the caller's own run and the assistant's.
|
||||
- if (held.has("role.end")) {
|
||||
+ if (false) {
|
||||
add("end_run", "role.revoke", "role.end", "End another role's run. A reason is required, 1 to 500 characters, and goes into the log. You can't end your own run or the assistant's; the broker refuses with role-end-refused.", obj({
|
||||
role: str("Role instance whose run to end"),
|
||||
reason: str("Why the run ends, 1 to 500 characters", { minLength: 1, maxLength: 500 }),
|
||||
@@ -0,0 +1 @@
|
||||
1
|
||||
@@ -0,0 +1,106 @@
|
||||
✔ sessionModel: agent vars win, then the system's execution settings (7.737571ms)
|
||||
✔ a pi bundle: prompt, policy, tools and manifest, 0600 in a 0700 directory (3.033175ms)
|
||||
✖ a chief-of-staff bundle lists launch among the bus tools and the manifest's typed tools (2.517052ms)
|
||||
✖ a chief-of-staff bundle lists end_run and change_organization as typed and nothing untyped, for either harness (2.22107ms)
|
||||
✖ the stop line names end_run for a role.end holder, and every other role keeps today's text (1.813215ms)
|
||||
✔ a claude-code bundle adds the wrapped gate hook and the MCP config (1.927597ms)
|
||||
✔ the prompt's built-in tools line is the harness's own names, as the manifest lists them (5.250914ms)
|
||||
✔ the prompt names the project clones in the workspace, and none when there are none (4.112878ms)
|
||||
✔ the prompt explains the review loop to a role with push_working, and reviews to one with fetch_review (6.33232ms)
|
||||
✔ a bundle is written once: an existing file refuses (1.711885ms)
|
||||
✔ a path with a single quote can't go into the hook command (1.293546ms)
|
||||
ℹ tests 11
|
||||
ℹ suites 0
|
||||
ℹ pass 8
|
||||
ℹ fail 3
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 108.873331
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/harness/tests/bundle.test.mjs:74:1
|
||||
✖ a chief-of-staff bundle lists launch among the bus tools and the manifest's typed tools (2.517052ms)
|
||||
AssertionError [ERR_ASSERTION]: The input did not match the regular expression /Bus tools: send_message, launch, end_run, change_organization, raise_decision, /. Input:
|
||||
|
||||
'# Contract\n' +
|
||||
'\n' +
|
||||
'Do the work.\n' +
|
||||
'\n' +
|
||||
'## This session\n' +
|
||||
'\n' +
|
||||
'- Business: acme. Role instance: chief (definition chief-of-staff). Run: run-1.\n' +
|
||||
'- Launched by: pm. Harness: pi, model claude-opus-5-5.\n' +
|
||||
'- Workspace: /mnt/storage/scratch/tmp/mosaic-harness-pc63mx/ws. File tools work inside it only.\n' +
|
||||
'- Built-in tools: read, grep, find, ls.\n' +
|
||||
'- Bus tools: send_message, launch, change_organization, raise_decision, list_agents, inbox, trail, list_tasks, get_task. The broker decides every call; a refusal names its reason.\n' +
|
||||
'- Each message to you arrives as one turn. Your final answer goes back to the sender as the reply, so end each turn with the answer itself.\n' +
|
||||
'- You never hold a token. You act on the tracker, the forge and other roles only through the bus tools.\n' +
|
||||
'- Only the human stops a run, with `mosaic stop`. If you think a run should stop, raise a role.revoke decision with blocking false and the role instance as target, naming the run and saying why.\n' +
|
||||
'- Actions you hold that have no bus tool yet: role.end. Say so instead of working around it.\n'
|
||||
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/researcher/q132/packages/harness/tests/bundle.test.mjs:79:10)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: '# Contract\n\nDo the work.\n\n## This session\n\n- Business: acme. Role instance: chief (definition chief-of-staff). Run: run-1.\n- Launched by: pm. Harness: pi, model claude-opus-5-5.\n- Workspace: /mnt/storage/scratch/tmp/mosaic-harness-pc63mx/ws. File tools work inside it only.\n- Built-in tools: read, grep, find, ls.\n- Bus tools: send_message, launch, change_organization, raise_decision, list_agents, inbox, trail, list_tasks, get_task. The broker decides every call; a refusal names its reason.\n- Each message to you arrives as one turn. Your final answer goes back to the sender as the reply, so end each turn with the answer itself.\n- You never hold a token. You act on the tracker, the forge and other roles only through the bus tools.\n- Only the human stops a run, with `mosaic stop`. If you think a run should stop, raise a role.revoke decision with blocking false and the role instance as target, naming the run and saying why.\n- Actions you hold that have no bus tool yet: role.end. Say so instead of working around it.\n',
|
||||
expected: /Bus tools: send_message, launch, end_run, change_organization, raise_decision, /,
|
||||
operator: 'match',
|
||||
diff: 'simple'
|
||||
}
|
||||
|
||||
test at packages/harness/tests/bundle.test.mjs:85:1
|
||||
✖ a chief-of-staff bundle lists end_run and change_organization as typed and nothing untyped, for either harness (2.22107ms)
|
||||
AssertionError [ERR_ASSERTION]: pi
|
||||
+ actual - expected
|
||||
|
||||
[
|
||||
'send_message',
|
||||
'launch',
|
||||
- 'end_run',
|
||||
'change_organization',
|
||||
'raise_decision',
|
||||
'list_agents',
|
||||
'inbox',
|
||||
'trail',
|
||||
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/researcher/q132/packages/harness/tests/bundle.test.mjs:90:12)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: false,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: [ 'send_message', 'launch', 'change_organization', 'raise_decision', 'list_agents', 'inbox', 'trail', 'list_tasks', 'get_task' ],
|
||||
expected: [ 'send_message', 'launch', 'end_run', 'change_organization', 'raise_decision', 'list_agents', 'inbox', 'trail', 'list_tasks', 'get_task' ],
|
||||
operator: 'deepStrictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
|
||||
test at packages/harness/tests/bundle.test.mjs:98:1
|
||||
✖ the stop line names end_run for a role.end holder, and every other role keeps today's text (1.813215ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected "actual" to be strictly unequal to:
|
||||
|
||||
'- Only the human stops a run, with `mosaic stop`. If you think a run should stop, raise a role.revoke decision with blocking false and the role instance as target, naming the run and saying why.'
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/researcher/q132/packages/harness/tests/bundle.test.mjs:103:10)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: '- Only the human stops a run, with `mosaic stop`. If you think a run should stop, raise a role.revoke decision with blocking false and the role instance as target, naming the run and saying why.',
|
||||
expected: '- Only the human stops a run, with `mosaic stop`. If you think a run should stop, raise a role.revoke decision with blocking false and the role instance as target, naming the run and saying why.',
|
||||
operator: 'notStrictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
--- /mnt/storage/scratch/researcher/q132-out/.bak.LfOY8j/packages/harness/src/tools.mjs 2026-10-15 13:00:17.085705946 -0500
|
||||
+++ packages/harness/src/tools.mjs 2026-10-15 13:00:17.573242760 -0500
|
||||
@@ -137,7 +137,7 @@
|
||||
}
|
||||
// Row 132 (#1628, REQ-ROLE-2, REQ-COS-1, REQ-LIMIT-1): the chief of staff's two grants from row 123.
|
||||
// end_run sends `reason` and never a decision; the broker refuses the caller's own run and the assistant's.
|
||||
- if (held.has("role.end")) {
|
||||
+ if (false) {
|
||||
add("end_run", "role.revoke", "role.end", "End another role's run. A reason is required, 1 to 500 characters, and goes into the log. You can't end your own run or the assistant's; the broker refuses with role-end-refused.", obj({
|
||||
role: str("Role instance whose run to end"),
|
||||
reason: str("Why the run ends, 1 to 500 characters", { minLength: 1, maxLength: 500 }),
|
||||
@@ -0,0 +1 @@
|
||||
1
|
||||
@@ -0,0 +1,93 @@
|
||||
✔ the PM gets its task verbs and the reads, and no launch (5.969993ms)
|
||||
✖ the chief of staff gets launch, send_message, end_run and change_organization, and no task verbs (2.777142ms)
|
||||
✖ end_run sends role and reason, no decision; change_organization sends revision and the organization keys (2.164643ms)
|
||||
✔ the organization keys change_organization takes are the broker's ORGANIZATION_KEYS (0.100271ms)
|
||||
✖ a role without role.end or organization.change gets neither tool, and each tool follows its own grant (6.251557ms)
|
||||
✔ the assistant gets send_message and the reads, no launch (1.119712ms)
|
||||
✔ list_requirements reads the requirement ids, for a task.create holder with a tracker (1.694466ms)
|
||||
✔ a coder gets no launch, no resolve_decision, and no task tools without a tracker (0.790813ms)
|
||||
✔ a coder with a tracker gets its own task tools and no task_reassign (0.741511ms)
|
||||
✔ launch only when the business's launch block names the instance as launcher (1.438908ms)
|
||||
✔ an action outside the instance's authority has no tool (0.896459ms)
|
||||
✔ the review loop: push_working and request_review for the coder, fetch_review and review_verdict for the reviewer, none for the PM (3.253169ms)
|
||||
✔ callTool: one JSON line out, the result back, a refusal rejects (9.064177ms)
|
||||
✔ list_tasks takes the broker's filters and pages; get_task takes a task_ref (1.74534ms)
|
||||
✔ callTool sends list_tasks done false unless the session names done; other tools as given (1.914167ms)
|
||||
✔ replyText: compact JSON up to the cap, an error naming the size and the cap over it (0.52665ms)
|
||||
ℹ tests 16
|
||||
ℹ suites 0
|
||||
ℹ pass 13
|
||||
ℹ fail 3
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 105.241569
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/harness/tests/tools.test.mjs:33:1
|
||||
✖ the chief of staff gets launch, send_message, end_run and change_organization, and no task verbs (2.777142ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
|
||||
[
|
||||
'send_message',
|
||||
'launch',
|
||||
'end_run',
|
||||
- 'change_organization',
|
||||
'raise_decision',
|
||||
'list_agents',
|
||||
'inbox',
|
||||
'trail',
|
||||
'list_tasks',
|
||||
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/researcher/q132/packages/harness/tests/tools.test.mjs:36:10)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: [ 'send_message', 'launch', 'end_run', 'raise_decision', 'list_agents', 'inbox', 'trail', 'list_tasks', 'get_task' ],
|
||||
expected: [ 'send_message', 'launch', 'end_run', 'change_organization', 'raise_decision', 'list_agents', 'inbox', 'trail', 'list_tasks', 'get_task' ],
|
||||
operator: 'deepStrictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
|
||||
test at packages/harness/tests/tools.test.mjs:46:1
|
||||
✖ end_run sends role and reason, no decision; change_organization sends revision and the organization keys (2.164643ms)
|
||||
TypeError: Cannot read properties of undefined (reading 'verb')
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/researcher/q132/packages/harness/tests/tools.test.mjs:56:28)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
|
||||
|
||||
test at packages/harness/tests/tools.test.mjs:69:1
|
||||
✖ a role without role.end or organization.change gets neither tool, and each tool follows its own grant (6.251557ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
|
||||
+ []
|
||||
- [
|
||||
- 'change_organization'
|
||||
- ]
|
||||
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/researcher/q132/packages/harness/tests/tools.test.mjs:78:10)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: [],
|
||||
expected: [ 'change_organization' ],
|
||||
operator: 'deepStrictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
--- /mnt/storage/scratch/researcher/q132-out/.bak.LfOY8j/packages/harness/src/tools.mjs 2026-10-15 13:00:17.085705946 -0500
|
||||
+++ packages/harness/src/tools.mjs 2026-10-15 13:00:17.733244699 -0500
|
||||
@@ -143,7 +143,7 @@
|
||||
reason: str("Why the run ends, 1 to 500 characters", { minLength: 1, maxLength: 500 }),
|
||||
}, ["role", "reason"]));
|
||||
}
|
||||
- if (held.has("organization.change")) {
|
||||
+ if (false) {
|
||||
add("change_organization", "organization.set", "organization.change", "Change the organization file: the launch limits, the model table, and the model each instance runs. revision is the file's current revision; the broker refuses a stale one with revision-conflict. Send only the keys you change; each replaces what the file holds for it.", obj({
|
||||
revision: str("The organization file's current revision", { pattern: "^[a-f0-9]{64}$" }),
|
||||
limits: { type: "object", description: "The launch limits, replacing the file's launch limits" },
|
||||
@@ -0,0 +1 @@
|
||||
1
|
||||
@@ -0,0 +1,87 @@
|
||||
✔ sessionModel: agent vars win, then the system's execution settings (7.78262ms)
|
||||
✔ a pi bundle: prompt, policy, tools and manifest, 0600 in a 0700 directory (3.471265ms)
|
||||
✖ a chief-of-staff bundle lists launch among the bus tools and the manifest's typed tools (2.294109ms)
|
||||
✖ a chief-of-staff bundle lists end_run and change_organization as typed and nothing untyped, for either harness (2.097933ms)
|
||||
✔ the stop line names end_run for a role.end holder, and every other role keeps today's text (4.623817ms)
|
||||
✔ a claude-code bundle adds the wrapped gate hook and the MCP config (1.604849ms)
|
||||
✔ the prompt's built-in tools line is the harness's own names, as the manifest lists them (5.034276ms)
|
||||
✔ the prompt names the project clones in the workspace, and none when there are none (4.019481ms)
|
||||
✔ the prompt explains the review loop to a role with push_working, and reviews to one with fetch_review (4.861515ms)
|
||||
✔ a bundle is written once: an existing file refuses (1.116903ms)
|
||||
✔ a path with a single quote can't go into the hook command (1.027416ms)
|
||||
ℹ tests 11
|
||||
ℹ suites 0
|
||||
ℹ pass 9
|
||||
ℹ fail 2
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 105.549298
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/harness/tests/bundle.test.mjs:74:1
|
||||
✖ a chief-of-staff bundle lists launch among the bus tools and the manifest's typed tools (2.294109ms)
|
||||
AssertionError [ERR_ASSERTION]: The input did not match the regular expression /Bus tools: send_message, launch, end_run, change_organization, raise_decision, /. Input:
|
||||
|
||||
'# Contract\n' +
|
||||
'\n' +
|
||||
'Do the work.\n' +
|
||||
'\n' +
|
||||
'## This session\n' +
|
||||
'\n' +
|
||||
'- Business: acme. Role instance: chief (definition chief-of-staff). Run: run-1.\n' +
|
||||
'- Launched by: pm. Harness: pi, model claude-opus-5-5.\n' +
|
||||
'- Workspace: /mnt/storage/scratch/tmp/mosaic-harness-cSTp8E/ws. File tools work inside it only.\n' +
|
||||
'- Built-in tools: read, grep, find, ls.\n' +
|
||||
'- Bus tools: send_message, launch, end_run, raise_decision, list_agents, inbox, trail, list_tasks, get_task. The broker decides every call; a refusal names its reason.\n' +
|
||||
'- Each message to you arrives as one turn. Your final answer goes back to the sender as the reply, so end each turn with the answer itself.\n' +
|
||||
'- You never hold a token. You act on the tracker, the forge and other roles only through the bus tools.\n' +
|
||||
"- You end another role's run with end_run, naming the role instance and a reason of 1 to 500 characters; the reason is required and goes into the log. You can't end your own run or the assistant's. For anything the broker refuses, raise a role.revoke decision with blocking false and the role instance as target, naming the run and saying why; the human decides, and `mosaic stop` is theirs.\n" +
|
||||
'- Actions you hold that have no bus tool yet: organization.change. Say so instead of working around it.\n'
|
||||
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/researcher/q132/packages/harness/tests/bundle.test.mjs:79:10)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: "# Contract\n\nDo the work.\n\n## This session\n\n- Business: acme. Role instance: chief (definition chief-of-staff). Run: run-1.\n- Launched by: pm. Harness: pi, model claude-opus-5-5.\n- Workspace: /mnt/storage/scratch/tmp/mosaic-harness-cSTp8E/ws. File tools work inside it only.\n- Built-in tools: read, grep, find, ls.\n- Bus tools: send_message, launch, end_run, raise_decision, list_agents, inbox, trail, list_tasks, get_task. The broker decides every call; a refusal names its reason.\n- Each message to you arrives as one turn. Your final answer goes back to the sender as the reply, so end each turn with the answer itself.\n- You never hold a token. You act on the tracker, the forge and other roles only through the bus tools.\n- You end another role's run with end_run, naming the role instance and a reason of 1 to 500 characters; the reason is required and goes into the log. You can't end your own run or the assistant's. For anything the broker refuses, raise a role.revoke decision with blocking false and the role instance as target, naming the run and saying why; the human decides, and `mosaic stop` is theirs.\n- Actions you hold that have no bus tool yet: organization.change. Say so instead of working around it.\n",
|
||||
expected: /Bus tools: send_message, launch, end_run, change_organization, raise_decision, /,
|
||||
operator: 'match',
|
||||
diff: 'simple'
|
||||
}
|
||||
|
||||
test at packages/harness/tests/bundle.test.mjs:85:1
|
||||
✖ a chief-of-staff bundle lists end_run and change_organization as typed and nothing untyped, for either harness (2.097933ms)
|
||||
AssertionError [ERR_ASSERTION]: pi
|
||||
+ actual - expected
|
||||
|
||||
[
|
||||
'send_message',
|
||||
'launch',
|
||||
'end_run',
|
||||
- 'change_organization',
|
||||
'raise_decision',
|
||||
'list_agents',
|
||||
'inbox',
|
||||
'trail',
|
||||
'list_tasks',
|
||||
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/researcher/q132/packages/harness/tests/bundle.test.mjs:90:12)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: false,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: [ 'send_message', 'launch', 'end_run', 'raise_decision', 'list_agents', 'inbox', 'trail', 'list_tasks', 'get_task' ],
|
||||
expected: [ 'send_message', 'launch', 'end_run', 'change_organization', 'raise_decision', 'list_agents', 'inbox', 'trail', 'list_tasks', 'get_task' ],
|
||||
operator: 'deepStrictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
--- /mnt/storage/scratch/researcher/q132-out/.bak.LfOY8j/packages/harness/src/tools.mjs 2026-10-15 13:00:17.085705946 -0500
|
||||
+++ packages/harness/src/tools.mjs 2026-10-15 13:00:17.888246578 -0500
|
||||
@@ -143,7 +143,7 @@
|
||||
reason: str("Why the run ends, 1 to 500 characters", { minLength: 1, maxLength: 500 }),
|
||||
}, ["role", "reason"]));
|
||||
}
|
||||
- if (held.has("organization.change")) {
|
||||
+ if (false) {
|
||||
add("change_organization", "organization.set", "organization.change", "Change the organization file: the launch limits, the model table, and the model each instance runs. revision is the file's current revision; the broker refuses a stale one with revision-conflict. Send only the keys you change; each replaces what the file holds for it.", obj({
|
||||
revision: str("The organization file's current revision", { pattern: "^[a-f0-9]{64}$" }),
|
||||
limits: { type: "object", description: "The launch limits, replacing the file's launch limits" },
|
||||
@@ -0,0 +1 @@
|
||||
1
|
||||
@@ -0,0 +1,52 @@
|
||||
✔ the PM gets its task verbs and the reads, and no launch (5.771621ms)
|
||||
✔ the chief of staff gets launch, send_message, end_run and change_organization, and no task verbs (1.694601ms)
|
||||
✖ end_run sends role and reason, no decision; change_organization sends revision and the organization keys (2.665289ms)
|
||||
✔ the organization keys change_organization takes are the broker's ORGANIZATION_KEYS (0.10846ms)
|
||||
✔ a role without role.end or organization.change gets neither tool, and each tool follows its own grant (6.162377ms)
|
||||
✔ the assistant gets send_message and the reads, no launch (1.104626ms)
|
||||
✔ list_requirements reads the requirement ids, for a task.create holder with a tracker (1.830296ms)
|
||||
✔ a coder gets no launch, no resolve_decision, and no task tools without a tracker (0.786449ms)
|
||||
✔ a coder with a tracker gets its own task tools and no task_reassign (0.746836ms)
|
||||
✔ launch only when the business's launch block names the instance as launcher (1.470312ms)
|
||||
✔ an action outside the instance's authority has no tool (0.881529ms)
|
||||
✔ the review loop: push_working and request_review for the coder, fetch_review and review_verdict for the reviewer, none for the PM (3.357433ms)
|
||||
✔ callTool: one JSON line out, the result back, a refusal rejects (8.483571ms)
|
||||
✔ list_tasks takes the broker's filters and pages; get_task takes a task_ref (1.948862ms)
|
||||
✔ callTool sends list_tasks done false unless the session names done; other tools as given (1.914049ms)
|
||||
✔ replyText: compact JSON up to the cap, an error naming the size and the cap over it (0.526371ms)
|
||||
ℹ tests 16
|
||||
ℹ suites 0
|
||||
ℹ pass 15
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 107.717847
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/harness/tests/tools.test.mjs:46:1
|
||||
✖ end_run sends role and reason, no decision; change_organization sends revision and the organization keys (2.665289ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
|
||||
[
|
||||
- 'role.revoke',
|
||||
'role.end',
|
||||
+ 'role.end'
|
||||
]
|
||||
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/researcher/q132/packages/harness/tests/tools.test.mjs:49:10)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: [ 'role.end', 'role.end' ],
|
||||
expected: [ 'role.revoke', 'role.end' ],
|
||||
operator: 'deepStrictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
--- /mnt/storage/scratch/researcher/q132-out/.bak.LfOY8j/packages/harness/src/tools.mjs 2026-10-15 13:00:17.085705946 -0500
|
||||
+++ packages/harness/src/tools.mjs 2026-10-15 13:00:18.043248457 -0500
|
||||
@@ -138,7 +138,7 @@
|
||||
// Row 132 (#1628, REQ-ROLE-2, REQ-COS-1, REQ-LIMIT-1): the chief of staff's two grants from row 123.
|
||||
// end_run sends `reason` and never a decision; the broker refuses the caller's own run and the assistant's.
|
||||
if (held.has("role.end")) {
|
||||
- add("end_run", "role.revoke", "role.end", "End another role's run. A reason is required, 1 to 500 characters, and goes into the log. You can't end your own run or the assistant's; the broker refuses with role-end-refused.", obj({
|
||||
+ add("end_run", "role.end", "role.end", "End another role's run. A reason is required, 1 to 500 characters, and goes into the log. You can't end your own run or the assistant's; the broker refuses with role-end-refused.", obj({
|
||||
role: str("Role instance whose run to end"),
|
||||
reason: str("Why the run ends, 1 to 500 characters", { minLength: 1, maxLength: 500 }),
|
||||
}, ["role", "reason"]));
|
||||
@@ -0,0 +1 @@
|
||||
1
|
||||
@@ -0,0 +1,61 @@
|
||||
✔ founderCheck: founder variables, then a needed service without a usable token (0.960325ms)
|
||||
✔ turnRequest names the sender, class, reply and decision (0.153296ms)
|
||||
✔ turnRequest says a tester's message is a test and never Jason's instruction (0.162326ms)
|
||||
✔ turnRequest shows the message's own sent time, a day old as well as new (0.110028ms)
|
||||
✔ stateBlock names the launch state with its time and event, and the open tasks with the cap (0.25828ms)
|
||||
✔ a message becomes a turn, the answer goes back as a RESULT, SIGTERM releases and exits 0 (149.017748ms)
|
||||
✔ launches revoked and then restored: the turn's block reads allowed and gives the restore time (189.711075ms)
|
||||
✔ a task closed on the tracker is missing from the next turn's open list (202.918968ms)
|
||||
✔ a message read a day after it was sent shows the time it was sent (115.643908ms)
|
||||
✔ a decision the human resolves becomes a turn citing the decision and the answer (167.195246ms)
|
||||
✔ a failed state read fails the turn: no adapter runs, the sender hears why, the message is read (91.553191ms)
|
||||
✔ a SIGTERM before the claim stops the runner with exit 0 and no claim (58.405923ms)
|
||||
✔ typed tools carry the runner's capability; launch goes to the host's launch socket (276.987049ms)
|
||||
✖ end_run and change_organization reach the broker with the tool's arguments, and refusals keep their codes (252.027018ms)
|
||||
✔ a RESULT gets no automatic reply; failed turns reply with the reason (1163.175711ms)
|
||||
✔ SIGTERM during a turn kills the turn's process group and still exits 0 (91.803331ms)
|
||||
✔ founder credentials stop before the claim (20) (95.435606ms)
|
||||
✔ a refused claim exits 21; an ended run's capability exits 22 (93.2682ms)
|
||||
✔ the launch ending under a running session exits 22 (100.151266ms)
|
||||
✔ a broker that stays unreachable exits 23 after brokerRetries polls (200.524538ms)
|
||||
✔ a broker that is down at the claim exits 23, not 21 (47.439387ms)
|
||||
✔ no capability, or a malformed one, on stdin exits 2 (152.260739ms)
|
||||
✔ a missing or malformed policy exits 2 before the claim (81.702638ms)
|
||||
ℹ tests 23
|
||||
ℹ suites 0
|
||||
ℹ pass 22
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 10860.266516
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/harness/tests/runner.test.mjs:377:1
|
||||
✖ end_run and change_organization reach the broker with the tool's arguments, and refusals keep their codes (252.027018ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
|
||||
[
|
||||
+ 'refused: unknown-verb',
|
||||
+ 'refused: unknown-verb',
|
||||
+ 'refused: unknown-verb',
|
||||
- '{"revoked":true}',
|
||||
- 'refused: role-end-refused',
|
||||
- 'refused: role-end-refused',
|
||||
'{"revision":"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"}',
|
||||
'refused: invalid-request',
|
||||
'refused: revision-conflict'
|
||||
]
|
||||
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/researcher/q132/packages/harness/tests/runner.test.mjs:400:10)
|
||||
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: [ 'refused: unknown-verb', 'refused: unknown-verb', 'refused: unknown-verb', '{"revision":"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"}', 'refused: invalid-request', 'refused: revision-conflict' ],
|
||||
expected: [ '{"revoked":true}', 'refused: role-end-refused', 'refused: role-end-refused', '{"revision":"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"}', 'refused: invalid-request', 'refused: revision-conflict' ],
|
||||
operator: 'deepStrictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
--- /mnt/storage/scratch/researcher/q132-out/.bak.LfOY8j/packages/harness/src/tools.mjs 2026-10-15 13:00:17.085705946 -0500
|
||||
+++ packages/harness/src/tools.mjs 2026-10-15 13:00:18.203250396 -0500
|
||||
@@ -138,7 +138,7 @@
|
||||
// Row 132 (#1628, REQ-ROLE-2, REQ-COS-1, REQ-LIMIT-1): the chief of staff's two grants from row 123.
|
||||
// end_run sends `reason` and never a decision; the broker refuses the caller's own run and the assistant's.
|
||||
if (held.has("role.end")) {
|
||||
- add("end_run", "role.revoke", "role.end", "End another role's run. A reason is required, 1 to 500 characters, and goes into the log. You can't end your own run or the assistant's; the broker refuses with role-end-refused.", obj({
|
||||
+ add("end_run", "role.end", "role.end", "End another role's run. A reason is required, 1 to 500 characters, and goes into the log. You can't end your own run or the assistant's; the broker refuses with role-end-refused.", obj({
|
||||
role: str("Role instance whose run to end"),
|
||||
reason: str("Why the run ends, 1 to 500 characters", { minLength: 1, maxLength: 500 }),
|
||||
}, ["role", "reason"]));
|
||||
@@ -0,0 +1 @@
|
||||
1
|
||||
@@ -0,0 +1,77 @@
|
||||
✔ the PM gets its task verbs and the reads, and no launch (6.488529ms)
|
||||
✖ the chief of staff gets launch, send_message, end_run and change_organization, and no task verbs (3.703285ms)
|
||||
✖ end_run sends role and reason, no decision; change_organization sends revision and the organization keys (2.782728ms)
|
||||
✔ the organization keys change_organization takes are the broker's ORGANIZATION_KEYS (0.106468ms)
|
||||
✔ a role without role.end or organization.change gets neither tool, and each tool follows its own grant (6.662341ms)
|
||||
✔ the assistant gets send_message and the reads, no launch (1.782875ms)
|
||||
✔ list_requirements reads the requirement ids, for a task.create holder with a tracker (2.071001ms)
|
||||
✔ a coder gets no launch, no resolve_decision, and no task tools without a tracker (0.868152ms)
|
||||
✔ a coder with a tracker gets its own task tools and no task_reassign (0.78004ms)
|
||||
✔ launch only when the business's launch block names the instance as launcher (1.594916ms)
|
||||
✔ an action outside the instance's authority has no tool (1.107267ms)
|
||||
✔ the review loop: push_working and request_review for the coder, fetch_review and review_verdict for the reviewer, none for the PM (4.148813ms)
|
||||
✔ callTool: one JSON line out, the result back, a refusal rejects (9.146787ms)
|
||||
✔ list_tasks takes the broker's filters and pages; get_task takes a task_ref (1.916143ms)
|
||||
✔ callTool sends list_tasks done false unless the session names done; other tools as given (1.949338ms)
|
||||
✔ replyText: compact JSON up to the cap, an error naming the size and the cap over it (0.497898ms)
|
||||
ℹ tests 16
|
||||
ℹ suites 0
|
||||
ℹ pass 14
|
||||
ℹ fail 2
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 117.236828
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/harness/tests/tools.test.mjs:33:1
|
||||
✖ the chief of staff gets launch, send_message, end_run and change_organization, and no task verbs (3.703285ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
|
||||
+ [
|
||||
+ 'role.end'
|
||||
+ ]
|
||||
- []
|
||||
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/researcher/q132/packages/harness/tests/tools.test.mjs:42:10)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: [ 'role.end' ],
|
||||
expected: [],
|
||||
operator: 'deepStrictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
|
||||
test at packages/harness/tests/tools.test.mjs:46:1
|
||||
✖ end_run sends role and reason, no decision; change_organization sends revision and the organization keys (2.782728ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
|
||||
[
|
||||
'role.revoke',
|
||||
+ null
|
||||
- 'role.end'
|
||||
]
|
||||
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/researcher/q132/packages/harness/tests/tools.test.mjs:49:10)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: [ 'role.revoke', null ],
|
||||
expected: [ 'role.revoke', 'role.end' ],
|
||||
operator: 'deepStrictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
--- /mnt/storage/scratch/researcher/q132-out/.bak.LfOY8j/packages/harness/src/tools.mjs 2026-10-15 13:00:17.085705946 -0500
|
||||
+++ packages/harness/src/tools.mjs 2026-10-15 13:00:29.121353116 -0500
|
||||
@@ -138,7 +138,7 @@
|
||||
// Row 132 (#1628, REQ-ROLE-2, REQ-COS-1, REQ-LIMIT-1): the chief of staff's two grants from row 123.
|
||||
// end_run sends `reason` and never a decision; the broker refuses the caller's own run and the assistant's.
|
||||
if (held.has("role.end")) {
|
||||
- add("end_run", "role.revoke", "role.end", "End another role's run. A reason is required, 1 to 500 characters, and goes into the log. You can't end your own run or the assistant's; the broker refuses with role-end-refused.", obj({
|
||||
+ add("end_run", "role.revoke", null, "End another role's run. A reason is required, 1 to 500 characters, and goes into the log. You can't end your own run or the assistant's; the broker refuses with role-end-refused.", obj({
|
||||
role: str("Role instance whose run to end"),
|
||||
reason: str("Why the run ends, 1 to 500 characters", { minLength: 1, maxLength: 500 }),
|
||||
}, ["role", "reason"]));
|
||||
@@ -0,0 +1 @@
|
||||
1
|
||||
@@ -0,0 +1,52 @@
|
||||
✔ the PM gets its task verbs and the reads, and no launch (5.996464ms)
|
||||
✔ the chief of staff gets launch, send_message, end_run and change_organization, and no task verbs (1.676175ms)
|
||||
✖ end_run sends role and reason, no decision; change_organization sends revision and the organization keys (2.671722ms)
|
||||
✔ the organization keys change_organization takes are the broker's ORGANIZATION_KEYS (0.102163ms)
|
||||
✔ a role without role.end or organization.change gets neither tool, and each tool follows its own grant (5.795244ms)
|
||||
✔ the assistant gets send_message and the reads, no launch (1.452641ms)
|
||||
✔ list_requirements reads the requirement ids, for a task.create holder with a tracker (1.7074ms)
|
||||
✔ a coder gets no launch, no resolve_decision, and no task tools without a tracker (0.783909ms)
|
||||
✔ a coder with a tracker gets its own task tools and no task_reassign (0.73755ms)
|
||||
✔ launch only when the business's launch block names the instance as launcher (1.417305ms)
|
||||
✔ an action outside the instance's authority has no tool (0.914713ms)
|
||||
✔ the review loop: push_working and request_review for the coder, fetch_review and review_verdict for the reviewer, none for the PM (3.392769ms)
|
||||
✔ callTool: one JSON line out, the result back, a refusal rejects (8.531528ms)
|
||||
✔ list_tasks takes the broker's filters and pages; get_task takes a task_ref (1.800801ms)
|
||||
✔ callTool sends list_tasks done false unless the session names done; other tools as given (1.999814ms)
|
||||
✔ replyText: compact JSON up to the cap, an error naming the size and the cap over it (0.506282ms)
|
||||
ℹ tests 16
|
||||
ℹ suites 0
|
||||
ℹ pass 15
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 108.014649
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/harness/tests/tools.test.mjs:46:1
|
||||
✖ end_run sends role and reason, no decision; change_organization sends revision and the organization keys (2.671722ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
|
||||
[
|
||||
+ 'limits.set',
|
||||
- 'organization.set',
|
||||
'organization.change'
|
||||
]
|
||||
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/researcher/q132/packages/harness/tests/tools.test.mjs:56:10)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: [ 'limits.set', 'organization.change' ],
|
||||
expected: [ 'organization.set', 'organization.change' ],
|
||||
operator: 'deepStrictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
--- /mnt/storage/scratch/researcher/q132-out/.bak.LfOY8j/packages/harness/src/tools.mjs 2026-10-15 13:00:17.085705946 -0500
|
||||
+++ packages/harness/src/tools.mjs 2026-10-15 13:00:29.299354016 -0500
|
||||
@@ -144,7 +144,7 @@
|
||||
}, ["role", "reason"]));
|
||||
}
|
||||
if (held.has("organization.change")) {
|
||||
- add("change_organization", "organization.set", "organization.change", "Change the organization file: the launch limits, the model table, and the model each instance runs. revision is the file's current revision; the broker refuses a stale one with revision-conflict. Send only the keys you change; each replaces what the file holds for it.", obj({
|
||||
+ add("change_organization", "limits.set", "organization.change", "Change the organization file: the launch limits, the model table, and the model each instance runs. revision is the file's current revision; the broker refuses a stale one with revision-conflict. Send only the keys you change; each replaces what the file holds for it.", obj({
|
||||
revision: str("The organization file's current revision", { pattern: "^[a-f0-9]{64}$" }),
|
||||
limits: { type: "object", description: "The launch limits, replacing the file's launch limits" },
|
||||
models: { type: "object", description: "The model table, replacing the file's model table" },
|
||||
@@ -0,0 +1 @@
|
||||
1
|
||||
@@ -0,0 +1,61 @@
|
||||
✔ founderCheck: founder variables, then a needed service without a usable token (1.017213ms)
|
||||
✔ turnRequest names the sender, class, reply and decision (0.175446ms)
|
||||
✔ turnRequest says a tester's message is a test and never Jason's instruction (0.207935ms)
|
||||
✔ turnRequest shows the message's own sent time, a day old as well as new (0.123793ms)
|
||||
✔ stateBlock names the launch state with its time and event, and the open tasks with the cap (0.207987ms)
|
||||
✔ a message becomes a turn, the answer goes back as a RESULT, SIGTERM releases and exits 0 (178.753313ms)
|
||||
✔ launches revoked and then restored: the turn's block reads allowed and gives the restore time (142.936532ms)
|
||||
✔ a task closed on the tracker is missing from the next turn's open list (194.551043ms)
|
||||
✔ a message read a day after it was sent shows the time it was sent (90.860626ms)
|
||||
✔ a decision the human resolves becomes a turn citing the decision and the answer (171.037185ms)
|
||||
✔ a failed state read fails the turn: no adapter runs, the sender hears why, the message is read (63.410516ms)
|
||||
✔ a SIGTERM before the claim stops the runner with exit 0 and no claim (51.176197ms)
|
||||
✔ typed tools carry the runner's capability; launch goes to the host's launch socket (272.554937ms)
|
||||
✖ end_run and change_organization reach the broker with the tool's arguments, and refusals keep their codes (253.722901ms)
|
||||
✔ a RESULT gets no automatic reply; failed turns reply with the reason (1220.897531ms)
|
||||
✔ SIGTERM during a turn kills the turn's process group and still exits 0 (94.429499ms)
|
||||
✔ founder credentials stop before the claim (20) (99.656276ms)
|
||||
✔ a refused claim exits 21; an ended run's capability exits 22 (103.587788ms)
|
||||
✔ the launch ending under a running session exits 22 (97.271889ms)
|
||||
✔ a broker that stays unreachable exits 23 after brokerRetries polls (197.820455ms)
|
||||
✔ a broker that is down at the claim exits 23, not 21 (43.407394ms)
|
||||
✔ no capability, or a malformed one, on stdin exits 2 (148.056619ms)
|
||||
✔ a missing or malformed policy exits 2 before the claim (81.198353ms)
|
||||
ℹ tests 23
|
||||
ℹ suites 0
|
||||
ℹ pass 22
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 10903.715994
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/harness/tests/runner.test.mjs:377:1
|
||||
✖ end_run and change_organization reach the broker with the tool's arguments, and refusals keep their codes (253.722901ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
|
||||
[
|
||||
'{"revoked":true}',
|
||||
'refused: role-end-refused',
|
||||
'refused: role-end-refused',
|
||||
+ 'refused: human-required',
|
||||
+ 'refused: human-required',
|
||||
+ 'refused: human-required'
|
||||
- '{"revision":"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"}',
|
||||
- 'refused: invalid-request',
|
||||
- 'refused: revision-conflict'
|
||||
]
|
||||
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/researcher/q132/packages/harness/tests/runner.test.mjs:400:10)
|
||||
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: [ '{"revoked":true}', 'refused: role-end-refused', 'refused: role-end-refused', 'refused: human-required', 'refused: human-required', 'refused: human-required' ],
|
||||
expected: [ '{"revoked":true}', 'refused: role-end-refused', 'refused: role-end-refused', '{"revision":"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"}', 'refused: invalid-request', 'refused: revision-conflict' ],
|
||||
operator: 'deepStrictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
--- /mnt/storage/scratch/researcher/q132-out/.bak.LfOY8j/packages/harness/src/tools.mjs 2026-10-15 13:00:17.085705946 -0500
|
||||
+++ packages/harness/src/tools.mjs 2026-10-15 13:00:29.473354896 -0500
|
||||
@@ -144,7 +144,7 @@
|
||||
}, ["role", "reason"]));
|
||||
}
|
||||
if (held.has("organization.change")) {
|
||||
- add("change_organization", "organization.set", "organization.change", "Change the organization file: the launch limits, the model table, and the model each instance runs. revision is the file's current revision; the broker refuses a stale one with revision-conflict. Send only the keys you change; each replaces what the file holds for it.", obj({
|
||||
+ add("change_organization", "limits.set", "organization.change", "Change the organization file: the launch limits, the model table, and the model each instance runs. revision is the file's current revision; the broker refuses a stale one with revision-conflict. Send only the keys you change; each replaces what the file holds for it.", obj({
|
||||
revision: str("The organization file's current revision", { pattern: "^[a-f0-9]{64}$" }),
|
||||
limits: { type: "object", description: "The launch limits, replacing the file's launch limits" },
|
||||
models: { type: "object", description: "The model table, replacing the file's model table" },
|
||||
@@ -0,0 +1 @@
|
||||
1
|
||||
@@ -0,0 +1,77 @@
|
||||
✔ the PM gets its task verbs and the reads, and no launch (6.481758ms)
|
||||
✖ the chief of staff gets launch, send_message, end_run and change_organization, and no task verbs (2.689039ms)
|
||||
✖ end_run sends role and reason, no decision; change_organization sends revision and the organization keys (2.189359ms)
|
||||
✔ the organization keys change_organization takes are the broker's ORGANIZATION_KEYS (0.103535ms)
|
||||
✔ a role without role.end or organization.change gets neither tool, and each tool follows its own grant (6.704951ms)
|
||||
✔ the assistant gets send_message and the reads, no launch (1.200004ms)
|
||||
✔ list_requirements reads the requirement ids, for a task.create holder with a tracker (1.926665ms)
|
||||
✔ a coder gets no launch, no resolve_decision, and no task tools without a tracker (0.870062ms)
|
||||
✔ a coder with a tracker gets its own task tools and no task_reassign (0.813834ms)
|
||||
✔ launch only when the business's launch block names the instance as launcher (1.589153ms)
|
||||
✔ an action outside the instance's authority has no tool (1.00398ms)
|
||||
✔ the review loop: push_working and request_review for the coder, fetch_review and review_verdict for the reviewer, none for the PM (3.836947ms)
|
||||
✔ callTool: one JSON line out, the result back, a refusal rejects (10.061382ms)
|
||||
✔ list_tasks takes the broker's filters and pages; get_task takes a task_ref (2.089882ms)
|
||||
✔ callTool sends list_tasks done false unless the session names done; other tools as given (3.085854ms)
|
||||
✔ replyText: compact JSON up to the cap, an error naming the size and the cap over it (0.944171ms)
|
||||
ℹ tests 16
|
||||
ℹ suites 0
|
||||
ℹ pass 14
|
||||
ℹ fail 2
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 119.403104
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/harness/tests/tools.test.mjs:33:1
|
||||
✖ the chief of staff gets launch, send_message, end_run and change_organization, and no task verbs (2.689039ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
|
||||
+ [
|
||||
+ 'organization.change'
|
||||
+ ]
|
||||
- []
|
||||
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/researcher/q132/packages/harness/tests/tools.test.mjs:42:10)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: [ 'organization.change' ],
|
||||
expected: [],
|
||||
operator: 'deepStrictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
|
||||
test at packages/harness/tests/tools.test.mjs:46:1
|
||||
✖ end_run sends role and reason, no decision; change_organization sends revision and the organization keys (2.189359ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
|
||||
[
|
||||
'organization.set',
|
||||
+ null
|
||||
- 'organization.change'
|
||||
]
|
||||
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/researcher/q132/packages/harness/tests/tools.test.mjs:56:10)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: [ 'organization.set', null ],
|
||||
expected: [ 'organization.set', 'organization.change' ],
|
||||
operator: 'deepStrictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
--- /mnt/storage/scratch/researcher/q132-out/.bak.LfOY8j/packages/harness/src/tools.mjs 2026-10-15 13:00:17.085705946 -0500
|
||||
+++ packages/harness/src/tools.mjs 2026-10-15 13:00:40.431411087 -0500
|
||||
@@ -144,7 +144,7 @@
|
||||
}, ["role", "reason"]));
|
||||
}
|
||||
if (held.has("organization.change")) {
|
||||
- add("change_organization", "organization.set", "organization.change", "Change the organization file: the launch limits, the model table, and the model each instance runs. revision is the file's current revision; the broker refuses a stale one with revision-conflict. Send only the keys you change; each replaces what the file holds for it.", obj({
|
||||
+ add("change_organization", "organization.set", null, "Change the organization file: the launch limits, the model table, and the model each instance runs. revision is the file's current revision; the broker refuses a stale one with revision-conflict. Send only the keys you change; each replaces what the file holds for it.", obj({
|
||||
revision: str("The organization file's current revision", { pattern: "^[a-f0-9]{64}$" }),
|
||||
limits: { type: "object", description: "The launch limits, replacing the file's launch limits" },
|
||||
models: { type: "object", description: "The model table, replacing the file's model table" },
|
||||
@@ -0,0 +1 @@
|
||||
1
|
||||
@@ -0,0 +1,51 @@
|
||||
✔ the PM gets its task verbs and the reads, and no launch (5.731157ms)
|
||||
✔ the chief of staff gets launch, send_message, end_run and change_organization, and no task verbs (1.68333ms)
|
||||
✖ end_run sends role and reason, no decision; change_organization sends revision and the organization keys (2.566129ms)
|
||||
✔ the organization keys change_organization takes are the broker's ORGANIZATION_KEYS (0.10445ms)
|
||||
✔ a role without role.end or organization.change gets neither tool, and each tool follows its own grant (6.632927ms)
|
||||
✔ the assistant gets send_message and the reads, no launch (1.787074ms)
|
||||
✔ list_requirements reads the requirement ids, for a task.create holder with a tracker (1.886825ms)
|
||||
✔ a coder gets no launch, no resolve_decision, and no task tools without a tracker (0.808539ms)
|
||||
✔ a coder with a tracker gets its own task tools and no task_reassign (0.74031ms)
|
||||
✔ launch only when the business's launch block names the instance as launcher (1.422607ms)
|
||||
✔ an action outside the instance's authority has no tool (0.828825ms)
|
||||
✔ the review loop: push_working and request_review for the coder, fetch_review and review_verdict for the reviewer, none for the PM (3.374584ms)
|
||||
✔ callTool: one JSON line out, the result back, a refusal rejects (8.293352ms)
|
||||
✔ list_tasks takes the broker's filters and pages; get_task takes a task_ref (1.801168ms)
|
||||
✔ callTool sends list_tasks done false unless the session names done; other tools as given (1.818121ms)
|
||||
✔ replyText: compact JSON up to the cap, an error naming the size and the cap over it (0.47805ms)
|
||||
ℹ tests 16
|
||||
ℹ suites 0
|
||||
ℹ pass 15
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 111.150895
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/harness/tests/tools.test.mjs:46:1
|
||||
✖ end_run sends role and reason, no decision; change_organization sends revision and the organization keys (2.566129ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
|
||||
[
|
||||
'role',
|
||||
- 'reason'
|
||||
]
|
||||
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/researcher/q132/packages/harness/tests/tools.test.mjs:51:10)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: [ 'role' ],
|
||||
expected: [ 'role', 'reason' ],
|
||||
operator: 'deepStrictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
--- /mnt/storage/scratch/researcher/q132-out/.bak.LfOY8j/packages/harness/src/tools.mjs 2026-10-15 13:00:17.085705946 -0500
|
||||
+++ packages/harness/src/tools.mjs 2026-10-15 13:00:40.608412007 -0500
|
||||
@@ -141,7 +141,7 @@
|
||||
add("end_run", "role.revoke", "role.end", "End another role's run. A reason is required, 1 to 500 characters, and goes into the log. You can't end your own run or the assistant's; the broker refuses with role-end-refused.", obj({
|
||||
role: str("Role instance whose run to end"),
|
||||
reason: str("Why the run ends, 1 to 500 characters", { minLength: 1, maxLength: 500 }),
|
||||
- }, ["role", "reason"]));
|
||||
+ }, ["role"]));
|
||||
}
|
||||
if (held.has("organization.change")) {
|
||||
add("change_organization", "organization.set", "organization.change", "Change the organization file: the launch limits, the model table, and the model each instance runs. revision is the file's current revision; the broker refuses a stale one with revision-conflict. Send only the keys you change; each replaces what the file holds for it.", obj({
|
||||
@@ -0,0 +1 @@
|
||||
1
|
||||
@@ -0,0 +1,111 @@
|
||||
ed50d8781e01ee03601ba053ab12d6ead05c2991d324ce145930e6a1b7d90dc5 build.md
|
||||
ba644f8d97cfa88175fe0157d9f77523cee7e5821ddbd676b29aae46fa73cf07 candidate-manifest.sha256
|
||||
31b6644a72cbb20cb965a03822103e1117e8526b57ee9ba905312c9cab301697 changed-paths.txt
|
||||
3aec16101f2a480ac9c4a0251be2f4446710c019caa8738bb3d921ce713ec343 gate-finished.txt
|
||||
01136ab275bc7295230e4c063743f627c0f7c0a96729c23477bd2c51986b9d3b gate-started.txt
|
||||
59cca5b56598b6bdfb32db1ee542feb6a4d3e16e187105d1e4153f244930939c mutants/control-bundle.out
|
||||
9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa mutants/control-bundle.rc
|
||||
2bf36b49ae2b7eb5123403122d782320b54f01829500ddbbe60fb096b7dd48de mutants/control-runner.out
|
||||
9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa mutants/control-runner.rc
|
||||
18690876856823f2c71ddefbdd079ef82170d6727aa6b2c140254749bdd696e2 mutants/control-tools.out
|
||||
9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa mutants/control-tools.rc
|
||||
b15e3e7b819e9f57c6c5c2ed4eeefa3b98c8692ba7f3f840c5306e8c8713641e mutants-finished.txt
|
||||
568cda1efa1045dd02e962850690de7f136bd584e293d383c2fad628e3191699 mutants/m10-end-run-decision.out
|
||||
d9c3976361da4f8eb8f1bdb7f2aa780391fa0ac1221c5175509b1ad74f441865 mutants/m10-end-run-decision.patch
|
||||
4355a46b19d348dc2f57c046f8ef63d4538ebb936000f3c9ee954a27460dd865 mutants/m10-end-run-decision.rc
|
||||
7f5ab07d743fe67ef88ec4fa89ffead9f938db39c6bafab9a13f4f63befb7cb4 mutants/m11-reason-unbounded.out
|
||||
65b8e6cff54daa3b89ad02afc4377d41c905f026f47531a447842e26ace6278a mutants/m11-reason-unbounded.patch
|
||||
4355a46b19d348dc2f57c046f8ef63d4538ebb936000f3c9ee954a27460dd865 mutants/m11-reason-unbounded.rc
|
||||
c14ab6cf205c9e050179ce6ed09f07dc4fdd8b7ac4827ea9af99ee3a0e7fc1b1 mutants/m12-revision-optional.out
|
||||
223bee9975fa3c17516ffce7c2e59a4af8ca0ed371c1cb204e00672f54e9f673 mutants/m12-revision-optional.patch
|
||||
4355a46b19d348dc2f57c046f8ef63d4538ebb936000f3c9ee954a27460dd865 mutants/m12-revision-optional.rc
|
||||
be3c12950d137a6032bc95dcc0280566aec3119b3da0bdbc07468c66bc8a18b1 mutants/m13-revision-pattern.out
|
||||
3f57a692ea357a0386841de8c0aac50fa53f8e82ce6d50f07995e682386afe42 mutants/m13-revision-pattern.patch
|
||||
4355a46b19d348dc2f57c046f8ef63d4538ebb936000f3c9ee954a27460dd865 mutants/m13-revision-pattern.rc
|
||||
2e05c01a0c16eaca65b64d3416c6d77df8f10a0e6b6b13ce2bdf73384cd21d4e mutants/m14-description-limits.out
|
||||
209e7260bc13b5f628256438ce714f3f559ad2aa6382d33b048dbf98d0107fdd mutants/m14-description-limits.patch
|
||||
4355a46b19d348dc2f57c046f8ef63d4538ebb936000f3c9ee954a27460dd865 mutants/m14-description-limits.rc
|
||||
3d14ead02b74d2eb81e77d2cb010e75649999d72e7e94474fc6c990970324745 mutants/m15-harness-key-dropped.out
|
||||
c36577ac92b2b084471f0a8ce028be184e9d4f822b5b0e2aeec8013add5c9acb mutants/m15-harness-key-dropped.patch
|
||||
4355a46b19d348dc2f57c046f8ef63d4538ebb936000f3c9ee954a27460dd865 mutants/m15-harness-key-dropped.rc
|
||||
2247f7728780d761dae7ea6f93ddf010b72c9709e27a9c2a3111c0202e25a903 mutants/m16-broker-key-added.out
|
||||
022bfe093d64e7a2f506af79dd1731fe728258317e1e72d48704f2a0109f509f mutants/m16-broker-key-added.patch
|
||||
4355a46b19d348dc2f57c046f8ef63d4538ebb936000f3c9ee954a27460dd865 mutants/m16-broker-key-added.rc
|
||||
ea2b43d58ecd0554e51ba84912ddd7d0124058e45e39226c16a4f37f12536009 mutants/m17-bundle-text-unchanged.out
|
||||
f6e1f3623075a6ece02486cd34f0d4a541eb4a757ed9caa6dcf0a527eb73af43 mutants/m17-bundle-text-unchanged.patch
|
||||
4355a46b19d348dc2f57c046f8ef63d4538ebb936000f3c9ee954a27460dd865 mutants/m17-bundle-text-unchanged.rc
|
||||
5a5ea8cf7a3ce77b7eb48d0c7c7acd6d7528445a171b6b3dd10b58f1145aec64 mutants/m18-bundle-text-for-all.out
|
||||
c5e3e964f77ca846ce0d6b5c133b13d808c35681f7dbc8d3d84fbbe3e8f75614 mutants/m18-bundle-text-for-all.patch
|
||||
4355a46b19d348dc2f57c046f8ef63d4538ebb936000f3c9ee954a27460dd865 mutants/m18-bundle-text-for-all.rc
|
||||
c93d35010b715f53688ee88a9c9a62d72dfc4209e690b190c9d03659936c8092 mutants/m19-text-reason.out
|
||||
f437d428b975e5e4e4b725650eaf90c4af09c32621b543d30832ef0e55fb72c4 mutants/m19-text-reason.patch
|
||||
4355a46b19d348dc2f57c046f8ef63d4538ebb936000f3c9ee954a27460dd865 mutants/m19-text-reason.rc
|
||||
cd1a498d6a1b5e5d69469aa36f3e521c0b5c1c5cf22686ee5570a21ccbd90b91 mutants/m1-end-run-always.out
|
||||
a70153d626d37b533ca03b64540e694d29882e681706d465895b98a01ec43e1b mutants/m1-end-run-always.patch
|
||||
4355a46b19d348dc2f57c046f8ef63d4538ebb936000f3c9ee954a27460dd865 mutants/m1-end-run-always.rc
|
||||
cdbd5893341492ae1aa94a2d4d4f1442da0d11f32b6c708777bb0200a66941db mutants/m20-text-limits.out
|
||||
5b51b61b127cd0ba0b90e3bfaa6fdf782c2231b97676364f70b39d2d45c91ee5 mutants/m20-text-limits.patch
|
||||
4355a46b19d348dc2f57c046f8ef63d4538ebb936000f3c9ee954a27460dd865 mutants/m20-text-limits.rc
|
||||
29aa20b8c5720a4161d37f5792b43fba9e7e666411059c6a0c287a693f752bd0 mutants/m21-text-fallback.out
|
||||
5506fc412471df0f858d7bd63b32a974dfd335690958e6c246075c51381a1796 mutants/m21-text-fallback.patch
|
||||
4355a46b19d348dc2f57c046f8ef63d4538ebb936000f3c9ee954a27460dd865 mutants/m21-text-fallback.rc
|
||||
6b5134bed93537689ba9083c49586dcf60a5e3fdb15263276a8d417a47d786b4 mutants/m22-runner-drops-args.out
|
||||
2eebd1bb0e1e0e2e6ff507f7de0939e86b75eb523f0452fc8129e5f00eb037b3 mutants/m22-runner-drops-args.patch
|
||||
4355a46b19d348dc2f57c046f8ef63d4538ebb936000f3c9ee954a27460dd865 mutants/m22-runner-drops-args.rc
|
||||
2df234e71466ed4ef91a75dfc5bae4e0411b6edcedee3500369b52d2eb91874c mutants/m23-runner-name-as-verb.out
|
||||
b2fcb2adcc3e4a2bfeadd5f079a890a81de01e800c50078b3b3625d0fa606060 mutants/m23-runner-name-as-verb.patch
|
||||
4355a46b19d348dc2f57c046f8ef63d4538ebb936000f3c9ee954a27460dd865 mutants/m23-runner-name-as-verb.rc
|
||||
22f2dd2872c6b8fb493843f624e06f53df3f3906cb3e65209fd52520702963f6 mutants/m24-runner-hides-code.out
|
||||
4632c20b886e34fd93b2f2ae8d98a78c721d2341fe7463b86d5e92b6f3e3f06f mutants/m24-runner-hides-code.patch
|
||||
4355a46b19d348dc2f57c046f8ef63d4538ebb936000f3c9ee954a27460dd865 mutants/m24-runner-hides-code.rc
|
||||
1106ac928ef82320d2bd548adba6e0bb8b5cccd36a7ac1c7913175671afaeee9 mutants/m2-change-organization-always.out
|
||||
9b7438ba46ffae2041c495a6b1015cacfeef131b042be03bdfe2b9e1ccced71b mutants/m2-change-organization-always.patch
|
||||
4355a46b19d348dc2f57c046f8ef63d4538ebb936000f3c9ee954a27460dd865 mutants/m2-change-organization-always.rc
|
||||
37bb173bfd5137e0632418a35e60bf1be17d0debee4fd28dddcba12fd4dce043 mutants/m3b-end-run-never-bundle.out
|
||||
a2c110c2d3e154a105b0ef081e0857078904a785b1917966a72d05afd75749a7 mutants/m3b-end-run-never-bundle.patch
|
||||
4355a46b19d348dc2f57c046f8ef63d4538ebb936000f3c9ee954a27460dd865 mutants/m3b-end-run-never-bundle.rc
|
||||
451421785cbcc9171b79f4f6537680f9b7723db09c64b640bfc35562ed8736c7 mutants/m3-end-run-never.out
|
||||
5255cecd855e99cd2257c0f6efc6ce720eefdd1cbfb9f272614fc84d26032358 mutants/m3-end-run-never.patch
|
||||
4355a46b19d348dc2f57c046f8ef63d4538ebb936000f3c9ee954a27460dd865 mutants/m3-end-run-never.rc
|
||||
62abca19f4000fd42ea0e6c193245c25e662f8b831072afb124ec3d1e1639787 mutants/m4b-change-organization-never-bundle.out
|
||||
a465791a36ce96b99d382837a8d1c286b5a9b550610a6a356c25c42b87947692 mutants/m4b-change-organization-never-bundle.patch
|
||||
4355a46b19d348dc2f57c046f8ef63d4538ebb936000f3c9ee954a27460dd865 mutants/m4b-change-organization-never-bundle.rc
|
||||
89a7c2274af68e7888ec8344de7fbf70c1a9b266046ce6d53a362dcf07c75f2c mutants/m4-change-organization-never.out
|
||||
daff7470390c3cdfbd6967ce0f7c72de05daead79007b2e46a91d17024240c68 mutants/m4-change-organization-never.patch
|
||||
4355a46b19d348dc2f57c046f8ef63d4538ebb936000f3c9ee954a27460dd865 mutants/m4-change-organization-never.rc
|
||||
387ec26dc1a145c9005f401648f54f964d9742dc9d1a618b6001ebb13f0df15e mutants/m5b-end-run-verb-runner.out
|
||||
fbaccc6e633d7147188a5b150a460f33b8b6a0d489e0f9d7451392c2cff7ba2b mutants/m5b-end-run-verb-runner.patch
|
||||
4355a46b19d348dc2f57c046f8ef63d4538ebb936000f3c9ee954a27460dd865 mutants/m5b-end-run-verb-runner.rc
|
||||
5779fe2c85bc43185b4b88e079027b278d787751934758dea13515832fa2319d mutants/m5-end-run-verb.out
|
||||
e8ee3164c00f937233d19d76ab673bfe9cfdfdc295dbcf0a3c0f8004089b0616 mutants/m5-end-run-verb.patch
|
||||
4355a46b19d348dc2f57c046f8ef63d4538ebb936000f3c9ee954a27460dd865 mutants/m5-end-run-verb.rc
|
||||
a392ea42661abdb3e0ce1422fdef2b2769ed97a02e8a4b97d43fb99bbdcb3fb7 mutants/m6-end-run-action.out
|
||||
7d612e4fd708547b8ba26943e73a861dd4e2ede6f34e9cd11d90b94bc12e3485 mutants/m6-end-run-action.patch
|
||||
4355a46b19d348dc2f57c046f8ef63d4538ebb936000f3c9ee954a27460dd865 mutants/m6-end-run-action.rc
|
||||
cd4e63ef2aaf2ae015329731a63967e624cd6440b38b8f3c293c2abbd38513f5 mutants/m7b-change-organization-verb-runner.out
|
||||
e0cf4c534971ded292fba6849c11abb272c5b87bf6b3d6dde7b9062aafface73 mutants/m7b-change-organization-verb-runner.patch
|
||||
4355a46b19d348dc2f57c046f8ef63d4538ebb936000f3c9ee954a27460dd865 mutants/m7b-change-organization-verb-runner.rc
|
||||
f6d650b7ad906e5509d44354a4a83645985bf23cb8bc170a275cd9cede2c3714 mutants/m7-change-organization-verb.out
|
||||
419861c03f377836feb34f7736fd077e43790a6125353388c986ac970d5a62cc mutants/m7-change-organization-verb.patch
|
||||
4355a46b19d348dc2f57c046f8ef63d4538ebb936000f3c9ee954a27460dd865 mutants/m7-change-organization-verb.rc
|
||||
c09aeb98fcbe1e7fa93bcfd07a3b6bbd11e1fc8e3bcabfc8b9a2b2a01fe96696 mutants/m8-change-organization-action.out
|
||||
4f24361f76d6ee85424d9e9f01b0f1f9f8647951137b0cef8cac224476baafa8 mutants/m8-change-organization-action.patch
|
||||
4355a46b19d348dc2f57c046f8ef63d4538ebb936000f3c9ee954a27460dd865 mutants/m8-change-organization-action.rc
|
||||
17f23626b69b7fb43187b914890abf34d15c5fdf2ad4196be00ae9ef90a91cde mutants/m9-reason-optional.out
|
||||
95d47785943df982a1ea6c7c940ce2a976f7dc5f1485faaf09c0e80a014e17e5 mutants/m9-reason-optional.patch
|
||||
4355a46b19d348dc2f57c046f8ef63d4538ebb936000f3c9ee954a27460dd865 mutants/m9-reason-optional.rc
|
||||
a16f0d070c37b676df7759c0dd4c87d3cfebf81cabdb176f42e87ebea01b1149 mutants-run.txt
|
||||
98f07e9d135519dd2137b0cb051fb8ba3f743316379f377ed529a18628189d41 mutants.sh
|
||||
3d12dffdcfff153a3190bf1d9b7944c890fab3d07f8e923b16c03b59e853713e mutants-started.txt
|
||||
34ee1354354b30791c1a4bee3c9e424f38ab760e4f4d06bfb0a73681008a3f02 row132.patch
|
||||
2ec07e048e027c33cd719770221ee75281f8d65fe5ef77dbf95757c2d9a9ac05 suites/business.txt
|
||||
1ddde322b56f323bf5c22b368b4213f2fd3db5e5f2be465d112e288a4e05e43f suites/bus.txt
|
||||
e31a8d0b9f1e29d5889a16ee092e51cd4b152a02970c85d528f4ac12a250a412 suites/cli.txt
|
||||
dd0618f80e732e12e2d9a1a3b56322896a3919cef584e530da13ff9a1dd758b7 suites/harness.txt
|
||||
8ebf320d2dc7f20f6558d3ab98d94126a94cdb29048725dbbfddb53ae3f66fd0 suites/plugins.txt
|
||||
a0147500cb7e78436c7794897bd4b74230380d76d140bdf1e40a84383d362998 suites-run.txt
|
||||
3ffbabdced33998a320101585bf401c37a367c77afe8c843be596b3f2b5fc79e suites/seat.txt
|
||||
f7912523139f8b316f1a115e430e82a5056593a4f7b6e8f5aa9f1a3df242abed suites.sh
|
||||
10ce35ad0971b40f5a3b43f1c5eac0595704ff4131a55e9807c127205f1bdd74 suites/tasks.txt
|
||||
8e2254aa3e1bb9b205ab72c68273d447c0328c9f156ccba2a46f3a0476468b58 suites/test-land-work.txt
|
||||
7bfdf668eb633fe9118677639e187fe95ee2e9ca31cb3b78d24de7a17239ed0e suites/webui.txt
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user