job-forge 2.13.0 → 2.14.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.
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  description: Procedural worker on free-tier model. Use for form filling via Geometra, tracker updates, TSV merges, scan dedup, OTP retrieval, and other mechanical/scripted tasks where quality-sensitive text generation is NOT required.
3
3
  mode: subagent
4
- model: openrouter/minimax/minimax-m2.5:free
4
+ model: openrouter/z-ai/glm-4.5-air:free
5
5
  tools:
6
6
  geometra_connect: true
7
7
  geometra_page_model: true
@@ -17,9 +17,10 @@ tools:
17
17
  temperature: 0.1
18
18
  reasoningEffort: minimal
19
19
  fallback_models:
20
- - openrouter/qwen/qwen3-coder:free
21
- - openrouter/google/gemma-4-26b-a4b-it:free
20
+ - openrouter/minimax/minimax-m2.5:free
22
21
  - openrouter/openai/gpt-oss-20b:free
22
+ - openrouter/nvidia/nemotron-3-nano-30b-a3b:free
23
+ - openrouter/qwen/qwen3-coder:free
23
24
  ---
24
25
 
25
26
  You are the @general-free subagent. You run on a free-tier model, which means the orchestrator has delegated this task to you **specifically because the work is procedural**: deterministic steps, scripted outputs, no nuanced writing required.
@@ -8,9 +8,10 @@ tools:
8
8
  temperature: 0.3
9
9
  reasoningEffort: medium
10
10
  fallback_models:
11
- - openrouter/qwen/qwen3-coder:free
11
+ - openrouter/nvidia/nemotron-3-super-120b-a12b:free
12
12
  - openrouter/openai/gpt-oss-120b:free
13
13
  - openrouter/z-ai/glm-4.5-air:free
14
+ - openrouter/qwen/qwen3-coder:free
14
15
  ---
15
16
 
16
17
  You are the @general-paid subagent. The orchestrator delegated this task to you because it requires quality writing or judgment — the kind of work `@general-free` isn't well-suited for.
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  description: Narrow-scope extractor on free-tier model. Use for single-purpose tasks where the orchestrator passes the exact input and expects a small, structured output — e.g., "extract these 8 fields from this JD text" or "parse this form schema into a label→type map". NOT for multi-step workflows.
3
3
  mode: subagent
4
- model: openrouter/google/gemma-4-26b-a4b-it:free
4
+ model: openrouter/openai/gpt-oss-20b:free
5
5
  tools:
6
6
  geometra_*: false
7
7
  gmail_*: false
@@ -14,9 +14,10 @@ tools:
14
14
  temperature: 0
15
15
  reasoningEffort: none
16
16
  fallback_models:
17
- - openrouter/minimax/minimax-m2.5:free
18
- - openrouter/openai/gpt-oss-20b:free
17
+ - openrouter/google/gemma-4-26b-a4b-it:free
18
+ - openrouter/nvidia/nemotron-nano-9b-v2:free
19
19
  - openrouter/google/gemma-4-31b-it:free
20
+ - openrouter/z-ai/glm-4.5-air:free
20
21
  ---
21
22
 
22
23
  You are the @glm-minimal subagent. You handle narrow, one-shot extractions where the orchestrator has pre-digested the context and just needs you to do a specific transform.
@@ -3,9 +3,9 @@
3
3
  "timeout_seconds": 30,
4
4
  "notify_on_fallback": true,
5
5
  "fallback_models": [
6
- "openrouter/qwen/qwen3-next-80b-a3b-instruct:free",
7
6
  "openrouter/openai/gpt-oss-120b:free",
8
- "openrouter/google/gemma-4-26b-a4b-it:free",
9
- "openrouter/z-ai/glm-4.5-air:free"
7
+ "openrouter/z-ai/glm-4.5-air:free",
8
+ "openrouter/nvidia/nemotron-3-super-120b-a12b:free",
9
+ "openrouter/qwen/qwen3-next-80b-a3b-instruct:free"
10
10
  ]
11
11
  }
@@ -177,17 +177,25 @@ const opencodeCfg = {
177
177
  },
178
178
  // Register the exact OpenRouter free models the harness uses so they're
179
179
  // selectable even if they are not in OpenCode's built-in preloaded set.
180
+ // This list is a superset: role primaries, per-agent fallback chains,
181
+ // and the orchestrator fallback chain.
180
182
  provider: {
181
183
  openrouter: {
182
184
  models: {
185
+ // Orchestrator + agentic coding (role default)
183
186
  'qwen/qwen3-coder:free': {},
187
+ // Role primaries
188
+ 'z-ai/glm-4.5-air:free': {}, // fast
189
+ 'qwen/qwen3-next-80b-a3b-instruct:free': {}, // quality
190
+ 'openai/gpt-oss-20b:free': {}, // minimal
191
+ // Common fallbacks
192
+ 'openai/gpt-oss-120b:free': {},
184
193
  'minimax/minimax-m2.5:free': {},
185
- 'qwen/qwen3-next-80b-a3b-instruct:free': {},
194
+ 'nvidia/nemotron-3-super-120b-a12b:free': {},
195
+ 'nvidia/nemotron-3-nano-30b-a3b:free': {},
196
+ 'nvidia/nemotron-nano-9b-v2:free': {},
186
197
  'google/gemma-4-26b-a4b-it:free': {},
187
198
  'google/gemma-4-31b-it:free': {},
188
- 'openai/gpt-oss-120b:free': {},
189
- 'openai/gpt-oss-20b:free': {},
190
- 'z-ai/glm-4.5-air:free': {},
191
199
  },
192
200
  },
193
201
  },
@@ -18,9 +18,9 @@ Defined in `.opencode/agents/*.md` (shipped in the harness, symlinked into consu
18
18
 
19
19
  | Agent | Model | Reasoning | Use for |
20
20
  |-------|-------|-----------|---------|
21
- | `@general-free` | `openrouter/minimax/minimax-m2.5:free` | `minimal` | Geometra form fills, tracker TSV merges, scan dedup, OTP retrieval via Gmail, scripted pipeline steps |
21
+ | `@general-free` | `openrouter/z-ai/glm-4.5-air:free` | `minimal` | Geometra form fills, tracker TSV merges, scan dedup, OTP retrieval via Gmail, scripted pipeline steps |
22
22
  | `@general-paid` | `openrouter/qwen/qwen3-next-80b-a3b-instruct:free` | `medium` | Offer evaluation narratives (Blocks A-F), cover letters, "Why X?" answers, STAR+R interview stories, LinkedIn outreach prose |
23
- | `@glm-minimal` | `openrouter/google/gemma-4-26b-a4b-it:free` | `none` | Narrow one-shot transforms: "extract these 8 fields from this JD text → JSON", "classify this archetype" |
23
+ | `@glm-minimal` | `openrouter/openai/gpt-oss-20b:free` | `none` | Narrow one-shot transforms: "extract these 8 fields from this JD text → JSON", "classify this archetype" |
24
24
 
25
25
  The full task-to-agent mapping lives in [AGENTS.md → Subagent Routing](../AGENTS.md#subagent-routing--which-agent-for-which-task). The orchestrator (your primary session) is expected to delegate before taking any multi-step action — see the **Pre-flight delegation** rule in AGENTS.md.
26
26
 
@@ -139,9 +139,9 @@ Default chains ship upstream in each agent's YAML frontmatter (`node_modules/job
139
139
 
140
140
  | Agent | Primary | Fallback chain (in order) |
141
141
  |-------|---------|---------------------------|
142
- | `@general-free` | `openrouter/minimax/minimax-m2.5:free` | `openrouter/qwen/qwen3-coder:free` → `openrouter/google/gemma-4-26b-a4b-it:free` → `openrouter/openai/gpt-oss-20b:free` |
143
- | `@general-paid` | `openrouter/qwen/qwen3-next-80b-a3b-instruct:free` | `openrouter/qwen/qwen3-coder:free` → `openrouter/openai/gpt-oss-120b:free` → `openrouter/z-ai/glm-4.5-air:free` |
144
- | `@glm-minimal` | `openrouter/google/gemma-4-26b-a4b-it:free` | `openrouter/minimax/minimax-m2.5:free` → `openrouter/openai/gpt-oss-20b:free` → `openrouter/google/gemma-4-31b-it:free` |
142
+ | `@general-free` | `openrouter/z-ai/glm-4.5-air:free` | `openrouter/minimax/minimax-m2.5:free` `openrouter/openai/gpt-oss-20b:free` → `openrouter/nvidia/nemotron-3-nano-30b-a3b:free` → `openrouter/qwen/qwen3-coder:free` |
143
+ | `@general-paid` | `openrouter/qwen/qwen3-next-80b-a3b-instruct:free` | `openrouter/nvidia/nemotron-3-super-120b-a12b:free` → `openrouter/openai/gpt-oss-120b:free` → `openrouter/z-ai/glm-4.5-air:free` → `openrouter/qwen/qwen3-coder:free` |
144
+ | `@glm-minimal` | `openrouter/openai/gpt-oss-20b:free` | `openrouter/google/gemma-4-26b-a4b-it:free` `openrouter/nvidia/nemotron-nano-9b-v2:free` → `openrouter/google/gemma-4-31b-it:free` → `openrouter/z-ai/glm-4.5-air:free` |
145
145
 
146
146
  These chains are deliberately free-only so the default OpenCode path never needs to pay. **Note:** OpenCode model IDs must use the provider prefix it expects (`openrouter/...`, `opencode/...`, etc.). The raw OpenRouter model slug by itself is not enough.
147
147
 
@@ -172,7 +172,7 @@ Plugin-level config at `.opencode/opencode-model-fallback.json` — applies to a
172
172
  "cooldown_seconds": 60,
173
173
  "timeout_seconds": 30,
174
174
  "notify_on_fallback": true,
175
- "fallback_models": ["openrouter/minimax/minimax-m2.5:free", "openrouter/qwen/qwen3-coder:free"]
175
+ "fallback_models": ["openrouter/openai/gpt-oss-120b:free", "openrouter/z-ai/glm-4.5-air:free"]
176
176
  }
177
177
  ```
178
178
 
@@ -10,10 +10,14 @@ targets:
10
10
  mode: subagent
11
11
  temperature: 0.1
12
12
  reasoningEffort: minimal
13
+ # Primary (z-ai/glm-4.5-air:free) resolves from openrouter-free preset.
14
+ # Fallback chain is ordered by decreasing likelihood of rate-limits,
15
+ # staying within free models that can tool-call Geometra + Gmail MCPs.
13
16
  fallback_models:
14
- - openrouter/qwen/qwen3-coder:free
15
- - openrouter/google/gemma-4-26b-a4b-it:free
17
+ - openrouter/minimax/minimax-m2.5:free
16
18
  - openrouter/openai/gpt-oss-20b:free
19
+ - openrouter/nvidia/nemotron-3-nano-30b-a3b:free
20
+ - openrouter/qwen/qwen3-coder:free
17
21
  tools:
18
22
  geometra_connect: true
19
23
  geometra_page_model: true
@@ -11,10 +11,14 @@ targets:
11
11
  mode: subagent
12
12
  temperature: 0.3
13
13
  reasoningEffort: medium
14
+ # Primary (qwen/qwen3-next-80b-a3b-instruct:free) resolves from the
15
+ # openrouter-free preset. Fallback chain prioritizes models with
16
+ # strong long-form writing judgment over raw size.
14
17
  fallback_models:
15
- - openrouter/qwen/qwen3-coder:free
18
+ - openrouter/nvidia/nemotron-3-super-120b-a12b:free
16
19
  - openrouter/openai/gpt-oss-120b:free
17
20
  - openrouter/z-ai/glm-4.5-air:free
21
+ - openrouter/qwen/qwen3-coder:free
18
22
  tools:
19
23
  geometra_*: false
20
24
  gmail_*: false
@@ -10,10 +10,14 @@ targets:
10
10
  mode: subagent
11
11
  temperature: 0
12
12
  reasoningEffort: none
13
+ # Primary (openai/gpt-oss-20b:free) resolves from openrouter-free
14
+ # preset. Fallback chain sticks to small dense models with reliable
15
+ # structured-output behavior — no creative generation upstream.
13
16
  fallback_models:
14
- - openrouter/minimax/minimax-m2.5:free
15
- - openrouter/openai/gpt-oss-20b:free
17
+ - openrouter/google/gemma-4-26b-a4b-it:free
18
+ - openrouter/nvidia/nemotron-nano-9b-v2:free
16
19
  - openrouter/google/gemma-4-31b-it:free
20
+ - openrouter/z-ai/glm-4.5-air:free
17
21
  tools:
18
22
  geometra_*: false
19
23
  gmail_*: false
package/iso/config.json CHANGED
@@ -8,13 +8,16 @@
8
8
  "openrouter": {
9
9
  "models": {
10
10
  "qwen/qwen3-coder:free": {},
11
- "minimax/minimax-m2.5:free": {},
11
+ "z-ai/glm-4.5-air:free": {},
12
12
  "qwen/qwen3-next-80b-a3b-instruct:free": {},
13
- "google/gemma-4-26b-a4b-it:free": {},
14
- "google/gemma-4-31b-it:free": {},
15
- "openai/gpt-oss-120b:free": {},
16
13
  "openai/gpt-oss-20b:free": {},
17
- "z-ai/glm-4.5-air:free": {}
14
+ "openai/gpt-oss-120b:free": {},
15
+ "minimax/minimax-m2.5:free": {},
16
+ "nvidia/nemotron-3-super-120b-a12b:free": {},
17
+ "nvidia/nemotron-3-nano-30b-a3b:free": {},
18
+ "nvidia/nemotron-nano-9b-v2:free": {},
19
+ "google/gemma-4-26b-a4b-it:free": {},
20
+ "google/gemma-4-31b-it:free": {}
18
21
  }
19
22
  }
20
23
  }
package/models.yaml CHANGED
@@ -9,9 +9,9 @@
9
9
  #
10
10
  # JobForge's subagents bind to preset roles via the `role:` field in
11
11
  # iso/agents/<slug>.md:
12
- # @general-free → role: fast (Haiku / OpenRouter MiniMax M2.5 free / gpt-5.4-mini)
12
+ # @general-free → role: fast (Haiku / OpenRouter GLM 4.5 Air free / gpt-5.4-mini)
13
13
  # @general-paid → role: quality (Opus 4.7 / OpenRouter Qwen3 Next 80B free / gpt-5.4)
14
- # @glm-minimal → role: minimal (Haiku / OpenRouter Gemma 4 26B free / gpt-5.4-nano)
14
+ # @glm-minimal → role: minimal (Haiku / OpenRouter GPT-OSS-20B free / gpt-5.4-nano)
15
15
  #
16
16
  # Override anything by adding fields here. For example, to pin Opus on
17
17
  # Claude Code for the @general-paid (quality) role:
@@ -30,13 +30,3 @@
30
30
  # model: gpt-5.4
31
31
 
32
32
  extends: openrouter-free
33
-
34
- # Only override the preset where we prefer a different OpenRouter pick.
35
- # The preset's quality-tier OpenCode pick is openai/gpt-oss-120b:free;
36
- # we prefer Qwen3 Next 80B for job-application writing quality.
37
- roles:
38
- quality:
39
- targets:
40
- opencode:
41
- provider: openrouter
42
- model: qwen/qwen3-next-80b-a3b-instruct:free
package/opencode.json CHANGED
@@ -3,26 +3,29 @@
3
3
  "model": "openrouter/qwen/qwen3-coder:free",
4
4
  "agent": {
5
5
  "fast": {
6
- "model": "openrouter/minimax/minimax-m2.5:free"
6
+ "model": "openrouter/z-ai/glm-4.5-air:free"
7
7
  },
8
8
  "quality": {
9
9
  "model": "openrouter/qwen/qwen3-next-80b-a3b-instruct:free"
10
10
  },
11
11
  "minimal": {
12
- "model": "openrouter/google/gemma-4-26b-a4b-it:free"
12
+ "model": "openrouter/openai/gpt-oss-20b:free"
13
13
  }
14
14
  },
15
15
  "provider": {
16
16
  "openrouter": {
17
17
  "models": {
18
18
  "qwen/qwen3-coder:free": {},
19
- "minimax/minimax-m2.5:free": {},
19
+ "z-ai/glm-4.5-air:free": {},
20
20
  "qwen/qwen3-next-80b-a3b-instruct:free": {},
21
- "google/gemma-4-26b-a4b-it:free": {},
22
- "google/gemma-4-31b-it:free": {},
23
- "openai/gpt-oss-120b:free": {},
24
21
  "openai/gpt-oss-20b:free": {},
25
- "z-ai/glm-4.5-air:free": {}
22
+ "openai/gpt-oss-120b:free": {},
23
+ "minimax/minimax-m2.5:free": {},
24
+ "nvidia/nemotron-3-super-120b-a12b:free": {},
25
+ "nvidia/nemotron-3-nano-30b-a3b:free": {},
26
+ "nvidia/nemotron-nano-9b-v2:free": {},
27
+ "google/gemma-4-26b-a4b-it:free": {},
28
+ "google/gemma-4-31b-it:free": {}
26
29
  }
27
30
  }
28
31
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "job-forge",
3
- "version": "2.13.0",
3
+ "version": "2.14.0",
4
4
  "description": "AI-powered job search pipeline built on opencode",
5
5
  "type": "module",
6
6
  "bin": {