opencode-harness-kit 0.2.1 → 0.3.4

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.
Files changed (51) hide show
  1. package/CHANGELOG.md +303 -0
  2. package/GLOBAL.md +50 -13
  3. package/MIGRATION.md +140 -0
  4. package/README.md +233 -116
  5. package/bin/oc-harness.mjs +474 -96
  6. package/dist/index.js +378 -155
  7. package/docs/KNOWN-LIMITS.md +189 -4
  8. package/docs/RESEARCH.md +80 -5
  9. package/docs/ROUTING.md +254 -0
  10. package/lanes.json +136 -0
  11. package/lanes.schema.json +55 -0
  12. package/package.json +12 -8
  13. package/profiles/beam-free.json +51 -0
  14. package/profiles/big-pickle.json +45 -0
  15. package/profiles/deepseek-v4.1-flash-free.json +49 -0
  16. package/profiles/fleet-all.json +139 -0
  17. package/profiles/fleet-safe.json +139 -0
  18. package/profiles/glm-5.3-flash-free.json +49 -0
  19. package/profiles/index.json +120 -37
  20. package/profiles/longcat-2.5-preview-free.json +14 -10
  21. package/profiles/mimo-v2.6-flash-free.json +44 -0
  22. package/profiles/minimax-m3.1-flash-free.json +51 -0
  23. package/profiles/nemotron-3-ultra-free.json +44 -0
  24. package/profiles/nemotron-3.5-lightning-free.json +44 -0
  25. package/profiles/nemotron-3.5-super-vl-free.json +52 -0
  26. package/profiles/schema.json +30 -11
  27. package/{agents → prompts}/build.md +2 -35
  28. package/prompts/doc.md +42 -0
  29. package/{agents → prompts}/locate.md +1 -16
  30. package/prompts/longform.md +34 -0
  31. package/{agents → prompts}/plan.md +2 -25
  32. package/{agents → prompts}/reviewer.md +2 -22
  33. package/prompts/schema.md +30 -0
  34. package/prompts/sweep.md +29 -0
  35. package/{agents → prompts}/verify.md +6 -29
  36. package/prompts/vision.md +33 -0
  37. package/retention.yml +75 -57
  38. package/skills/space-build/SKILL.md +16 -0
  39. package/skills/space-review/SKILL.md +8 -0
  40. package/src/config.js +94 -69
  41. package/src/effort.js +59 -22
  42. package/src/index.ts +15 -2
  43. package/src/lane-usage.js +142 -0
  44. package/src/profile.js +502 -212
  45. package/src/router.ts +148 -39
  46. package/src/telemetry.ts +98 -0
  47. package/examples/muse-spark-1.3-contributor-free.json +0 -41
  48. package/profiles/deepseek-v4-flash-free.json +0 -41
  49. package/profiles/muse-split-free.json +0 -64
  50. package/profiles/space-bunny-free.json +0 -42
  51. package/profiles/x-preview-f-free.json +0 -41
package/lanes.json ADDED
@@ -0,0 +1,136 @@
1
+ {
2
+ "$comment": "Lane definitions: the ten jobs a fleet can hand out, one per free model. No model names live here - a lane says what it is for, and a profile says which model serves it. The compiler reads this file to write agent.<lane> into the generated config, and `install` links prompts/ so the prompt body is live-editable.",
3
+ "$schema": "./lanes.schema.json",
4
+ "lanes": {
5
+ "build": {
6
+ "mode": "primary",
7
+ "description": "Writes and verifies code. Use when the plan is settled and files need to change.",
8
+ "steps": 40,
9
+ "permission": { "edit": "allow" },
10
+ "prompt": "prompts/build.md"
11
+ },
12
+ "plan": {
13
+ "mode": "primary",
14
+ "description": "Turns a request into an executable plan. Use when a task is vague, spans several files, or two people could disagree about what done means.",
15
+ "steps": 25,
16
+ "permission": {
17
+ "edit": "deny",
18
+ "bash": {
19
+ "*": "deny",
20
+ "git status *": "allow",
21
+ "git log *": "allow",
22
+ "git diff *": "allow",
23
+ "git show*": "allow",
24
+ "git -C * status*": "allow",
25
+ "git -C * log*": "allow",
26
+ "git -C * diff*": "allow",
27
+ "grep*": "allow",
28
+ "rg*": "allow",
29
+ "find*": "allow",
30
+ "cat*": "allow",
31
+ "ls*": "allow"
32
+ }
33
+ },
34
+ "prompt": "prompts/plan.md"
35
+ },
36
+ "reviewer": {
37
+ "mode": "subagent",
38
+ "description": "Reviews a change in two passes and never edits. Use after a build step, before a commit or a release decision.",
39
+ "steps": 15,
40
+ "permission": {
41
+ "edit": "deny",
42
+ "bash": {
43
+ "*": "deny",
44
+ "git status *": "allow",
45
+ "git log *": "allow",
46
+ "git diff *": "allow",
47
+ "git show*": "allow",
48
+ "git -C * status*": "allow",
49
+ "git -C * log*": "allow",
50
+ "git -C * diff*": "allow",
51
+ "grep*": "allow",
52
+ "rg*": "allow",
53
+ "cat*": "allow"
54
+ }
55
+ },
56
+ "prompt": "prompts/reviewer.md"
57
+ },
58
+ "locate": {
59
+ "mode": "subagent",
60
+ "description": "Finds where something lives and reports file:line evidence. Use before planning or changing anything, to close a gap in what is already known.",
61
+ "steps": 12,
62
+ "permission": { "edit": "deny", "bash": "deny" },
63
+ "prompt": "prompts/locate.md"
64
+ },
65
+ "verify": {
66
+ "mode": "subagent",
67
+ "description": "Runs the project's checks and reports the real result. Use before claiming a task is done.",
68
+ "steps": 20,
69
+ "permission": {
70
+ "edit": "deny",
71
+ "bash": {
72
+ "*": "ask",
73
+ "git status *": "allow",
74
+ "git diff *": "allow",
75
+ "mkdir*": "allow",
76
+ "ps*": "allow",
77
+ "python3 -m pytest*": "allow",
78
+ "pytest*": "allow",
79
+ "ruff*": "allow",
80
+ "mypy*": "allow",
81
+ "black*": "allow",
82
+ "npm test*": "allow",
83
+ "npm run *": "allow",
84
+ "npx tsc*": "allow",
85
+ "cargo test*": "allow",
86
+ "go test*": "allow"
87
+ }
88
+ },
89
+ "prompt": "prompts/verify.md"
90
+ },
91
+ "vision": {
92
+ "mode": "subagent",
93
+ "description": "Reads an image, a screenshot or a diagram and reports what is in it. Use when the answer depends on pixels and not on a text file.",
94
+ "steps": 12,
95
+ "permission": { "edit": "deny", "bash": "deny" },
96
+ "prompt": "prompts/vision.md"
97
+ },
98
+ "doc": {
99
+ "mode": "subagent",
100
+ "description": "Reads a long document or a spec and reports what it says. Use for a paper, a manual, or a specification the code has to match.",
101
+ "steps": 12,
102
+ "permission": {
103
+ "edit": "deny",
104
+ "bash": {
105
+ "*": "ask",
106
+ "pdftotext*": "allow",
107
+ "python3 -c*": "allow",
108
+ "cat*": "allow",
109
+ "ls*": "allow"
110
+ }
111
+ },
112
+ "prompt": "prompts/doc.md"
113
+ },
114
+ "schema": {
115
+ "mode": "subagent",
116
+ "description": "Produces a JSON object or a JSON schema that matches one. Use when the output has to be parsed by a program and not read by a person.",
117
+ "steps": 15,
118
+ "permission": { "edit": "deny", "bash": "deny" },
119
+ "prompt": "prompts/schema.md"
120
+ },
121
+ "sweep": {
122
+ "mode": "subagent",
123
+ "description": "Scans a lot of code mechanically and reports the matches. Use for bulk sweeps where speed matters more than judgement.",
124
+ "steps": 12,
125
+ "permission": { "edit": "deny", "bash": "deny" },
126
+ "prompt": "prompts/sweep.md"
127
+ },
128
+ "longform": {
129
+ "mode": "subagent",
130
+ "description": "Reads a very long document set, or writes several different versions of one answer. Use for a megabyte of context, or when the task wants alternatives rather than one answer.",
131
+ "steps": 20,
132
+ "permission": { "edit": "deny", "bash": "deny" },
133
+ "prompt": "prompts/longform.md"
134
+ }
135
+ }
136
+ }
@@ -0,0 +1,55 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "https://github.com/pham-canh/space-harness/lanes.schema.json",
4
+ "title": "OpenCode harness lane table",
5
+ "description": "The jobs a fleet can hand out. A lane says what it is for and nothing about models: a profile says which lanes it enables and which model serves each one. The lane table is the single list of lane names in the kit; `src/profile.js` reads it, `src/config.js` compiles it into the generated config, and `profiles/schema.json` must name the same lanes.",
6
+ "type": "object",
7
+ "required": ["lanes"],
8
+ "additionalProperties": false,
9
+ "properties": {
10
+ "$comment": { "type": "string" },
11
+ "$schema": { "type": "string" },
12
+ "lanes": {
13
+ "type": "object",
14
+ "minProperties": 1,
15
+ "additionalProperties": { "$ref": "#/definitions/lane" },
16
+ "propertyNames": {
17
+ "pattern": "^[a-z][a-z0-9-]*$",
18
+ "description": "A lane name is a slug: it becomes an agent name, a prompt filename and a permission key."
19
+ }
20
+ }
21
+ },
22
+ "definitions": {
23
+ "lane": {
24
+ "type": "object",
25
+ "required": ["mode", "description", "prompt"],
26
+ "additionalProperties": false,
27
+ "properties": {
28
+ "mode": {
29
+ "enum": ["primary", "subagent"],
30
+ "description": "A primary agent is one a person talks to and that may delegate; a subagent is one that is only ever handed a job. OpenCode's own `AgentConfig.mode` allows a third value, `all`, which this kit does not use."
31
+ },
32
+ "description": {
33
+ "type": "string",
34
+ "minLength": 20,
35
+ "description": "When to use this lane. The model reads it on every turn to choose a lane, so it has to be long enough to select on and different enough from the others not to overlap. Two lanes that sound alike are the failure mode of a large catalogue, not a large catalogue itself."
36
+ },
37
+ "steps": {
38
+ "type": "integer",
39
+ "exclusiveMinimum": 0,
40
+ "description": "Maximum agentic iterations before the lane is forced to answer in prose. A runaway lane reports instead of looping."
41
+ },
42
+ "permission": {
43
+ "type": "object",
44
+ "description": "Per-lane permission rules, merged over the ones already on the agent. A read-only lane sets `edit: deny`; a lane that runs commands lists them.",
45
+ "additionalProperties": true
46
+ },
47
+ "prompt": {
48
+ "type": "string",
49
+ "pattern": "^prompts/[a-z0-9-]+\\.md$",
50
+ "description": "The lane's instructions, relative to the kit root. The prompt body lives in a file, not in this table and not in the generated config, because an agent markdown file of the same name replaces the config entry wholesale."
51
+ }
52
+ }
53
+ }
54
+ }
55
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "opencode-harness-kit",
3
- "version": "0.2.1",
4
- "description": "Model-agnostic harness kit for OpenCode: capability profiles, role-based reasoning effort, context pruning, and measured baselines.",
3
+ "version": "0.3.4",
4
+ "description": "Harness kit for OpenCode: capability profiles, a fleet of job lanes with one free model each, role-based reasoning effort, context pruning, and measured baselines.",
5
5
  "license": "MIT",
6
6
  "homepage": "https://github.com/pham-canh/space-harness#readme",
7
7
  "repository": {
@@ -32,12 +32,15 @@
32
32
  "dist/",
33
33
  "src/",
34
34
  "profiles/",
35
- "examples/",
36
- "retention.yml",
37
- "GLOBAL.md",
38
- "agents/",
35
+ "prompts/",
39
36
  "skills/",
40
37
  "docs/*.md",
38
+ "retention.yml",
39
+ "lanes.json",
40
+ "lanes.schema.json",
41
+ "GLOBAL.md",
42
+ "CHANGELOG.md",
43
+ "MIGRATION.md",
41
44
  "README.md",
42
45
  "LICENSE"
43
46
  ],
@@ -50,6 +53,7 @@
50
53
  "check": "npm run test:all && npm run test:install && node bin/oc-harness.mjs verify",
51
54
  "check:online": "npm run check && node bin/oc-harness.mjs doctor",
52
55
  "baseline": "node bin/baseline.mjs",
56
+ "release:trust": "node tools/setup-trusted-publishing.mjs",
53
57
  "eval": "node eval/run.mjs",
54
58
  "measure": "node eval/measure-install.mjs",
55
59
  "measure:check": "node eval/measure-install.mjs --min-narrow 45 --min-ctx-drop 20",
@@ -74,8 +78,8 @@
74
78
  },
75
79
  "devDependencies": {
76
80
  "@opencode-ai/plugin": "^1.18.31",
77
- "@types/node": "^22.0.0",
81
+ "@types/node": "^26.6.5",
78
82
  "esbuild": "^0.28.2",
79
- "typescript": "^5.6.0"
83
+ "typescript": "^7.0.2"
80
84
  }
81
85
  }
@@ -0,0 +1,51 @@
1
+ {
2
+ "$comment": "Metadata verified against models.dev on 2026-10-19 and confirmed by a live call the same day. Regenerate the capability fields with `oc-harness refresh beam-free`.",
3
+ "id": "beam-free",
4
+ "title": "Beam Free",
5
+ "provider": "opencode",
6
+ "model": "beam-free",
7
+ "family": "beam",
8
+ "verified": "2026-10-19",
9
+ "retention": "retained",
10
+ "notes": "Reflection 501B-A23B, text only, and the freshest knowledge of the free set at 2026-06-30. Measured as the fastest route on the tier: 2.6s average over seven requests. Its provider does not train on prompts but retains them for 30 days, which is why it is `retained` rather than `zero-retention`.",
11
+ "limits": {
12
+ "context": 1048576,
13
+ "output": 131072
14
+ },
15
+ "supports": {
16
+ "reasoning": true,
17
+ "temperature": true,
18
+ "toolCall": true,
19
+ "structuredOutput": true,
20
+ "attachment": false
21
+ },
22
+ "effort": {
23
+ "levels": [
24
+ "low",
25
+ "medium",
26
+ "high",
27
+ "xhigh",
28
+ "max"
29
+ ],
30
+ "default": "max",
31
+ "reserveShare": 0.12
32
+ },
33
+ "roles": {
34
+ "plan": "max",
35
+ "build": "max",
36
+ "reviewer": "max",
37
+ "locate": "low",
38
+ "verify": "low"
39
+ },
40
+ "prune": {
41
+ "enabled": true,
42
+ "keepRecentToolCalls": 6,
43
+ "keepRecentTurns": 3,
44
+ "keepUserMessages": true
45
+ },
46
+ "fallback": [
47
+ "deepseek-v4.1-flash-free",
48
+ "glm-5.3-flash-free",
49
+ "longcat-2.5-preview-free"
50
+ ]
51
+ }
@@ -0,0 +1,45 @@
1
+ {
2
+ "$comment": "Metadata verified against models.dev on 2026-10-19 and confirmed by a live call the same day. Regenerate the capability fields with `oc-harness refresh big-pickle`.",
3
+ "id": "big-pickle",
4
+ "title": "Big Pickle",
5
+ "provider": "opencode",
6
+ "model": "big-pickle",
7
+ "family": "big-pickle",
8
+ "verified": "2026-10-19",
9
+ "retention": "may-train",
10
+ "notes": "A stealth model with no public identity, no selectable effort and no image input. Cheap, stable, and the one the provider's own terms say may be trained on during its free period, so it stays out of the default fleet.",
11
+ "limits": {
12
+ "context": 200000,
13
+ "input": 160000,
14
+ "output": 32000
15
+ },
16
+ "supports": {
17
+ "reasoning": true,
18
+ "temperature": true,
19
+ "toolCall": true,
20
+ "structuredOutput": true,
21
+ "attachment": false
22
+ },
23
+ "effort": {
24
+ "levels": [],
25
+ "default": null,
26
+ "reserveShare": 0.12
27
+ },
28
+ "roles": {
29
+ "plan": "max",
30
+ "build": "max",
31
+ "reviewer": "max",
32
+ "locate": "low",
33
+ "verify": "low"
34
+ },
35
+ "prune": {
36
+ "enabled": true,
37
+ "keepRecentToolCalls": 6,
38
+ "keepRecentTurns": 3,
39
+ "keepUserMessages": true
40
+ },
41
+ "fallback": [
42
+ "nemotron-3.5-lightning-free",
43
+ "deepseek-v4.1-flash-free"
44
+ ]
45
+ }
@@ -0,0 +1,49 @@
1
+ {
2
+ "$comment": "Metadata verified against models.dev on 2026-10-19 and confirmed by a live call the same day. Regenerate the capability fields with `oc-harness refresh deepseek-v4.1-flash-free`.",
3
+ "id": "deepseek-v4.1-flash-free",
4
+ "title": "DeepSeek V4.1 Flash Free",
5
+ "provider": "opencode",
6
+ "model": "deepseek-v4.1-flash-free",
7
+ "family": "deepseek-flash",
8
+ "verified": "2026-10-19",
9
+ "retention": "zero-retention",
10
+ "notes": "Reasoning plus agentic coding plus structured output on a zero-retention provider. The natural schema lane. Its knowledge cutoff is 2025-05, the oldest of the tier, so it is not the lane for anything that depends on recent facts.",
11
+ "limits": {
12
+ "context": 200000,
13
+ "output": 32000
14
+ },
15
+ "supports": {
16
+ "reasoning": true,
17
+ "temperature": true,
18
+ "toolCall": true,
19
+ "structuredOutput": true,
20
+ "attachment": true
21
+ },
22
+ "effort": {
23
+ "levels": [
24
+ "low",
25
+ "high",
26
+ "max"
27
+ ],
28
+ "default": "max",
29
+ "reserveShare": 0.12
30
+ },
31
+ "roles": {
32
+ "plan": "max",
33
+ "build": "max",
34
+ "reviewer": "max",
35
+ "locate": "low",
36
+ "verify": "low"
37
+ },
38
+ "prune": {
39
+ "enabled": true,
40
+ "keepRecentToolCalls": 6,
41
+ "keepRecentTurns": 3,
42
+ "keepUserMessages": true
43
+ },
44
+ "fallback": [
45
+ "glm-5.3-flash-free",
46
+ "longcat-2.5-preview-free",
47
+ "beam-free"
48
+ ]
49
+ }
@@ -0,0 +1,139 @@
1
+ {
2
+ "$comment": "A fleet is ten jobs with ten models. `roleModels.<lane>.chain` is the ordered list of models that can serve that lane, best first, and the first rung the profile's `maxRetention` ceiling allows is the one that runs it. A chain is therefore ordered WITHIN this profile's ceiling, not globally: this profile's ceiling is may-train, so every rung is allowed and the chain starts with the model built for the job. The router walks the same chain when a route is spent. No model name in a lane is a promise that it will still exist next month, which is why every lane has a chain.",
3
+ "id": "fleet-all",
4
+ "title": "Ten jobs, every free model, one of them may train",
5
+ "provider": "opencode",
6
+ "model": "minimax-m3.1-flash-free",
7
+ "family": null,
8
+ "verified": "2026-10-19",
9
+ "retention": "may-train",
10
+ "maxRetention": "may-train",
11
+ "notes": "Every lane gets the model built for it: beam plans, Nemotron 3 Ultra reviews, Lightning sweeps, MiMo sees, GLM audits, Super VL reasons with the effort turned off. Five of the ten providers state that collected data may be used to improve the model, or log the session, so the profile as a whole is may-train and the generated config says so in its header. Install it for public or throwaway repositories.",
12
+ "limits": {
13
+ "context": 1000000,
14
+ "output": 512000
15
+ },
16
+ "supports": {
17
+ "reasoning": true,
18
+ "temperature": false,
19
+ "toolCall": true,
20
+ "structuredOutput": false,
21
+ "attachment": true
22
+ },
23
+ "effort": {
24
+ "levels": [
25
+ "low",
26
+ "medium",
27
+ "high",
28
+ "xhigh",
29
+ "max"
30
+ ],
31
+ "default": "max",
32
+ "reserveShare": 0.12
33
+ },
34
+ "roles": {
35
+ "plan": "max",
36
+ "build": "max",
37
+ "reviewer": "max",
38
+ "locate": "low",
39
+ "verify": "low",
40
+ "vision": null,
41
+ "doc": null,
42
+ "schema": "max",
43
+ "sweep": "none",
44
+ "longform": null
45
+ },
46
+ "roleModels": {
47
+ "build": {
48
+ "model": "minimax-m3.1-flash-free",
49
+ "chain": [
50
+ "minimax-m3.1-flash-free",
51
+ "deepseek-v4.1-flash-free",
52
+ "longcat-2.5-preview-free"
53
+ ]
54
+ },
55
+ "plan": {
56
+ "model": "beam-free",
57
+ "chain": [
58
+ "beam-free",
59
+ "deepseek-v4.1-flash-free",
60
+ "longcat-2.5-preview-free"
61
+ ]
62
+ },
63
+ "reviewer": {
64
+ "model": "nemotron-3-ultra-free",
65
+ "chain": [
66
+ "nemotron-3-ultra-free",
67
+ "glm-5.3-flash-free",
68
+ "deepseek-v4.1-flash-free"
69
+ ]
70
+ },
71
+ "locate": {
72
+ "model": "nemotron-3.5-lightning-free",
73
+ "chain": [
74
+ "nemotron-3.5-lightning-free",
75
+ "big-pickle",
76
+ "longcat-2.5-preview-free"
77
+ ]
78
+ },
79
+ "verify": {
80
+ "model": "big-pickle",
81
+ "chain": [
82
+ "big-pickle",
83
+ "nemotron-3.5-lightning-free",
84
+ "deepseek-v4.1-flash-free"
85
+ ]
86
+ },
87
+ "vision": {
88
+ "model": "mimo-v2.6-flash-free",
89
+ "chain": [
90
+ "mimo-v2.6-flash-free",
91
+ "longcat-2.5-preview-free",
92
+ "minimax-m3.1-flash-free"
93
+ ]
94
+ },
95
+ "doc": {
96
+ "model": "glm-5.3-flash-free",
97
+ "chain": [
98
+ "glm-5.3-flash-free",
99
+ "deepseek-v4.1-flash-free",
100
+ "longcat-2.5-preview-free"
101
+ ]
102
+ },
103
+ "schema": {
104
+ "model": "deepseek-v4.1-flash-free",
105
+ "chain": [
106
+ "deepseek-v4.1-flash-free",
107
+ "beam-free",
108
+ "glm-5.3-flash-free"
109
+ ]
110
+ },
111
+ "sweep": {
112
+ "model": "nemotron-3.5-super-vl-free",
113
+ "chain": [
114
+ "nemotron-3.5-super-vl-free",
115
+ "longcat-2.5-preview-free",
116
+ "beam-free"
117
+ ]
118
+ },
119
+ "longform": {
120
+ "model": "longcat-2.5-preview-free",
121
+ "chain": [
122
+ "longcat-2.5-preview-free",
123
+ "minimax-m3.1-flash-free",
124
+ "beam-free"
125
+ ]
126
+ }
127
+ },
128
+ "prune": {
129
+ "enabled": true,
130
+ "keepRecentToolCalls": 6,
131
+ "keepRecentTurns": 3,
132
+ "keepUserMessages": true
133
+ },
134
+ "fallback": [
135
+ "minimax-m3.1-flash-free",
136
+ "deepseek-v4.1-flash-free",
137
+ "longcat-2.5-preview-free"
138
+ ]
139
+ }
@@ -0,0 +1,139 @@
1
+ {
2
+ "$comment": "A fleet is ten jobs with ten models. `roleModels.<lane>.chain` is the ordered list of models that can serve that lane, best first, and the first rung the profile's `maxRetention` ceiling allows is the one that runs it. A chain is therefore ordered WITHIN this profile's ceiling, not globally: a ceiling of zero-retention puts the best zero-retention model for the job first, which is not always the best model for the job overall. The router walks the same chain when a route is spent. No model name in a lane is a promise that it will still exist next month, which is why every lane has a chain.",
3
+ "id": "fleet-safe",
4
+ "title": "Ten jobs, zero-retention models only",
5
+ "provider": "opencode",
6
+ "model": "minimax-m3.1-flash-free",
7
+ "family": null,
8
+ "verified": "2026-10-19",
9
+ "retention": "zero-retention",
10
+ "maxRetention": "zero-retention",
11
+ "notes": "The default. Every lane resolves to a model whose provider states a zero-retention policy: no training, nothing kept. The cost is that six of the ten jobs run on a second-choice model - the planner loses beam (30-day retention) and the reviewer loses Nemotron 3 Ultra - so this is the floor, not the ceiling. The chains are ordered within the ceiling rather than copied from `fleet-all`: `locate` takes deepseek because it publishes a `low` effort level that longcat does not, and `vision` takes minimax because it reads an image in 7 seconds. `fleet-all` gives every lane the model built for it.",
12
+ "limits": {
13
+ "context": 1000000,
14
+ "output": 512000
15
+ },
16
+ "supports": {
17
+ "reasoning": true,
18
+ "temperature": false,
19
+ "toolCall": true,
20
+ "structuredOutput": false,
21
+ "attachment": true
22
+ },
23
+ "effort": {
24
+ "levels": [
25
+ "low",
26
+ "medium",
27
+ "high",
28
+ "xhigh",
29
+ "max"
30
+ ],
31
+ "default": "max",
32
+ "reserveShare": 0.12
33
+ },
34
+ "roles": {
35
+ "plan": "max",
36
+ "build": "max",
37
+ "reviewer": "max",
38
+ "locate": "low",
39
+ "verify": "low",
40
+ "vision": null,
41
+ "doc": null,
42
+ "schema": "max",
43
+ "sweep": "none",
44
+ "longform": null
45
+ },
46
+ "roleModels": {
47
+ "build": {
48
+ "model": "minimax-m3.1-flash-free",
49
+ "chain": [
50
+ "minimax-m3.1-flash-free",
51
+ "deepseek-v4.1-flash-free",
52
+ "longcat-2.5-preview-free"
53
+ ]
54
+ },
55
+ "plan": {
56
+ "model": "deepseek-v4.1-flash-free",
57
+ "chain": [
58
+ "deepseek-v4.1-flash-free",
59
+ "glm-5.3-flash-free",
60
+ "longcat-2.5-preview-free"
61
+ ]
62
+ },
63
+ "reviewer": {
64
+ "model": "glm-5.3-flash-free",
65
+ "chain": [
66
+ "glm-5.3-flash-free",
67
+ "deepseek-v4.1-flash-free",
68
+ "longcat-2.5-preview-free"
69
+ ]
70
+ },
71
+ "locate": {
72
+ "model": "deepseek-v4.1-flash-free",
73
+ "chain": [
74
+ "deepseek-v4.1-flash-free",
75
+ "longcat-2.5-preview-free",
76
+ "minimax-m3.1-flash-free"
77
+ ]
78
+ },
79
+ "verify": {
80
+ "model": "deepseek-v4.1-flash-free",
81
+ "chain": [
82
+ "deepseek-v4.1-flash-free",
83
+ "glm-5.3-flash-free",
84
+ "longcat-2.5-preview-free"
85
+ ]
86
+ },
87
+ "vision": {
88
+ "model": "minimax-m3.1-flash-free",
89
+ "chain": [
90
+ "minimax-m3.1-flash-free",
91
+ "longcat-2.5-preview-free",
92
+ "deepseek-v4.1-flash-free"
93
+ ]
94
+ },
95
+ "doc": {
96
+ "model": "glm-5.3-flash-free",
97
+ "chain": [
98
+ "glm-5.3-flash-free",
99
+ "deepseek-v4.1-flash-free",
100
+ "longcat-2.5-preview-free"
101
+ ]
102
+ },
103
+ "schema": {
104
+ "model": "deepseek-v4.1-flash-free",
105
+ "chain": [
106
+ "deepseek-v4.1-flash-free",
107
+ "glm-5.3-flash-free",
108
+ "longcat-2.5-preview-free"
109
+ ]
110
+ },
111
+ "sweep": {
112
+ "model": "longcat-2.5-preview-free",
113
+ "chain": [
114
+ "longcat-2.5-preview-free",
115
+ "deepseek-v4.1-flash-free",
116
+ "minimax-m3.1-flash-free"
117
+ ]
118
+ },
119
+ "longform": {
120
+ "model": "longcat-2.5-preview-free",
121
+ "chain": [
122
+ "longcat-2.5-preview-free",
123
+ "minimax-m3.1-flash-free",
124
+ "deepseek-v4.1-flash-free"
125
+ ]
126
+ }
127
+ },
128
+ "prune": {
129
+ "enabled": true,
130
+ "keepRecentToolCalls": 6,
131
+ "keepRecentTurns": 3,
132
+ "keepUserMessages": true
133
+ },
134
+ "fallback": [
135
+ "deepseek-v4.1-flash-free",
136
+ "longcat-2.5-preview-free",
137
+ "glm-5.3-flash-free"
138
+ ]
139
+ }