sortie-dogs 0.3.6 → 0.3.7

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 CHANGED
@@ -20,7 +20,7 @@ Requirements: Node.js 22.6 or newer, npm, and OpenCode.
20
20
 
21
21
  Guides: [日本語](docs/guide-ja.md) · [简体中文](docs/guide-zh-CN.md)
22
22
 
23
- Release: [v0.3.6](https://github.com/zufall-upon/Sortie-dogs/releases/tag/v0.3.6)
23
+ Release: [v0.3.7](https://github.com/zufall-upon/Sortie-dogs/releases/tag/v0.3.7)
24
24
 
25
25
  ## Quick start
26
26
 
@@ -62,8 +62,8 @@ to the `plugin` array of the OpenCode configuration the agents run under —
62
62
  Restart OpenCode afterwards. A `plugin` entry must name the package, not a
63
63
  subpath: `sortie-dogs/plugin` is an import specifier, not a plugin specifier.
64
64
 
65
- `dog-coordinator` keeps whichever model you select for the session. `dog-scout`
66
- defaults to `openai/gpt-5.6-luna`. To pin either role to another model, save this
65
+ `dog-coordinator` defaults to `openai/gpt-5.6-terra`; `dog-scout` defaults to
66
+ `openai/gpt-5.6-luna`. To pin either role to another model, save this
67
67
  as `.opencode/sortie-dogs.json`:
68
68
 
69
69
  ```json
@@ -285,16 +285,16 @@ untouched.
285
285
 
286
286
  ## Model routing
287
287
 
288
- Every default route is one model at a different reasoning effort, because
289
- published cost curves put a cheap model at high effort above an expensive model
290
- at mid effort on both solve rate and price. Sortie-dogs therefore buys effort,
291
- not model tiers, wherever the work allows it.
288
+ Default routes split work by required capability and repeated-context cost.
289
+ Sortie-dogs keeps retrieval on Luna, coordinator state and routing on Terra,
290
+ and independent review on Sol unless the host declares another target.
292
291
 
293
- `dog-coordinator` has no built-in route. It is the one agent you drive directly
294
- and pick a model for in the session, so it keeps the model you selected; a
295
- shipped default there would silently revert your choice instead of filling an
296
- absent one. Declare `modelRouting` for `dog-coordinator` if you do want a fixed
297
- coordinator model.
292
+ `dog-coordinator` defaults to `openai/gpt-5.6-terra`. Coordinator work repeatedly
293
+ processes the root context but is primarily state management and routing, so
294
+ Terra is the cost-conscious middle tier between Luna and Sol. Project or global
295
+ `modelRouting` can override this default. If the host proves Terra unavailable,
296
+ the existing availability policy uses a configured free-tier fallback when present
297
+ and otherwise preserves the session model.
298
298
 
299
299
  `dog-scout` defaults to `openai/gpt-5.6-luna` with the `high` variant, since
300
300
  gathering bounded evidence is retrieval rather than reasoning and that tier is
@@ -329,8 +329,8 @@ actually serve.
329
329
  ```json
330
330
  {
331
331
  "modelRouting": {
332
- "dog-coordinator": {
333
- "preferred": { "model": "openai/gpt-5.6-luna", "variant": "max" }
332
+ "dog-coordinator": {
333
+ "preferred": { "model": "openai/gpt-5.6-terra" }
334
334
  },
335
335
  "dog-scout": {
336
336
  "preferred": { "model": "openai/gpt-5.6-luna", "variant": "high" }
@@ -344,8 +344,9 @@ actually serve.
344
344
  }
345
345
  },
346
346
  "modelCatalog": {
347
- "project": [
348
- { "model": "openai/gpt-5.6-sol", "variants": ["medium", "xhigh"] },
347
+ "project": [
348
+ { "model": "openai/gpt-5.6-terra" },
349
+ { "model": "openai/gpt-5.6-sol", "variants": ["medium", "xhigh"] },
349
350
  { "model": "openai/gpt-5.6-luna", "variants": ["max", "high"] },
350
351
  { "model": "anthropic/claude-opus-5" }
351
352
  ]
@@ -16,6 +16,8 @@ export type ModelRoutingConfig = Readonly<Record<string, RoleModelRoute>>;
16
16
  */
17
17
  export declare const DEDICATED_WORKER_MODEL = "openai/gpt-5.6-luna";
18
18
  export declare const DEDICATED_WORKER_VARIANT = "max";
19
+ /** The coordinator balances stronger instruction adherence against the cost of repeated root context. */
20
+ export declare const DEFAULT_COORDINATOR_MODEL = "openai/gpt-5.6-terra";
19
21
  /**
20
22
  * The stronger, far more expensive worker target a host may still select deliberately. It is no longer
21
23
  * a default route: it stays declared so an explicit dedicatedWorkerModel resolves against the catalog
@@ -38,16 +40,9 @@ export declare function dedicatedWorkerRouting(target?: ModelTarget): ModelRouti
38
40
  export declare const DEDICATED_WORKER_ROUTING: ModelRoutingConfig;
39
41
  export declare const FIXED_MODEL_ROUTING: ModelRoutingConfig;
40
42
  export declare const RECOMMENDED_LUNA_MODEL = "openai/gpt-5.6-luna";
41
- /**
42
- * The coordinator has no built-in route on purpose. It is the one agent the user drives directly and
43
- * picks a model for in the session, so a shipped default here does not choose between models for an
44
- * undecided user: it silently discards a choice the user already made and cannot see being reverted.
45
- * Delegated roles are the opposite, because nobody selects a model for a session the loop spawns.
46
- * A host that does want a fixed coordinator model still declares one through modelRouting.
47
- *
48
- * Evidence gathering is retrieval rather than reasoning, so the scout sits one effort tier below the
49
- * worker, where the published cost curve returns the most per unit of cost.
50
- */
43
+ /** Coordinator state and routing use Terra; evidence retrieval remains on the cheaper Luna tier. */
44
+ export declare const DEFAULT_COORDINATOR_ROUTING: ModelRoutingConfig;
45
+ /** Evidence gathering is retrieval rather than reasoning, so the scout stays one effort tier lower. */
51
46
  export declare const RECOMMENDED_SCOUT_VARIANT = "high";
52
47
  export declare const RECOMMENDED_LUNA_ROLE_VARIANTS: Readonly<{
53
48
  readonly "dog-scout": "high";
@@ -8,6 +8,8 @@ import { CONSULTATION_ROLE_POLICY } from "../core/consultation.js";
8
8
  */
9
9
  export const DEDICATED_WORKER_MODEL = "openai/gpt-5.6-luna";
10
10
  export const DEDICATED_WORKER_VARIANT = "max";
11
+ /** The coordinator balances stronger instruction adherence against the cost of repeated root context. */
12
+ export const DEFAULT_COORDINATOR_MODEL = "openai/gpt-5.6-terra";
11
13
  /**
12
14
  * The stronger, far more expensive worker target a host may still select deliberately. It is no longer
13
15
  * a default route: it stays declared so an explicit dedicatedWorkerModel resolves against the catalog
@@ -52,16 +54,13 @@ export const DEDICATED_WORKER_ROUTING = dedicatedWorkerRouting();
52
54
  export const FIXED_MODEL_ROUTING = DEDICATED_WORKER_ROUTING;
53
55
  const fixedModelRoleSet = new Set(Object.keys(FIXED_MODEL_ROUTING));
54
56
  export const RECOMMENDED_LUNA_MODEL = "openai/gpt-5.6-luna";
55
- /**
56
- * The coordinator has no built-in route on purpose. It is the one agent the user drives directly and
57
- * picks a model for in the session, so a shipped default here does not choose between models for an
58
- * undecided user: it silently discards a choice the user already made and cannot see being reverted.
59
- * Delegated roles are the opposite, because nobody selects a model for a session the loop spawns.
60
- * A host that does want a fixed coordinator model still declares one through modelRouting.
61
- *
62
- * Evidence gathering is retrieval rather than reasoning, so the scout sits one effort tier below the
63
- * worker, where the published cost curve returns the most per unit of cost.
64
- */
57
+ /** Coordinator state and routing use Terra; evidence retrieval remains on the cheaper Luna tier. */
58
+ export const DEFAULT_COORDINATOR_ROUTING = Object.freeze({
59
+ "dog-coordinator": Object.freeze({
60
+ preferred: Object.freeze({ model: DEFAULT_COORDINATOR_MODEL }),
61
+ }),
62
+ });
63
+ /** Evidence gathering is retrieval rather than reasoning, so the scout stays one effort tier lower. */
65
64
  export const RECOMMENDED_SCOUT_VARIANT = "high";
66
65
  export const RECOMMENDED_LUNA_ROLE_VARIANTS = Object.freeze({
67
66
  "dog-scout": RECOMMENDED_SCOUT_VARIANT,
@@ -115,6 +114,7 @@ export const RECOMMENDED_CONSULTATION_ROUTING = recommendedConsultationRouting()
115
114
  /** Every configurable role route this build recommends before host configuration is applied. */
116
115
  export function recommendedRoleRouting(fallbackTarget = DEFAULT_DEDICATED_WORKER_TARGET) {
117
116
  return Object.freeze({
117
+ ...DEFAULT_COORDINATOR_ROUTING,
118
118
  ...RECOMMENDED_LUNA_ROUTING,
119
119
  ...recommendedConsultationRouting(fallbackTarget),
120
120
  });
@@ -129,6 +129,7 @@ export function isFixedModelRole(role) {
129
129
  /** Built-in availability metadata for source-level recommendations; no provider probing required. */
130
130
  export const BUILT_IN_MODEL_CATALOG = Object.freeze({
131
131
  global: Object.freeze([
132
+ Object.freeze({ model: DEFAULT_COORDINATOR_MODEL }),
132
133
  Object.freeze({
133
134
  model: DEDICATED_WORKER_MODEL,
134
135
  variants: Object.freeze([DEDICATED_WORKER_VARIANT, RECOMMENDED_SCOUT_VARIANT]
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sortie-dogs",
3
- "version": "0.3.6",
3
+ "version": "0.3.7",
4
4
  "description": "Bounded, validated orchestration loop plugin for OpenCode",
5
5
  "keywords": [
6
6
  "opencode",