opencode-harness-kit 0.0.0-stage → 0.2.0
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/GLOBAL.md +110 -0
- package/LICENSE +21 -0
- package/README.md +464 -2
- package/agents/build.md +66 -0
- package/agents/locate.md +48 -0
- package/agents/plan.md +61 -0
- package/agents/reviewer.md +62 -0
- package/agents/verify.md +54 -0
- package/bin/baseline.mjs +367 -0
- package/bin/git-hooks/pre-commit +30 -0
- package/bin/oc-harness.mjs +1025 -0
- package/dist/index.js +1038 -0
- package/docs/KNOWN-LIMITS.md +188 -0
- package/docs/RESEARCH.md +210 -0
- package/docs/demo/demo.gif +0 -0
- package/docs/demo/demo.mp4 +0 -0
- package/docs/demo/render.py +146 -0
- package/examples/muse-spark-1.3-contributor-free.json +41 -0
- package/package.json +81 -4
- package/profiles/deepseek-v4-flash-free.json +41 -0
- package/profiles/index.json +78 -0
- package/profiles/longcat-2.5-preview-free.json +41 -0
- package/profiles/muse-split-free.json +64 -0
- package/profiles/schema.json +161 -0
- package/profiles/space-bunny-free.json +42 -0
- package/profiles/x-preview-f-free.json +41 -0
- package/retention.yml +110 -0
- package/skills/space-build/SKILL.md +54 -0
- package/skills/space-finish/SKILL.md +63 -0
- package/skills/space-plan/SKILL.md +101 -0
- package/skills/space-plan/reference/task-template.md +47 -0
- package/skills/space-review/SKILL.md +53 -0
- package/src/config.js +358 -0
- package/src/effort.js +98 -0
- package/src/guard.ts +59 -0
- package/src/index.ts +80 -0
- package/src/profile.js +484 -0
- package/src/prune.ts +258 -0
- package/src/router.ts +192 -0
- package/src/rules.js +481 -0
- package/src/telemetry.ts +98 -0
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$comment": "Fallback tier 3. The smallest context in the queue at 200k, which is why prune.keepRecentToolCalls drops: the same settings tuned for a 1M model overflow this one.",
|
|
3
|
+
"id": "deepseek-v4-flash-free",
|
|
4
|
+
"title": "DeepSeek V4 Flash Free (OpenCode Zen)",
|
|
5
|
+
"provider": "opencode",
|
|
6
|
+
"model": "deepseek-v4-flash-free",
|
|
7
|
+
"family": "deepseek-flash",
|
|
8
|
+
"verified": "2026-10-07",
|
|
9
|
+
"retention": "zero-retention",
|
|
10
|
+
"notes": "Text only, no attachment, 200k context. Included to show the compiler scaling pruning to the model: reserveShare and retention fall together, so a 1M-tuned profile cannot silently overflow a 200k model.",
|
|
11
|
+
"limits": {
|
|
12
|
+
"context": 200000,
|
|
13
|
+
"output": 128000
|
|
14
|
+
},
|
|
15
|
+
"supports": {
|
|
16
|
+
"reasoning": true,
|
|
17
|
+
"temperature": true,
|
|
18
|
+
"toolCall": true,
|
|
19
|
+
"structuredOutput": true,
|
|
20
|
+
"attachment": false
|
|
21
|
+
},
|
|
22
|
+
"effort": {
|
|
23
|
+
"levels": ["low", "high", "max"],
|
|
24
|
+
"default": "max",
|
|
25
|
+
"reserveShare": 0.12
|
|
26
|
+
},
|
|
27
|
+
"roles": {
|
|
28
|
+
"plan": "max",
|
|
29
|
+
"build": "high",
|
|
30
|
+
"reviewer": "max",
|
|
31
|
+
"locate": "low",
|
|
32
|
+
"verify": "low"
|
|
33
|
+
},
|
|
34
|
+
"prune": {
|
|
35
|
+
"enabled": true,
|
|
36
|
+
"keepRecentToolCalls": 4,
|
|
37
|
+
"keepRecentTurns": 2,
|
|
38
|
+
"keepUserMessages": true
|
|
39
|
+
},
|
|
40
|
+
"fallback": []
|
|
41
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$comment": "Profiles verified against live provider metadata. `retention` must come from retention.yml; a model missing there cannot enter this list.",
|
|
3
|
+
"default": "space-bunny-free",
|
|
4
|
+
"profiles": [
|
|
5
|
+
{
|
|
6
|
+
"id": "muse-split-free",
|
|
7
|
+
"file": "profiles/muse-split-free.json",
|
|
8
|
+
"title": "Muse Spark 1.3 (heavy) + Space Bunny Free (bulk output)",
|
|
9
|
+
"retention": "may-train",
|
|
10
|
+
"free": true,
|
|
11
|
+
"topEffort": "max",
|
|
12
|
+
"context": 1048576,
|
|
13
|
+
"default": false,
|
|
14
|
+
"split": {
|
|
15
|
+
"plan": "muse-spark-1.3-contributor-free",
|
|
16
|
+
"build": "muse-spark-1.3-contributor-free",
|
|
17
|
+
"reviewer": "muse-spark-1.3-contributor-free",
|
|
18
|
+
"locate": "space-bunny-free",
|
|
19
|
+
"verify": "space-bunny-free"
|
|
20
|
+
},
|
|
21
|
+
"note": "Retention here is the effective one: three roles run on Muse Spark, so the file is may-train even though the base model is zero-retention."
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"id": "space-bunny-free",
|
|
25
|
+
"file": "profiles/space-bunny-free.json",
|
|
26
|
+
"title": "Space Bunny Free",
|
|
27
|
+
"retention": "zero-retention",
|
|
28
|
+
"free": true,
|
|
29
|
+
"topEffort": "max",
|
|
30
|
+
"context": 1048576,
|
|
31
|
+
"default": true,
|
|
32
|
+
"note": "Only free Zen model with a max effort and zero-retention terms."
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"id": "x-preview-f-free",
|
|
36
|
+
"file": "profiles/x-preview-f-free.json",
|
|
37
|
+
"title": "x-preview-f Free",
|
|
38
|
+
"retention": "zero-retention",
|
|
39
|
+
"free": true,
|
|
40
|
+
"topEffort": "max",
|
|
41
|
+
"context": 1000000,
|
|
42
|
+
"default": false,
|
|
43
|
+
"note": "Three effort levels only; no medium or xhigh."
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"id": "longcat-2.5-preview-free",
|
|
47
|
+
"file": "profiles/longcat-2.5-preview-free.json",
|
|
48
|
+
"title": "LongCat 2.5 Preview Free",
|
|
49
|
+
"retention": "zero-retention",
|
|
50
|
+
"free": true,
|
|
51
|
+
"topEffort": null,
|
|
52
|
+
"context": 1000000,
|
|
53
|
+
"default": false,
|
|
54
|
+
"note": "No tunable reasoning effort."
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"id": "deepseek-v4-flash-free",
|
|
58
|
+
"file": "profiles/deepseek-v4-flash-free.json",
|
|
59
|
+
"title": "DeepSeek V4 Flash Free",
|
|
60
|
+
"retention": "zero-retention",
|
|
61
|
+
"free": true,
|
|
62
|
+
"topEffort": "max",
|
|
63
|
+
"context": 200000,
|
|
64
|
+
"default": false,
|
|
65
|
+
"note": "200k context, text only."
|
|
66
|
+
}
|
|
67
|
+
],
|
|
68
|
+
"excluded": [
|
|
69
|
+
{
|
|
70
|
+
"id": "muse-spark-1.3-contributor-free",
|
|
71
|
+
"file": "examples/muse-spark-1.3-contributor-free.json",
|
|
72
|
+
"title": "Muse Spark 1.3 Contributor Free",
|
|
73
|
+
"retention": "may-train",
|
|
74
|
+
"reason": "Provider may train on your prompts and completions (Meta contributor tier). Top effort is xhigh, not max.",
|
|
75
|
+
"installable": true
|
|
76
|
+
}
|
|
77
|
+
]
|
|
78
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$comment": "Fallback tier 2. No tunable reasoning effort at all, so the loader omits `variant` entirely for this profile rather than guessing a level.",
|
|
3
|
+
"id": "longcat-2.5-preview-free",
|
|
4
|
+
"title": "LongCat 2.5 Preview Free (OpenCode Zen)",
|
|
5
|
+
"provider": "opencode",
|
|
6
|
+
"model": "longcat-2.5-preview-free",
|
|
7
|
+
"family": "longcat",
|
|
8
|
+
"verified": "2026-10-07",
|
|
9
|
+
"retention": "zero-retention",
|
|
10
|
+
"notes": "Zero-retention with a 1M context, but reasoning_options is null upstream: the model has one fixed effort. Any role requesting a level resolves to null and the generated config leaves variant unset.",
|
|
11
|
+
"limits": {
|
|
12
|
+
"context": 1000000,
|
|
13
|
+
"output": 131072
|
|
14
|
+
},
|
|
15
|
+
"supports": {
|
|
16
|
+
"reasoning": true,
|
|
17
|
+
"temperature": true,
|
|
18
|
+
"toolCall": true,
|
|
19
|
+
"structuredOutput": false,
|
|
20
|
+
"attachment": true
|
|
21
|
+
},
|
|
22
|
+
"effort": {
|
|
23
|
+
"levels": [],
|
|
24
|
+
"default": null,
|
|
25
|
+
"reserveShare": 0.12
|
|
26
|
+
},
|
|
27
|
+
"roles": {
|
|
28
|
+
"plan": null,
|
|
29
|
+
"build": null,
|
|
30
|
+
"reviewer": null,
|
|
31
|
+
"locate": null,
|
|
32
|
+
"verify": null
|
|
33
|
+
},
|
|
34
|
+
"prune": {
|
|
35
|
+
"enabled": true,
|
|
36
|
+
"keepRecentToolCalls": 6,
|
|
37
|
+
"keepRecentTurns": 3,
|
|
38
|
+
"keepUserMessages": true
|
|
39
|
+
},
|
|
40
|
+
"fallback": ["deepseek-v4-flash-free"]
|
|
41
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$comment": "Split profile. The heavy reasoning roles run on Muse Spark 1.3 because it is the strongest free model on Zen by a wide margin (Terminal-Bench 2.1 88.8% vs Nemotron 3 Ultra's 56.4%, DeepSWE v1.1 75.4%). The bulk-output roles stay on Space Bunny because its 524,288-token output cap is 4x Muse Spark's 131,072, and scaffolding or migrating many files is where that ceiling is actually felt. `retention` below describes the BASE model only; the config header prints the effective retention, which is may-train because three roles run on Muse Spark.",
|
|
3
|
+
"id": "muse-split-free",
|
|
4
|
+
"title": "Muse Spark 1.3 (heavy) + Space Bunny Free (bulk output)",
|
|
5
|
+
"provider": "opencode",
|
|
6
|
+
"model": "space-bunny-free",
|
|
7
|
+
"family": null,
|
|
8
|
+
"verified": "2026-10-07",
|
|
9
|
+
"retention": "zero-retention",
|
|
10
|
+
"notes": "Opt-in split, not a default. Muse Spark is a Meta contributor-tier free endpoint: its provider may train on your prompts and completions. Three of the five roles are therefore may-train even though the base model is zero-retention. Install it only for public or throwaway repositories. Effort requests below are resolved against each role's own model, so plan and reviewer ask for `max` and land on `xhigh`, which is the top Muse Spark offers.",
|
|
11
|
+
"limits": {
|
|
12
|
+
"context": 1048576,
|
|
13
|
+
"input": 524288,
|
|
14
|
+
"output": 524288
|
|
15
|
+
},
|
|
16
|
+
"supports": {
|
|
17
|
+
"reasoning": true,
|
|
18
|
+
"temperature": false,
|
|
19
|
+
"toolCall": true,
|
|
20
|
+
"structuredOutput": false,
|
|
21
|
+
"attachment": true
|
|
22
|
+
},
|
|
23
|
+
"effort": {
|
|
24
|
+
"levels": ["low", "medium", "high", "xhigh", "max"],
|
|
25
|
+
"default": "max",
|
|
26
|
+
"reserveShare": 0.12
|
|
27
|
+
},
|
|
28
|
+
"roles": {
|
|
29
|
+
"plan": "max",
|
|
30
|
+
"build": "high",
|
|
31
|
+
"reviewer": "max",
|
|
32
|
+
"locate": "low",
|
|
33
|
+
"verify": "low"
|
|
34
|
+
},
|
|
35
|
+
"roleModels": {
|
|
36
|
+
"plan": {
|
|
37
|
+
"model": "muse-spark-1.3-contributor-free",
|
|
38
|
+
"levels": ["minimal", "low", "medium", "high", "xhigh"]
|
|
39
|
+
},
|
|
40
|
+
"build": {
|
|
41
|
+
"model": "muse-spark-1.3-contributor-free",
|
|
42
|
+
"levels": ["minimal", "low", "medium", "high", "xhigh"]
|
|
43
|
+
},
|
|
44
|
+
"reviewer": {
|
|
45
|
+
"model": "muse-spark-1.3-contributor-free",
|
|
46
|
+
"levels": ["minimal", "low", "medium", "high", "xhigh"]
|
|
47
|
+
},
|
|
48
|
+
"locate": {
|
|
49
|
+
"model": "space-bunny-free",
|
|
50
|
+
"levels": ["low", "medium", "high", "xhigh", "max"]
|
|
51
|
+
},
|
|
52
|
+
"verify": {
|
|
53
|
+
"model": "space-bunny-free",
|
|
54
|
+
"levels": ["low", "medium", "high", "xhigh", "max"]
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
"prune": {
|
|
58
|
+
"enabled": true,
|
|
59
|
+
"keepRecentToolCalls": 6,
|
|
60
|
+
"keepRecentTurns": 3,
|
|
61
|
+
"keepUserMessages": true
|
|
62
|
+
},
|
|
63
|
+
"fallback": ["x-preview-f-free", "longcat-2.5-preview-free", "deepseek-v4-flash-free"]
|
|
64
|
+
}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"$id": "https://github.com/anomalyco/opencode-harness-kit/profiles/schema.json",
|
|
4
|
+
"title": "OpenCode harness profile",
|
|
5
|
+
"description": "Everything that changes when you change model. Plugins read this file and contain no model names of their own.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"required": ["id", "provider", "model", "retention", "limits", "effort", "roles"],
|
|
8
|
+
"additionalProperties": false,
|
|
9
|
+
"properties": {
|
|
10
|
+
"id": {
|
|
11
|
+
"type": "string",
|
|
12
|
+
"description": "Slug used as the profile filename and the oc-harness use argument."
|
|
13
|
+
},
|
|
14
|
+
"title": { "type": "string" },
|
|
15
|
+
"provider": {
|
|
16
|
+
"type": "string",
|
|
17
|
+
"description": "opencode provider id, e.g. opencode, opencode-go, anthropic."
|
|
18
|
+
},
|
|
19
|
+
"model": {
|
|
20
|
+
"type": "string",
|
|
21
|
+
"description": "Model id without the provider prefix, e.g. space-bunny-free."
|
|
22
|
+
},
|
|
23
|
+
"family": {
|
|
24
|
+
"type": ["string", "null"],
|
|
25
|
+
"description": "Model family for grouping. Stealth models report null upstream, so this may be set by hand."
|
|
26
|
+
},
|
|
27
|
+
"verified": {
|
|
28
|
+
"type": "string",
|
|
29
|
+
"description": "ISO date a human checked this profile against live metadata."
|
|
30
|
+
},
|
|
31
|
+
"retention": {
|
|
32
|
+
"enum": ["zero-retention", "may-train", "unknown"],
|
|
33
|
+
"description": "Must match an entry in retention.yml. A profile whose model is unknown there cannot become the default."
|
|
34
|
+
},
|
|
35
|
+
"notes": { "type": "string" },
|
|
36
|
+
"limits": {
|
|
37
|
+
"type": "object",
|
|
38
|
+
"required": ["context", "output"],
|
|
39
|
+
"additionalProperties": false,
|
|
40
|
+
"description": "Token ceilings from the provider catalog. `input` is absent for several Zen models, in which case the loader derives it from `context`.",
|
|
41
|
+
"properties": {
|
|
42
|
+
"context": { "type": "integer", "minimum": 1 },
|
|
43
|
+
"input": { "type": "integer", "minimum": 1 },
|
|
44
|
+
"output": { "type": "integer", "minimum": 1 }
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
"supports": {
|
|
48
|
+
"type": "object",
|
|
49
|
+
"additionalProperties": false,
|
|
50
|
+
"description": "Capability flags. Missing or false means do not emit the related config.",
|
|
51
|
+
"properties": {
|
|
52
|
+
"reasoning": { "type": "boolean" },
|
|
53
|
+
"temperature": { "type": "boolean" },
|
|
54
|
+
"toolCall": { "type": "boolean" },
|
|
55
|
+
"structuredOutput": { "type": "boolean" },
|
|
56
|
+
"attachment": {
|
|
57
|
+
"type": "boolean",
|
|
58
|
+
"description": "Accepts image or video input. Gates screenshot-based verification."
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
"effort": {
|
|
63
|
+
"type": "object",
|
|
64
|
+
"description": "Available reasoning levels, lowest to highest. Empty means the model has no tunable effort.",
|
|
65
|
+
"properties": {
|
|
66
|
+
"levels": {
|
|
67
|
+
"type": "array",
|
|
68
|
+
"items": { "type": "string" },
|
|
69
|
+
"examples": [["low", "medium", "high", "xhigh", "max"]]
|
|
70
|
+
},
|
|
71
|
+
"default": { "type": "string" },
|
|
72
|
+
"reserveShare": {
|
|
73
|
+
"type": "number",
|
|
74
|
+
"minimum": 0,
|
|
75
|
+
"maximum": 0.5,
|
|
76
|
+
"default": 0.12,
|
|
77
|
+
"description": "Share of the input ceiling held back for reasoning and tool output growth."
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
},
|
|
81
|
+
"roles": {
|
|
82
|
+
"type": "object",
|
|
83
|
+
"description": "Requested effort per agent role. Resolved against effort.levels, never emitted raw.",
|
|
84
|
+
"additionalProperties": false,
|
|
85
|
+
"properties": {
|
|
86
|
+
"plan": { "$ref": "#/definitions/effortRequest" },
|
|
87
|
+
"build": { "$ref": "#/definitions/effortRequest" },
|
|
88
|
+
"reviewer": { "$ref": "#/definitions/effortRequest" },
|
|
89
|
+
"locate": { "$ref": "#/definitions/effortRequest" },
|
|
90
|
+
"verify": { "$ref": "#/definitions/effortRequest" }
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
"roleModels": {
|
|
94
|
+
"type": "object",
|
|
95
|
+
"description": "Model per agent role, for a profile that splits the heavy reasoning roles onto a stronger model while the bulk-output roles stay on a high-output one. `model` remains the base: roles not named here, the top-level `model`, and `small_model` all resolve to it.",
|
|
96
|
+
"additionalProperties": false,
|
|
97
|
+
"properties": {
|
|
98
|
+
"plan": { "$ref": "#/definitions/roleModel" },
|
|
99
|
+
"build": { "$ref": "#/definitions/roleModel" },
|
|
100
|
+
"reviewer": { "$ref": "#/definitions/roleModel" },
|
|
101
|
+
"locate": { "$ref": "#/definitions/roleModel" },
|
|
102
|
+
"verify": { "$ref": "#/definitions/roleModel" }
|
|
103
|
+
}
|
|
104
|
+
},
|
|
105
|
+
"prune": {
|
|
106
|
+
"type": "object",
|
|
107
|
+
"additionalProperties": false,
|
|
108
|
+
"description": "Deterministic context pruning. Only used when a model-driven compressor is unavailable or unproven.",
|
|
109
|
+
"properties": {
|
|
110
|
+
"enabled": { "type": "boolean" },
|
|
111
|
+
"keepRecentToolCalls": {
|
|
112
|
+
"type": "integer",
|
|
113
|
+
"minimum": 1,
|
|
114
|
+
"default": 6,
|
|
115
|
+
"description": "Verbatim tool outputs kept at the tail."
|
|
116
|
+
},
|
|
117
|
+
"keepRecentTurns": {
|
|
118
|
+
"type": "integer",
|
|
119
|
+
"minimum": 1,
|
|
120
|
+
"default": 3,
|
|
121
|
+
"description": "Trailing turns whose text and reasoning stay verbatim."
|
|
122
|
+
},
|
|
123
|
+
"keepUserMessages": {
|
|
124
|
+
"type": "boolean",
|
|
125
|
+
"default": true,
|
|
126
|
+
"description": "Never stub a user message. Their instructions are the point of the session."
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
},
|
|
130
|
+
"fallback": {
|
|
131
|
+
"type": "array",
|
|
132
|
+
"description": "Ordered profile ids to fall back to. Selection happens at session start, not mid-session: no opencode plugin hook can change a live session's model.",
|
|
133
|
+
"items": { "type": "string" }
|
|
134
|
+
}
|
|
135
|
+
},
|
|
136
|
+
"definitions": {
|
|
137
|
+
"roleModel": {
|
|
138
|
+
"type": "object",
|
|
139
|
+
"description": "A model for one role, plus the effort levels that model actually offers. Required when the model differs from the base, because a level the model does not have must never be written onto the agent.",
|
|
140
|
+
"additionalProperties": false,
|
|
141
|
+
"required": ["model"],
|
|
142
|
+
"properties": {
|
|
143
|
+
"model": {
|
|
144
|
+
"type": "string",
|
|
145
|
+
"description": "Model id without the provider prefix. Must resolve to a profile in this directory, so its limits and retention are known."
|
|
146
|
+
},
|
|
147
|
+
"levels": {
|
|
148
|
+
"type": "array",
|
|
149
|
+
"items": { "type": "string" },
|
|
150
|
+
"description": "Effort levels this role's model offers. Omitted means the role emits no variant at all, which is the right reading for a model with no tunable effort."
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
},
|
|
154
|
+
"effortRequest": {
|
|
155
|
+
"oneOf": [
|
|
156
|
+
{ "type": "string", "description": "Desired level, resolved to the nearest available one." },
|
|
157
|
+
{ "type": "null", "description": "This role should not set a variant at all." }
|
|
158
|
+
]
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$comment": "Validated against models.dev on 2026-10-07. Regenerate with `oc-harness use --refresh`.",
|
|
3
|
+
"id": "space-bunny-free",
|
|
4
|
+
"title": "Space Bunny Free (OpenCode Zen)",
|
|
5
|
+
"provider": "opencode",
|
|
6
|
+
"model": "space-bunny-free",
|
|
7
|
+
"family": null,
|
|
8
|
+
"verified": "2026-10-07",
|
|
9
|
+
"retention": "zero-retention",
|
|
10
|
+
"notes": "Stealth preview reasoning model. Served over /v1/chat/completions (openai-compatible), which is the weaker cache dialect compared with models on /v1/responses. At the time of writing it is the only free model on Zen whose top reasoning effort is `max` and whose provider is zero-retention. Free for a limited time; expect the slot to rotate.",
|
|
11
|
+
"limits": {
|
|
12
|
+
"context": 1048576,
|
|
13
|
+
"input": 524288,
|
|
14
|
+
"output": 524288
|
|
15
|
+
},
|
|
16
|
+
"supports": {
|
|
17
|
+
"reasoning": true,
|
|
18
|
+
"temperature": false,
|
|
19
|
+
"toolCall": true,
|
|
20
|
+
"structuredOutput": false,
|
|
21
|
+
"attachment": true
|
|
22
|
+
},
|
|
23
|
+
"effort": {
|
|
24
|
+
"levels": ["low", "medium", "high", "xhigh", "max"],
|
|
25
|
+
"default": "max",
|
|
26
|
+
"reserveShare": 0.12
|
|
27
|
+
},
|
|
28
|
+
"roles": {
|
|
29
|
+
"plan": "max",
|
|
30
|
+
"build": "high",
|
|
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": ["x-preview-f-free", "longcat-2.5-preview-free", "deepseek-v4-flash-free"]
|
|
42
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$comment": "Fallback tier 1 for space-bunny-free. Zero-retention, 1M context, and a `max` effort, but only three levels: there is no medium or xhigh, so roles asking for those resolve down to high.",
|
|
3
|
+
"id": "x-preview-f-free",
|
|
4
|
+
"title": "x-preview-f Free (OpenCode Zen)",
|
|
5
|
+
"provider": "opencode",
|
|
6
|
+
"model": "x-preview-f-free",
|
|
7
|
+
"family": null,
|
|
8
|
+
"verified": "2026-10-07",
|
|
9
|
+
"retention": "zero-retention",
|
|
10
|
+
"notes": "Only three effort levels (low, high, max) and a 131k completion ceiling, so long single answers are not its strength. Kept as first fallback: same 1M context class and the same zero-retention terms as the default.",
|
|
11
|
+
"limits": {
|
|
12
|
+
"context": 1000000,
|
|
13
|
+
"output": 131072
|
|
14
|
+
},
|
|
15
|
+
"supports": {
|
|
16
|
+
"reasoning": true,
|
|
17
|
+
"temperature": true,
|
|
18
|
+
"toolCall": true,
|
|
19
|
+
"structuredOutput": true,
|
|
20
|
+
"attachment": true
|
|
21
|
+
},
|
|
22
|
+
"effort": {
|
|
23
|
+
"levels": ["low", "high", "max"],
|
|
24
|
+
"default": "max",
|
|
25
|
+
"reserveShare": 0.12
|
|
26
|
+
},
|
|
27
|
+
"roles": {
|
|
28
|
+
"plan": "max",
|
|
29
|
+
"build": "high",
|
|
30
|
+
"reviewer": "max",
|
|
31
|
+
"locate": "low",
|
|
32
|
+
"verify": "low"
|
|
33
|
+
},
|
|
34
|
+
"prune": {
|
|
35
|
+
"enabled": true,
|
|
36
|
+
"keepRecentToolCalls": 6,
|
|
37
|
+
"keepRecentTurns": 3,
|
|
38
|
+
"keepUserMessages": true
|
|
39
|
+
},
|
|
40
|
+
"fallback": ["longcat-2.5-preview-free", "deepseek-v4-flash-free"]
|
|
41
|
+
}
|
package/retention.yml
ADDED
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# Data retention and privacy, curated by hand.
|
|
2
|
+
#
|
|
3
|
+
# models.dev describes capability and price. It does NOT describe what a
|
|
4
|
+
# provider does with your prompts. That gap is why this file exists: the most
|
|
5
|
+
# consequential choice in a coding agent is often invisible in the metadata.
|
|
6
|
+
#
|
|
7
|
+
# Values:
|
|
8
|
+
# zero-retention provider keeps nothing, no training
|
|
9
|
+
# may-train prompts and/or completions may be used to improve the model
|
|
10
|
+
# unknown not verified here; `oc-harness use` refuses to make it a
|
|
11
|
+
# default until a human fills this in
|
|
12
|
+
#
|
|
13
|
+
# Sources: https://opencode.ai/docs/zen (Privacy section). Re-verify on their
|
|
14
|
+
# release notes; terms change without a model rename.
|
|
15
|
+
|
|
16
|
+
defaults:
|
|
17
|
+
unknown: unknown
|
|
18
|
+
|
|
19
|
+
models:
|
|
20
|
+
opencode/space-bunny-free:
|
|
21
|
+
retention: zero-retention
|
|
22
|
+
note: >-
|
|
23
|
+
"Its provider follows a zero-retention policy and does not use your data
|
|
24
|
+
for model training." Free for a limited time; stealth model with no public
|
|
25
|
+
identity.
|
|
26
|
+
verified: 2026-10-07
|
|
27
|
+
source: https://opencode.ai/docs/zen
|
|
28
|
+
|
|
29
|
+
opencode/space-bunny:
|
|
30
|
+
retention: zero-retention
|
|
31
|
+
note: Same provider as space-bunny-free, paid route on the Go plan.
|
|
32
|
+
verified: 2026-10-07
|
|
33
|
+
source: https://opencode.ai/docs/zen
|
|
34
|
+
|
|
35
|
+
opencode/longcat-2.5-preview-free:
|
|
36
|
+
retention: zero-retention
|
|
37
|
+
note: "free on OpenCode for a limited time. Its provider follows a zero-retention policy."
|
|
38
|
+
verified: 2026-10-07
|
|
39
|
+
source: https://opencode.ai/docs/zen
|
|
40
|
+
|
|
41
|
+
# The two entries below are not named individually in the Privacy section.
|
|
42
|
+
# They fall under the general policy - providers follow zero-retention and do
|
|
43
|
+
# not train on your data, with a named exception list - so this is inferred
|
|
44
|
+
# from that list rather than quoted. Re-check before relying on it for
|
|
45
|
+
# anything sensitive.
|
|
46
|
+
|
|
47
|
+
opencode/x-preview-f-free:
|
|
48
|
+
retention: zero-retention
|
|
49
|
+
note: >-
|
|
50
|
+
Not named in the Privacy exception list, so the general zero-retention
|
|
51
|
+
policy applies. Inferred, not quoted.
|
|
52
|
+
verified: 2026-10-07
|
|
53
|
+
source: https://opencode.ai/docs/zen
|
|
54
|
+
|
|
55
|
+
opencode/deepseek-v4-flash-free:
|
|
56
|
+
retention: zero-retention
|
|
57
|
+
note: >-
|
|
58
|
+
Not named in the Privacy exception list, so the general zero-retention
|
|
59
|
+
policy applies. Inferred, not quoted. This route is also documented as
|
|
60
|
+
returning 429 for extended periods, so see docs/KNOWN-LIMITS.md.
|
|
61
|
+
verified: 2026-10-07
|
|
62
|
+
source: https://opencode.ai/docs/zen
|
|
63
|
+
|
|
64
|
+
opencode/muse-spark-1.3-contributor-free:
|
|
65
|
+
retention: may-train
|
|
66
|
+
note: >-
|
|
67
|
+
"Heavily discounted token pricing in exchange for permission to use your
|
|
68
|
+
prompts and completions to train future Meta models." 1M context, but its
|
|
69
|
+
top reasoning effort is xhigh, not max. Kept as an example of a
|
|
70
|
+
capability/privacy tradeoff, never as a default for private code.
|
|
71
|
+
verified: 2026-10-07
|
|
72
|
+
source: https://opencode.ai/docs/zen
|
|
73
|
+
|
|
74
|
+
opencode/muse-spark-1.3:
|
|
75
|
+
retention: may-train
|
|
76
|
+
note: Same Meta contributor terms as the free variant.
|
|
77
|
+
verified: 2026-10-07
|
|
78
|
+
source: https://opencode.ai/docs/zen
|
|
79
|
+
|
|
80
|
+
opencode/big-pickle:
|
|
81
|
+
retention: may-train
|
|
82
|
+
note: "collected data may be used to improve the model" during its free period.
|
|
83
|
+
verified: 2026-10-07
|
|
84
|
+
source: https://opencode.ai/docs/zen
|
|
85
|
+
|
|
86
|
+
opencode/exo-free:
|
|
87
|
+
retention: may-train
|
|
88
|
+
note: "collected data may be used to improve the model" during its free period.
|
|
89
|
+
verified: 2026-10-07
|
|
90
|
+
source: https://opencode.ai/docs/zen
|
|
91
|
+
|
|
92
|
+
opencode/fledge-alpha-free:
|
|
93
|
+
retention: may-train
|
|
94
|
+
note: "collected data may be used to improve the model" during its free period.
|
|
95
|
+
verified: 2026-10-07
|
|
96
|
+
source: https://opencode.ai/docs/zen
|
|
97
|
+
|
|
98
|
+
opencode/mimo-v2.5-free:
|
|
99
|
+
retention: may-train
|
|
100
|
+
note: "collected data may be used to improve the model" during its free period.
|
|
101
|
+
verified: 2026-10-07
|
|
102
|
+
source: https://opencode.ai/docs/zen
|
|
103
|
+
|
|
104
|
+
opencode/nemotron-3-ultra-free:
|
|
105
|
+
retention: may-train
|
|
106
|
+
note: >-
|
|
107
|
+
NVIDIA free trial endpoints. Trial use only, do not submit personal or
|
|
108
|
+
confidential data; sessions are logged.
|
|
109
|
+
verified: 2026-10-07
|
|
110
|
+
source: https://opencode.ai/docs/zen
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: space-build
|
|
3
|
+
description: Implement one planned task and verify it with a real command. Use when the plan is settled and files need to change.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Build one task, then prove it
|
|
7
|
+
|
|
8
|
+
## Steps
|
|
9
|
+
|
|
10
|
+
1. **Read the task from `.space/tasks.md`, not from the conversation.** The file
|
|
11
|
+
the plan wrote is the requirement; memory of the request is not. If there is
|
|
12
|
+
no file, ask for the plan first — a task with no verify command in it is not
|
|
13
|
+
a task you can finish.
|
|
14
|
+
2. **Locate before you read.** `grep`/`glob` for the candidate files, then
|
|
15
|
+
`read` with an `offset`/`limit` for the range you need. Reading whole files to
|
|
16
|
+
find out where something lives was the most expensive habit measured on this
|
|
17
|
+
setup: 2,966 full-file reads against 249 searches, about twelve per search.
|
|
18
|
+
3. **Read the whole file before editing it** - not a grep hit, the file. Partial
|
|
19
|
+
reads produce edits that contradict code you did not see.
|
|
20
|
+
4. **Make the smallest change** that satisfies the task. If the task is bigger
|
|
21
|
+
than it looks, stop and say so rather than quietly expanding it.
|
|
22
|
+
5. **Run the verify command the plan named.** That command, not a different one,
|
|
23
|
+
not a subset.
|
|
24
|
+
6. **On failure, read the actual message.** Not the last ten lines, the error.
|
|
25
|
+
Fix the cause, then run it again. The third identical attempt is a signal to
|
|
26
|
+
stop and report.
|
|
27
|
+
7. **Mark the task done in `.space/tasks.md`** and paste the verify command's
|
|
28
|
+
verbatim final lines into its `verify:` line. A task marked done without
|
|
29
|
+
that has not been verified.
|
|
30
|
+
8. **Report the command and its verbatim output.**
|
|
31
|
+
|
|
32
|
+
## Test-first when the plan called for it
|
|
33
|
+
|
|
34
|
+
If the plan said test first, write the failing test and watch it fail. A test
|
|
35
|
+
that has never failed has not been shown to test anything.
|
|
36
|
+
|
|
37
|
+
## Never
|
|
38
|
+
|
|
39
|
+
- Leave a `TODO`, a stub, or a commented-out block for later. Partial work
|
|
40
|
+
reported as complete is the failure mode this exists to prevent.
|
|
41
|
+
- Widen the task. A drive-by refactor belongs in its own plan.
|
|
42
|
+
- Skip a failing test to get to green. Report it.
|
|
43
|
+
- Claim a result you did not run.
|
|
44
|
+
|
|
45
|
+
## Handing back
|
|
46
|
+
|
|
47
|
+
Which task, which command, which result. If anything is unfinished, list it
|
|
48
|
+
explicitly rather than letting the review step find it.
|
|
49
|
+
|
|
50
|
+
**If you were handed back here by `space-review`**, you have a blocker with a
|
|
51
|
+
`file:line` and a failing command, not a fresh task. Fix that specific thing.
|
|
52
|
+
Do not re-read the plan, do not look for other improvements, and do not treat
|
|
53
|
+
the review as a suggestion. A blocker that gets fixed together with a refactor
|
|
54
|
+
cannot be verified on its own.
|