sortie-dogs 0.14.0 → 0.14.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +32 -8
- package/dist/asset-version.d.ts +1 -1
- package/dist/asset-version.js +1 -1
- package/dist/core/operator-mission.d.ts +5 -0
- package/dist/core/operator-mission.js +2 -1
- package/dist/plugin/mission-review.js +12 -3
- package/dist/plugin/profiled.js +76 -6
- package/dist/runtime-mission-assets.d.ts +3 -1
- package/dist/runtime-mission-assets.js +7 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -19,8 +19,8 @@ evidence-backed result, not more agents for their own sake.
|
|
|
19
19
|
[](https://www.npmjs.com/package/sortie-dogs)
|
|
20
20
|
[](LICENSE)
|
|
21
21
|
|
|
22
|
-
**Current release: [v0.14.
|
|
23
|
-
· [Release notes](docs/release-v0.14.
|
|
22
|
+
**Current release: [v0.14.1](https://github.com/zufall-upon/Sortie-dogs/releases/tag/v0.14.1)**
|
|
23
|
+
· [Release notes](docs/release-v0.14.1.md) · [Execution vision](docs/v0.14.0-execution-vision.md)
|
|
24
24
|
|
|
25
25
|
[Quick start](#quick-start) · [Workflow](#mission-workflow) · [Models](#default-models) ·
|
|
26
26
|
[Measured results](#measured-results) · [Configuration](#configuration) · [Documentation](#documentation)
|
|
@@ -57,7 +57,7 @@ Use an existing Codex CLI signed in with **ChatGPT**. On Windows, PowerShell **7
|
|
|
57
57
|
available; POSIX uses bash. Sortie does not install Codex, start login or use a metered API fallback.
|
|
58
58
|
|
|
59
59
|
```sh
|
|
60
|
-
npm install --save-dev sortie-dogs@0.14.
|
|
60
|
+
npm install --save-dev sortie-dogs@0.14.1
|
|
61
61
|
npx --no-install sortie-dogs codex init .
|
|
62
62
|
```
|
|
63
63
|
|
|
@@ -86,7 +86,7 @@ bridge. [Codex guide: SDK, permissions, progress, resume and manifest route](doc
|
|
|
86
86
|
Use **OpenCode V2**. In the target project:
|
|
87
87
|
|
|
88
88
|
```sh
|
|
89
|
-
npm install --save-dev sortie-dogs@0.14.
|
|
89
|
+
npm install --save-dev sortie-dogs@0.14.1
|
|
90
90
|
npx --no-install sortie-dogs init .
|
|
91
91
|
```
|
|
92
92
|
|
|
@@ -178,6 +178,30 @@ general speed or success-rate guarantee.
|
|
|
178
178
|
|
|
179
179
|
### SWE-bench evaluation
|
|
180
180
|
|
|
181
|
+
#### v0.14.0 dev23 (2026-10-15 UTC)
|
|
182
|
+
|
|
183
|
+
**Official resolution: 10/23 (43.48%); Mission completion: 22/23.** One pass through the normal
|
|
184
|
+
OpenCode CLI + Sortie Mission path, using the fixed released v0.14.0 package.
|
|
185
|
+
|
|
186
|
+
- All 23 frozen patches were officially scored: **10 resolved, 13 unresolved**, zero empty patches,
|
|
187
|
+
evaluation errors or infrastructure failures. The cost-stopped `sqlfluff__sqlfluff-2419` patch
|
|
188
|
+
resolved officially, but its Mission remains incomplete; official correctness does not imply acceptance.
|
|
189
|
+
- Pinned public Lite dev rows; one inference attempt per task, no retries. Official grading:
|
|
190
|
+
`split=dev`, `max_workers=1`, `retry_count=0`. Inference concurrency was **1** due to low host memory.
|
|
191
|
+
- Actual Operator/Coordinator/Reviewer model: `openai/gpt-6.1-sol#xhigh`;
|
|
192
|
+
Worker: `openai/gpt-6-luna-fast#max`. Ten cases used Workers; 13 used Coordinator direct execution.
|
|
193
|
+
- Inference wall time **2h53m28s**; separate official grading **7m19s**.
|
|
194
|
+
- Known estimated inference cost **$16.76**, with one pending usage record. Separate holds:
|
|
195
|
+
**$2** for unresolved usage and **$5** for implementation/supervision; these are not known expenses.
|
|
196
|
+
Costs are API-equivalent estimates, not invoices; the $2/task monitor is not an exact billing cap.
|
|
197
|
+
- Release/runner commit `e69a3b2317a76eeea1229034f52902812ff1d580`;
|
|
198
|
+
package SHA-256 `120922c31dd6d85040210d68456192b4e6aa45dc87a11451476f3ed576a68e30`.
|
|
199
|
+
|
|
200
|
+
Local evidence (generated artifacts are not committed):
|
|
201
|
+
`_testenv/autodev/sortie-dogs-dev23/benchmark-v0140-20261015/one-pass-summary.json`.
|
|
202
|
+
|
|
203
|
+
#### Historical v0.12.24 test300
|
|
204
|
+
|
|
181
205
|
**SWE-bench Lite test300: 170/300 (56.67%)**, fixed **v0.12.24**, one pass@1 campaign.
|
|
182
206
|
Nine empty patches, zero official evaluation errors, frozen predictions and trajectories for all
|
|
183
207
|
300 instances. Workers ran Luna Fast/max; management/review ran GPT-6 Sol/xhigh.
|
|
@@ -195,8 +219,8 @@ known expense. Official local evaluation and leaderboard acceptance are separate
|
|
|
195
219
|
**8/23 (34.8%)**, versus v0.12.25's 7/23; all seven prior resolutions retained, no empty patches or
|
|
196
220
|
official evaluation errors. [Fixed conditions, stopped-run accounting and costs](docs/benchmarks/swebench-lite-history.md#v0131-dev23-2026-09-30).
|
|
197
221
|
|
|
198
|
-
|
|
199
|
-
|
|
222
|
+
Each score belongs to its fixed candidate. SWE-bench remains an optional measurement, not a release
|
|
223
|
+
gate. Different splits, budgets, models and conditions are not controlled comparisons or proof of a fix's effect.
|
|
200
224
|
|
|
201
225
|
## Configuration
|
|
202
226
|
|
|
@@ -218,7 +242,7 @@ Install the desired package version and rerun **your host's** initializer:
|
|
|
218
242
|
|
|
219
243
|
An OpenCode config-local bridge may resolve a separate package; npm-global update alone does not
|
|
220
244
|
update it. [Global/update instructions](docs/configuration.md#global-availability).
|
|
221
|
-
The current Mission asset marker is `0.14.
|
|
245
|
+
The current Mission asset marker is `0.14.1-review-continuation-v1`; the unchanged Codex skill marker is
|
|
222
246
|
`0.13.11-codex-skill-v2`. Installed markers alone do not prove a running host reloaded the new version.
|
|
223
247
|
|
|
224
248
|
There is no supported uninstall command. Remove the dependency and only known Sortie-owned paths;
|
|
@@ -234,7 +258,7 @@ follow the [manual removal guide](docs/uninstall.md), never delete the entire `.
|
|
|
234
258
|
[SWE-bench history](docs/benchmarks/swebench-lite-history.md) · [Historical local case study](docs/benchmark-reference.md).
|
|
235
259
|
- **Development:** [Testing](docs/testing.md) · [CLI testing](docs/cli-testing.md) ·
|
|
236
260
|
[Windows tests](docs/windows-tests.md) · [Release routine](docs/release-batch.md).
|
|
237
|
-
- **Releases:** [v0.14.0](docs/release-v0.14.0.md) · [v0.13.22](docs/release-v0.13.22.md) · [v0.13.21](docs/release-v0.13.21.md) · [v0.13.20](docs/release-v0.13.20.md) · [v0.13.19](docs/release-v0.13.19.md) · [v0.13.18](docs/release-v0.13.18.md) · [v0.13.17](docs/release-v0.13.17.md) · [v0.13.16](docs/release-v0.13.16.md) · [v0.13.15](docs/release-v0.13.15.md) · [v0.13.14](docs/release-v0.13.14.md) · [v0.13.13](docs/release-v0.13.13.md) · [v0.13.12](docs/release-v0.13.12.md) · [v0.13.11](docs/release-v0.13.11.md) · [v0.13.10](docs/release-v0.13.10.md) ·
|
|
261
|
+
- **Releases:** [v0.14.1](docs/release-v0.14.1.md) · [v0.14.0](docs/release-v0.14.0.md) · [v0.13.22](docs/release-v0.13.22.md) · [v0.13.21](docs/release-v0.13.21.md) · [v0.13.20](docs/release-v0.13.20.md) · [v0.13.19](docs/release-v0.13.19.md) · [v0.13.18](docs/release-v0.13.18.md) · [v0.13.17](docs/release-v0.13.17.md) · [v0.13.16](docs/release-v0.13.16.md) · [v0.13.15](docs/release-v0.13.15.md) · [v0.13.14](docs/release-v0.13.14.md) · [v0.13.13](docs/release-v0.13.13.md) · [v0.13.12](docs/release-v0.13.12.md) · [v0.13.11](docs/release-v0.13.11.md) · [v0.13.10](docs/release-v0.13.10.md) ·
|
|
238
262
|
[v0.13.9](docs/release-v0.13.9.md) · [All GitHub releases](https://github.com/zufall-upon/Sortie-dogs/releases).
|
|
239
263
|
|
|
240
264
|
## Community
|
package/dist/asset-version.d.ts
CHANGED
|
@@ -3,6 +3,6 @@
|
|
|
3
3
|
* installed project marker without importing every asset body.
|
|
4
4
|
*/
|
|
5
5
|
export declare const RUNTIME_ASSET_VERSION = "0.3.89-completion-proof-v1";
|
|
6
|
-
export declare const V010_RUNTIME_ASSET_VERSION = "0.14.
|
|
6
|
+
export declare const V010_RUNTIME_ASSET_VERSION = "0.14.1-review-continuation-v1";
|
|
7
7
|
export declare const CODEX_SKILL_ASSET_VERSION = "0.13.11-codex-skill-v2";
|
|
8
8
|
export type RuntimeAssetVersion = typeof RUNTIME_ASSET_VERSION | typeof V010_RUNTIME_ASSET_VERSION | typeof CODEX_SKILL_ASSET_VERSION;
|
package/dist/asset-version.js
CHANGED
|
@@ -3,5 +3,5 @@
|
|
|
3
3
|
* installed project marker without importing every asset body.
|
|
4
4
|
*/
|
|
5
5
|
export const RUNTIME_ASSET_VERSION = "0.3.89-completion-proof-v1";
|
|
6
|
-
export const V010_RUNTIME_ASSET_VERSION = "0.14.
|
|
6
|
+
export const V010_RUNTIME_ASSET_VERSION = "0.14.1-review-continuation-v1";
|
|
7
7
|
export const CODEX_SKILL_ASSET_VERSION = "0.13.11-codex-skill-v2";
|
|
@@ -319,6 +319,11 @@ export interface OperatorMission {
|
|
|
319
319
|
admittedAt: number;
|
|
320
320
|
reviewIdentity: string;
|
|
321
321
|
};
|
|
322
|
+
/** Exact terminal of an unused inline grant; no implementation calls followed admission. */
|
|
323
|
+
noWriteReceipt?: {
|
|
324
|
+
promptID: string;
|
|
325
|
+
messageID: string;
|
|
326
|
+
};
|
|
322
327
|
status: "prepared" | "running" | "ready" | "failed" | "cancelled";
|
|
323
328
|
selfRecheck?: MissionSelfRecheck;
|
|
324
329
|
}[];
|
|
@@ -891,7 +891,8 @@ export async function missionAcceptanceSummary(mission, run, operators, observe)
|
|
|
891
891
|
}
|
|
892
892
|
export function missionReviewIndependent(mission, child) {
|
|
893
893
|
return child !== undefined && !mission.sourceAuthors?.includes(child) &&
|
|
894
|
-
!(mission.corrections ?? []).some(correction => correction.author === child
|
|
894
|
+
!(mission.corrections ?? []).some(correction => correction.author === child &&
|
|
895
|
+
!(correction.status === "failed" && correction.noWriteReceipt));
|
|
895
896
|
}
|
|
896
897
|
export function missionPacket(mission, run, includeWorkQuantity = true) {
|
|
897
898
|
const predecessor = run && mission.runID !== run.runID && (mission.supersededRunID === run.runID || run.phase === "cancelled") ? run : undefined;
|
|
@@ -199,6 +199,14 @@ export function reviewerCorrectionValidation(validation, child, history, notBefo
|
|
|
199
199
|
continue;
|
|
200
200
|
}
|
|
201
201
|
previousEnd = attempt.completed;
|
|
202
|
+
// A final-check-only refresh must replace its old binding, not force the
|
|
203
|
+
// unchanged prefix to run again. Repeated declarations stay ambiguous;
|
|
204
|
+
// preserve their existing occurrence rules and validate every saved input.
|
|
205
|
+
if (completed && partial.length === required.length && members.length === 1 &&
|
|
206
|
+
members[0].command === required.at(-1) && required.indexOf(members[0].command) === required.length - 1) {
|
|
207
|
+
partial.splice(0, partial.length, ...completed.slice(0, -1));
|
|
208
|
+
completed = undefined;
|
|
209
|
+
}
|
|
202
210
|
if (members[0].command !== required[partial.length] || partial.length === required.length)
|
|
203
211
|
partial.length = 0;
|
|
204
212
|
failed = undefined;
|
|
@@ -366,7 +374,7 @@ export async function missionDeliveryObservation(directory, runID) {
|
|
|
366
374
|
}
|
|
367
375
|
/** A child ID alone cannot establish the initial phase after a restart or failed dispatch. */
|
|
368
376
|
export function initialMissionReviewPrompt(mission, prompts) {
|
|
369
|
-
return [mission.review?.initialPrompt, ...prompts].find(prompt => typeof prompt === "string" &&
|
|
377
|
+
return [mission.review?.initialPrompt, ...(mission.corrections ?? []).map(item => item.initialPrompt), ...prompts].find(prompt => typeof prompt === "string" &&
|
|
370
378
|
prompt.startsWith(`candidate_id: ${mission.id}\n`) && /^review_phase: initial$/mu.test(prompt) &&
|
|
371
379
|
/^canonical_validation_exit: 0$/mu.test(prompt));
|
|
372
380
|
}
|
|
@@ -377,8 +385,9 @@ export async function completedMissionReviewPrompts(mission, profile, root, requ
|
|
|
377
385
|
return [];
|
|
378
386
|
// The completion hook has already bound this prompt to a real independent Reviewer child.
|
|
379
387
|
// Avoid a second V2 history read when its page/list API is temporarily unavailable.
|
|
380
|
-
|
|
381
|
-
|
|
388
|
+
const initial = initialMissionReviewPrompt(mission, []);
|
|
389
|
+
if (initial)
|
|
390
|
+
return [initial];
|
|
382
391
|
const owner = mission.coordinator ?? root;
|
|
383
392
|
if (mission.coordinator !== null) {
|
|
384
393
|
const coordinator = await host.get(owner);
|
package/dist/plugin/profiled.js
CHANGED
|
@@ -355,6 +355,47 @@ export function createProfiledPlugin(profile, assetVersion) {
|
|
|
355
355
|
return who.role === "dog-reviewer" && who.parent === (mission.coordinator ?? root);
|
|
356
356
|
}
|
|
357
357
|
async function restoreReviewAuthorship(root, mission, id) {
|
|
358
|
+
// An inline correction admission can end without any implementation: the
|
|
359
|
+
// controller may be the designated writer. Recover that exact native return
|
|
360
|
+
// rather than permanently treating the unused grant as source authorship.
|
|
361
|
+
const unused = mission.sourceAuthors?.includes(id) ? [] : (mission.corrections ?? []).filter(item => item.author === id && item.inlineReview && item.status === "failed" && !item.noWriteReceipt);
|
|
362
|
+
if (unused.length) {
|
|
363
|
+
const history = await reviewMessages(id);
|
|
364
|
+
const receipts = unused.flatMap(correction => {
|
|
365
|
+
const inline = correction.inlineReview;
|
|
366
|
+
const prompt = history.findIndex(message => record(message.info) && message.info.id === inline.promptID &&
|
|
367
|
+
message.info.role === "user" && message.info.sessionID === id);
|
|
368
|
+
if (prompt < 0)
|
|
369
|
+
return [];
|
|
370
|
+
const response = reviewResponseMessages(history, prompt);
|
|
371
|
+
const last = [...response].reverse().find(message => record(message.info) && message.info.role === "assistant");
|
|
372
|
+
const info = record(last?.info) ? last.info : undefined;
|
|
373
|
+
if (!info || info.sessionID !== id || info.finish !== "stop" || info.error || typeof info.id !== "string" ||
|
|
374
|
+
!record(info.time) || typeof info.time.completed !== "number" || info.time.completed < inline.admittedAt)
|
|
375
|
+
return [];
|
|
376
|
+
const parts = response.flatMap(message => Array.isArray(message.parts) ? message.parts.filter(record) : []);
|
|
377
|
+
const admitted = parts.findIndex(part => part.type === "tool" && part.tool === repairReview && record(part.state) &&
|
|
378
|
+
part.state.status === "completed" && record(part.state.time) && typeof part.state.time.end === "number" &&
|
|
379
|
+
part.state.time.end >= inline.admittedAt);
|
|
380
|
+
// Before admission this Reviewer was read-only. After it, require the
|
|
381
|
+
// observed terminal and only read/search calls; unknown tools or failed
|
|
382
|
+
// writes cannot establish that no implementation occurred.
|
|
383
|
+
if (admitted < 0 || parts.slice(admitted + 1).some(part => part.type === "tool" &&
|
|
384
|
+
(!["read", "grep", "glob"].includes(String(part.tool)) || !record(part.state) ||
|
|
385
|
+
!["completed", "error"].includes(String(part.state.status)))))
|
|
386
|
+
return [];
|
|
387
|
+
return [{ runID: correction.runID, promptID: inline.promptID, messageID: info.id }];
|
|
388
|
+
});
|
|
389
|
+
if (receipts.length)
|
|
390
|
+
mission = await missions.update(root, current => {
|
|
391
|
+
for (const receipt of receipts) {
|
|
392
|
+
const correction = current.corrections?.find(item => item.runID === receipt.runID && item.author === id &&
|
|
393
|
+
item.status === "failed" && item.inlineReview?.promptID === receipt.promptID);
|
|
394
|
+
if (correction)
|
|
395
|
+
correction.noWriteReceipt = { promptID: receipt.promptID, messageID: receipt.messageID };
|
|
396
|
+
}
|
|
397
|
+
});
|
|
398
|
+
}
|
|
358
399
|
if (!missionReviewIndependent(mission, id) || !mission.attempts?.some(attempt => attempt.childSessionID === id))
|
|
359
400
|
return mission;
|
|
360
401
|
const history = await reviewMessages(id);
|
|
@@ -2834,7 +2875,7 @@ export function createProfiledPlugin(profile, assetVersion) {
|
|
|
2834
2875
|
}
|
|
2835
2876
|
async function declareMissionUnits(root, actor, mission, raw, reason, execution, planningCallID, handoffNotes, workQuantities) {
|
|
2836
2877
|
await control.currentBudget(root);
|
|
2837
|
-
mission = await missions.required(root);
|
|
2878
|
+
mission = actor === root ? await reconcileMissionDispatch(root) ?? await missions.required(root) : await missions.required(root);
|
|
2838
2879
|
let previous = await operators.read(root);
|
|
2839
2880
|
if (sourceReconciliationRequired(mission, previous))
|
|
2840
2881
|
return JSON.stringify({ ...missionDispatchPacket(mission, previous),
|
|
@@ -2849,8 +2890,34 @@ export function createProfiledPlugin(profile, assetVersion) {
|
|
|
2849
2890
|
Array.isArray(execution.commands) && execution.commands.length === 0);
|
|
2850
2891
|
const plan = missionPlan(mission, raw, input.directory);
|
|
2851
2892
|
assertMissionWritePaths(mission, plan.units.flatMap(unit => unit.write));
|
|
2852
|
-
if (actor === root && (mission.coordinator !== null || plan.units.length !== 1))
|
|
2853
|
-
|
|
2893
|
+
if (actor === root && (mission.coordinator !== null || plan.units.length !== 1)) {
|
|
2894
|
+
// A submitted Coordinator still owns corrective planning. Return its actual
|
|
2895
|
+
// continuation instead of referring to a Task that the rejection never supplied.
|
|
2896
|
+
// This is routing advice only: no replacement plan, reservation or admission.
|
|
2897
|
+
// Routing below alone chooses whether to offer a Task. A resumable parent
|
|
2898
|
+
// packet can already contain one even while its Reviewer is still pending.
|
|
2899
|
+
const { task: _dispatchTask, ...packet } = missionDispatchPacket(mission, previous);
|
|
2900
|
+
const reviewPending = mission.runID === previous?.runID && mission.review?.verdict === "pending";
|
|
2901
|
+
const active = mission.dispatchOpen || reviewPending || mission.runID === previous?.runID &&
|
|
2902
|
+
previous?.units.some(unit => unit.status === "running");
|
|
2903
|
+
const continuation = !active ? missions.task(mission) : undefined;
|
|
2904
|
+
// Existing Coordinator resumes accept a concrete prompt. Do not use the opaque
|
|
2905
|
+
// initial reference here: claim() would expand it from unchanged Mission state
|
|
2906
|
+
// and lose the unadmitted correction that prompted this continuation.
|
|
2907
|
+
const task = continuation && mission.coordinator !== null ? { ...continuation,
|
|
2908
|
+
prompt: `Continue the same Mission ${mission.id} in this existing Coordinator session, in the user's language. ` +
|
|
2909
|
+
"Retain the saved original requests, requirements, candidate, checks and cumulative budget.\n" +
|
|
2910
|
+
"Proposed correction from Operator root (not admitted; preserve requirements, candidate and cumulative budget):\n" +
|
|
2911
|
+
JSON.stringify({ units: raw, reason, execution, handoff_context: handoffNotes, work_quantities: workQuantities }) } : continuation;
|
|
2912
|
+
return JSON.stringify({ ...packet,
|
|
2913
|
+
status: active ? "mission-coordinator-active" : "mission-coordinator-required",
|
|
2914
|
+
...(task ? { task } : {}),
|
|
2915
|
+
next_action: reviewPending
|
|
2916
|
+
? "Dispatch the exact Reviewer Task from review_mission if not yet active; otherwise wait for that Reviewer. Do not start a Coordinator or another Worker while review is pending. The proposed plan has not been admitted."
|
|
2917
|
+
: active
|
|
2918
|
+
? "Continue the active owning session or wait for its native completion; do not dispatch a duplicate Coordinator or Worker. The proposed plan has not been admitted."
|
|
2919
|
+
: "Dispatch this exact Task to continue the same Mission and Coordinator session with the concrete correction and retained checks. The proposed plan has not been admitted; keep requirements, candidate and cumulative budget unchanged." });
|
|
2920
|
+
}
|
|
2854
2921
|
const same = previous?.planHash === createHash("sha256").update(JSON.stringify(plan)).digest("hex");
|
|
2855
2922
|
const replanning = previous && !["completed", "cancelled"].includes(previous.phase) && !same;
|
|
2856
2923
|
const activeDirect = previous?.units.find(unit => unit.status === "running" && unit.directExecution?.actor === actor);
|
|
@@ -3034,7 +3101,10 @@ export function createProfiledPlugin(profile, assetVersion) {
|
|
|
3034
3101
|
if (args.executor === "worker" && args.units === undefined)
|
|
3035
3102
|
return handoffDirect(root, context.sessionID, context.callID, args.handoff_context);
|
|
3036
3103
|
const planned = await declareMissionUnits(root, context.sessionID, mission, args.units, args.reason, args.execution, context.callID, args.handoff_context, args.work_quantities);
|
|
3037
|
-
|
|
3104
|
+
const task = JSON.parse(planned).task;
|
|
3105
|
+
// A Coordinator continuation is not a newly prepared direct unit.
|
|
3106
|
+
return args.executor === "self" && record(task) && task.subagent_type !== profileAgent(profile, "dog-operator")
|
|
3107
|
+
? startDirect(root, context.sessionID) : planned;
|
|
3038
3108
|
});
|
|
3039
3109
|
}
|
|
3040
3110
|
catch (error) {
|
|
@@ -3178,7 +3248,7 @@ export function createProfiledPlugin(profile, assetVersion) {
|
|
|
3178
3248
|
current.verdict = "findings";
|
|
3179
3249
|
current.result = findings;
|
|
3180
3250
|
// The independent investigation is recorded by this real tool call, not a fictitious terminal.
|
|
3181
|
-
current.initialPrompt = current.task.prompt;
|
|
3251
|
+
current.initialPrompt = initialMissionReviewPrompt(item, [current.task.prompt]);
|
|
3182
3252
|
});
|
|
3183
3253
|
review = mission.review;
|
|
3184
3254
|
}
|
|
@@ -3375,7 +3445,7 @@ export function createProfiledPlugin(profile, assetVersion) {
|
|
|
3375
3445
|
// turn. Generate verification only when a completed initial review is recoverable;
|
|
3376
3446
|
// otherwise generate an admissible initial review instead of trapping the Coordinator.
|
|
3377
3447
|
const prior = mission.review?.task?.prompt;
|
|
3378
|
-
const completed = risk.length > 0 && prior && mission
|
|
3448
|
+
const completed = risk.length > 0 && prior && !initialMissionReviewPrompt(mission, [])
|
|
3379
3449
|
? await completedMissionReviewPrompts(mission, profile, root, prior, {
|
|
3380
3450
|
get: async (id) => payload(await session("get", { path: { id }, query: { directory: input.directory } })),
|
|
3381
3451
|
messages: reviewMessages,
|
|
@@ -18,6 +18,8 @@ export declare const MISSION_REFLECTION_WORKFLOW = "When bounded process reflect
|
|
|
18
18
|
export declare function missionOperatorContent(profile: RuntimeProfile, version: string): string;
|
|
19
19
|
/** Keep representation oracles consistent in direct execution, Worker and Review. */
|
|
20
20
|
export declare const MISSION_REPRESENTATION_ORACLE = "Same-type representation, not name/visitor analogy; resolve conflicts.";
|
|
21
|
+
/** Planning and Review use public type families instead of only issue-named examples. */
|
|
22
|
+
export declare const MISSION_TYPE_FAMILY_ORACLE = "When changing a dispatch/exclusion set, derive the affected same-representation family from an existing\nschema/registry and its public callers, not just issue examples. Compare sibling entries under that\ncontract; reuse suitable parameterized checks. Do not widen unrelated families or require an exhaustive\nmatrix, another unit or review lane.";
|
|
21
23
|
/** Coordinator preserves source-backed return semantics in direct work or a Worker's objective. */
|
|
22
24
|
export declare const MISSION_RETURN_CONTRACT = "For a changed value-producing operation, derive its return contract from public callers and unchanged source/tests.\nPreserve established return type/container, metadata and label alignment unless the original request changes them;\nequal numeric values alone do not prove that contract. Trace which inputs determine result shape and labels,\nincluding non-primary parameters; a scalar primary input need not yield a scalar result. For a mask or conditional\nreplacement, preserve established broadcasting and missing-value propagation; an unknown condition is not proof\nthat replacement is intended. Carry the affected contract into direct work or the Worker's objective.\nReuse an adequate focused assertion; add only the smallest source-backed regression when needed, not an input matrix,\nanother unit, validation lane or review.";
|
|
23
25
|
/** Coordinator preserves source-backed mutation semantics in direct work or a Worker's objective. */
|
|
@@ -25,7 +27,7 @@ export declare const MISSION_MUTATION_CONTRACT = "For a changed mutating operati
|
|
|
25
27
|
/** Coordinator authors and plans regressions without adding another validation/review lane. */
|
|
26
28
|
export declare const MISSION_REGRESSION_PLACEMENT = "Prefer an existing relevant test suite/subtest or fixture when it can express the regression assertion.\nIf a new test module is needed, prefer a distinctive behavior-specific name over automatically mirroring the implementation module.\nPreserve established assertions and project test discovery. This is placement guidance, not another test, unit or review requirement.";
|
|
27
29
|
/** Shared by the installed Reviewer and its host-generated mission prompt. */
|
|
28
|
-
export declare const MISSION_BEHAVIOR_REVIEW = "Establish the test oracle independently of the patch: tests added with the implementation are claims to\nreview, not established API behavior. For a changed failure path, compare a pre-existing analogous public\ntest and its shared assertion helper, including default expected outputs, with the new case. A new test\nthat asserts the implementation's current result can encode the defect rather than catch it. Preserve\nthe pre-change contract unless the request changes it; do not invent a universal failure-result convention.\nFor changed observable behavior, inspect affected public caller assertions/output snapshots found by search, not only implementation-local fixtures.\nReconcile expected outputs with the original requirements and reuse adequate checks; no extra review round.\nFor requested side-effect changes, check remaining controls with existing client-owned state, not only isolated defaults.\nJudge allowed effects from the original request; preserve authorized opt-in behavior.\nSame-type representation, not name/visitor analogy; resolve conflicts.\nTrace a concrete rejected input through the changed code back to the public caller, checking result,\nerror and observable state together, including earlier results that can survive failure. Missing assertions\nalone are not defects; a concrete contradiction with the established contract is a finding even if tests pass.\nDuring correction, reuse the established public test harness where applicable and exercise the smallest\nregression exposing the defect before the fix and passing afterward. Do not change expected values or\nhelper defaults merely to agree with the implementation; derive them from the original contract.\nPrefer existing suites/subtests for regressions. New test entry/helper names should be distinctive\nand compose with other same-package test files, not create generic package-level collisions.\n\nFor a requested per-call mode/option, trace where the setting is chosen and where changed code uses\nretained objects or closures. Distinguish the current caller's setting from a captured creation-time\nsetting; use the requested contract to decide which governs. If actual source crosses that boundary\nand existing tests do not cover it, exercise its smallest public case, including the disabled behavior.\nDo not invent a lifecycle matrix or infer that an opt-in feature is correct from only its enabled path.\n\nFor a changed failure handler, inspect the operation it calls and the public inputs reaching it,\nincluding failures not listed in the new handler. Use the supplied source/tests and established API behavior\nto identify a concrete input that could still violate the requested contract. A passing normal input does\nnot settle a different failure outcome of that same operation. A demonstrable material defect is FINDINGS; ask for\nan excerpt or result only when a specific material outcome cannot be settled. Do not invent new behavior,\nrequire an exhaustive exception inventory, or recommend catching every exception.\n\nReport FINDINGS only for concrete major or medium defects with a material impact on the original requirements,\npublic behavior, correctness or required validation. Name the consequence and smallest necessary fix.\nDo not turn minor style, wording, optional improvements or speculative edge cases into FINDINGS or EVIDENCE_GAPS.\nUse read/search to settle missing context in the current review. If a consequential uncertainty remains,\nrecord EVIDENCE_GAPS as an advisory limitation, not a demand for another evidence packet. Missing narration,\nrequirement mappings, hashes or clipped excerpts alone never justify a blocking finding.\n\nAssess behavioral requirements against actual source, tests and observed results. A required check known to\nhave failed or not run is a concrete finding; missing documentation of a check is not proof it did not run.\nFor incidental workflow constraints such as cache settings or command-path spelling, use existing host observations;\nabsence of a separate settings dump or historical log is not itself an evidence gap. Flag observed material\ncontradictions. The Operator owns final comparison with the original request. If a missing check genuinely\naffects correctness or a requested deliverable, name that consequence and the smallest useful next check.\nOn verification, compare the correction and its affected public outcomes with the original contract, not\nonly the wording of previous findings. Reuse unchanged evidence; do not expand into optional improvements\nor an exhaustive input matrix. PASS means no material finding, not exhaustive proof of every path.";
|
|
30
|
+
export declare const MISSION_BEHAVIOR_REVIEW = "Establish the test oracle independently of the patch: tests added with the implementation are claims to\nreview, not established API behavior. For a changed failure path, compare a pre-existing analogous public\ntest and its shared assertion helper, including default expected outputs, with the new case. A new test\nthat asserts the implementation's current result can encode the defect rather than catch it. Preserve\nthe pre-change contract unless the request changes it; do not invent a universal failure-result convention.\nFor changed observable behavior, inspect affected public caller assertions/output snapshots found by search, not only implementation-local fixtures.\nReconcile expected outputs with the original requirements and reuse adequate checks; no extra review round.\nFor requested side-effect changes, check remaining controls with existing client-owned state, not only isolated defaults.\nJudge allowed effects from the original request; preserve authorized opt-in behavior.\nSame-type representation, not name/visitor analogy; resolve conflicts.\nWhen changing a dispatch/exclusion set, derive the affected same-representation family from an existing\nschema/registry and its public callers, not just issue examples. Compare sibling entries under that\ncontract; reuse suitable parameterized checks. Do not widen unrelated families or require an exhaustive\nmatrix, another unit or review lane.\nTrace a concrete rejected input through the changed code back to the public caller, checking result,\nerror and observable state together, including earlier results that can survive failure. Missing assertions\nalone are not defects; a concrete contradiction with the established contract is a finding even if tests pass.\nDuring correction, reuse the established public test harness where applicable and exercise the smallest\nregression exposing the defect before the fix and passing afterward. Do not change expected values or\nhelper defaults merely to agree with the implementation; derive them from the original contract.\nPrefer existing suites/subtests for regressions. New test entry/helper names should be distinctive\nand compose with other same-package test files, not create generic package-level collisions.\n\nFor a requested per-call mode/option, trace where the setting is chosen and where changed code uses\nretained objects or closures. Distinguish the current caller's setting from a captured creation-time\nsetting; use the requested contract to decide which governs. If actual source crosses that boundary\nand existing tests do not cover it, exercise its smallest public case, including the disabled behavior.\nDo not invent a lifecycle matrix or infer that an opt-in feature is correct from only its enabled path.\n\nFor a changed failure handler, inspect the operation it calls and the public inputs reaching it,\nincluding failures not listed in the new handler. Use the supplied source/tests and established API behavior\nto identify a concrete input that could still violate the requested contract. A passing normal input does\nnot settle a different failure outcome of that same operation. A demonstrable material defect is FINDINGS; ask for\nan excerpt or result only when a specific material outcome cannot be settled. Do not invent new behavior,\nrequire an exhaustive exception inventory, or recommend catching every exception.\n\nReport FINDINGS only for concrete major or medium defects with a material impact on the original requirements,\npublic behavior, correctness or required validation. Name the consequence and smallest necessary fix.\nDo not turn minor style, wording, optional improvements or speculative edge cases into FINDINGS or EVIDENCE_GAPS.\nUse read/search to settle missing context in the current review. If a consequential uncertainty remains,\nrecord EVIDENCE_GAPS as an advisory limitation, not a demand for another evidence packet. Missing narration,\nrequirement mappings, hashes or clipped excerpts alone never justify a blocking finding.\n\nAssess behavioral requirements against actual source, tests and observed results. A required check known to\nhave failed or not run is a concrete finding; missing documentation of a check is not proof it did not run.\nFor incidental workflow constraints such as cache settings or command-path spelling, use existing host observations;\nabsence of a separate settings dump or historical log is not itself an evidence gap. Flag observed material\ncontradictions. The Operator owns final comparison with the original request. If a missing check genuinely\naffects correctness or a requested deliverable, name that consequence and the smallest useful next check.\nOn verification, compare the correction and its affected public outcomes with the original contract, not\nonly the wording of previous findings. Reuse unchanged evidence; do not expand into optional improvements\nor an exhaustive input matrix. PASS means no material finding, not exhaustive proof of every path.";
|
|
29
31
|
/** Mission Reviewer uses ordinary host read/search permissions, not a supplied-packet-only protocol. */
|
|
30
32
|
export declare function missionReviewerContent(profile: RuntimeProfile): string;
|
|
31
33
|
export declare function missionCoordinatorContent(profile: RuntimeProfile, version: string): string;
|
|
@@ -284,6 +284,11 @@ existing user authorization and project gates; npm publication remains manual.
|
|
|
284
284
|
}
|
|
285
285
|
/** Keep representation oracles consistent in direct execution, Worker and Review. */
|
|
286
286
|
export const MISSION_REPRESENTATION_ORACLE = `Same-type representation, not name/visitor analogy; resolve conflicts.`;
|
|
287
|
+
/** Planning and Review use public type families instead of only issue-named examples. */
|
|
288
|
+
export const MISSION_TYPE_FAMILY_ORACLE = `When changing a dispatch/exclusion set, derive the affected same-representation family from an existing
|
|
289
|
+
schema/registry and its public callers, not just issue examples. Compare sibling entries under that
|
|
290
|
+
contract; reuse suitable parameterized checks. Do not widen unrelated families or require an exhaustive
|
|
291
|
+
matrix, another unit or review lane.`;
|
|
287
292
|
/** Coordinator preserves source-backed return semantics in direct work or a Worker's objective. */
|
|
288
293
|
export const MISSION_RETURN_CONTRACT = `For a changed value-producing operation, derive its return contract from public callers and unchanged source/tests.
|
|
289
294
|
Preserve established return type/container, metadata and label alignment unless the original request changes them;
|
|
@@ -319,6 +324,7 @@ For changed observable behavior, inspect affected public caller assertions/outpu
|
|
|
319
324
|
Reconcile expected outputs with the original requirements and reuse adequate checks; no extra review round.
|
|
320
325
|
${MISSION_CLIENT_STATE_CHECK}
|
|
321
326
|
${MISSION_REPRESENTATION_ORACLE}
|
|
327
|
+
${MISSION_TYPE_FAMILY_ORACLE}
|
|
322
328
|
Trace a concrete rejected input through the changed code back to the public caller, checking result,
|
|
323
329
|
error and observable state together, including earlier results that can survive failure. Missing assertions
|
|
324
330
|
alone are not defects; a concrete contradiction with the established contract is a finding even if tests pass.
|
|
@@ -540,6 +546,7 @@ If peer source/tests expose a plausible related still-unhandled error, probe its
|
|
|
540
546
|
before choosing the fix; reuse adequate checks. Include this in the current author's objective/check
|
|
541
547
|
plan, not another unit or review round. Do not invent an exhaustive error matrix.
|
|
542
548
|
${MISSION_REPRESENTATION_ORACLE}
|
|
549
|
+
${MISSION_TYPE_FAMILY_ORACLE}
|
|
543
550
|
${MISSION_RETURN_CONTRACT}
|
|
544
551
|
${MISSION_MUTATION_CONTRACT}
|
|
545
552
|
${MISSION_REGRESSION_PLACEMENT}
|