job-forge 2.14.0 → 2.14.2

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.
@@ -41,6 +41,9 @@ AI-powered job search pipeline: scans portals, evaluates offers, generates CVs v
41
41
  - [D3] Upgrade `apply` routing to `@general-paid` when offer score ≥ 4.0/5, when user flags "top-tier / dream job / high-stakes", or when late-stage pipeline (post-screens).
42
42
  why: form-fill flows are 6+ steps; free-tier sometimes aborts mid-flow on large Greenhouse/Workday schemas; paid tier has more headroom
43
43
 
44
+ - [D3f] **Provider-failure downgrade on `apply` (all harnesses; OpenCode + OpenRouter especially):** If you dispatched `@general-paid` per [D3] and that subagent fails or exhausts retries with provider-side errors — copy mentioning Venice / Diem / Chutes, "insufficient" USD/credits/funds/balance, HTTP 402/429, overload / temporarily unavailable — re-dispatch the **same apply URL** once on `@general-free` before marking FAILED. Do not abandon the role solely because the upgraded tier hit a pool-specific limit.
45
+ why: `@general-paid` on OpenCode still uses free OpenRouter model ids; Venice-style balance errors are a backend-route issue, not proof that procedural `@general-free` cannot complete the same Greenhouse-style flow after [D5]/[H2] gates pass
46
+
44
47
  - [D4] Auto-submit for offers scoring 3.0+/5 without pausing for confirmation between steps — scan → evaluate → apply is one continuous pipeline. Mark SKIP for <3.0 and move on.
45
48
  why: JobForge is designed for end-to-end automation; pausing between steps defeats the purpose and the 3.0 gate already enforces quality
46
49
 
@@ -57,7 +60,7 @@ AI-powered job search pipeline: scans portals, evaluates offers, generates CVs v
57
60
  3. Apply [D1]: batch/Geometra work → delegate; single/read-only/dev → inline.
58
61
  4. Before any `task` batch using Geometra, run cleanup [H3].
59
62
  5. Before `apply`, run duplicate check [H2] and location filter [D5].
60
- 6. Route by cost tier [D2]; upgrade to `@general-paid` per [D3] for high-stakes offers.
63
+ 6. Route by cost tier [D2]; upgrade to `@general-paid` per [D3] for high-stakes offers; if that apply dispatch hits provider errors, downgrade once per [D3f].
61
64
  7. Cap parallelism at 2 per round [H1].
62
65
  8. One in-flight dispatch per company [H5].
63
66
  9. Orchestrator does not fill forms in multi-job mode [H4].
@@ -8,10 +8,12 @@ tools:
8
8
  temperature: 0.3
9
9
  reasoningEffort: medium
10
10
  fallback_models:
11
- - openrouter/nvidia/nemotron-3-super-120b-a12b:free
12
11
  - openrouter/openai/gpt-oss-120b:free
12
+ - openrouter/nvidia/nemotron-3-super-120b-a12b:free
13
13
  - openrouter/z-ai/glm-4.5-air:free
14
14
  - openrouter/qwen/qwen3-coder:free
15
+ - openrouter/google/gemma-4-31b-it:free
16
+ - openrouter/meta-llama/llama-3.3-70b-instruct:free
15
17
  ---
16
18
 
17
19
  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.
@@ -7,5 +7,16 @@
7
7
  "openrouter/z-ai/glm-4.5-air:free",
8
8
  "openrouter/nvidia/nemotron-3-super-120b-a12b:free",
9
9
  "openrouter/qwen/qwen3-next-80b-a3b-instruct:free"
10
+ ],
11
+ "retryable_error_patterns": [
12
+ "\\bvenice\\b",
13
+ "insufficient\\s+usd",
14
+ "insufficient\\s+.*\\s+diem",
15
+ "diem\\s+balance",
16
+ "add\\s+credits",
17
+ "chutes",
18
+ "insufficient\\s+(?:credits?|funds?|balance)",
19
+ "credit.*balance.*too.*low",
20
+ "(?:temporarily\\s+)?unavailable|overloaded|try\\s+again"
10
21
  ]
11
22
  }
package/AGENTS.md CHANGED
@@ -36,6 +36,9 @@ AI-powered job search pipeline: scans portals, evaluates offers, generates CVs v
36
36
  - [D3] Upgrade `apply` routing to `@general-paid` when offer score ≥ 4.0/5, when user flags "top-tier / dream job / high-stakes", or when late-stage pipeline (post-screens).
37
37
  why: form-fill flows are 6+ steps; free-tier sometimes aborts mid-flow on large Greenhouse/Workday schemas; paid tier has more headroom
38
38
 
39
+ - [D3f] **Provider-failure downgrade on `apply` (all harnesses; OpenCode + OpenRouter especially):** If you dispatched `@general-paid` per [D3] and that subagent fails or exhausts retries with provider-side errors — copy mentioning Venice / Diem / Chutes, "insufficient" USD/credits/funds/balance, HTTP 402/429, overload / temporarily unavailable — re-dispatch the **same apply URL** once on `@general-free` before marking FAILED. Do not abandon the role solely because the upgraded tier hit a pool-specific limit.
40
+ why: `@general-paid` on OpenCode still uses free OpenRouter model ids; Venice-style balance errors are a backend-route issue, not proof that procedural `@general-free` cannot complete the same Greenhouse-style flow after [D5]/[H2] gates pass
41
+
39
42
  - [D4] Auto-submit for offers scoring 3.0+/5 without pausing for confirmation between steps — scan → evaluate → apply is one continuous pipeline. Mark SKIP for <3.0 and move on.
40
43
  why: JobForge is designed for end-to-end automation; pausing between steps defeats the purpose and the 3.0 gate already enforces quality
41
44
 
@@ -52,7 +55,7 @@ AI-powered job search pipeline: scans portals, evaluates offers, generates CVs v
52
55
  3. Apply [D1]: batch/Geometra work → delegate; single/read-only/dev → inline.
53
56
  4. Before any `task` batch using Geometra, run cleanup [H3].
54
57
  5. Before `apply`, run duplicate check [H2] and location filter [D5].
55
- 6. Route by cost tier [D2]; upgrade to `@general-paid` per [D3] for high-stakes offers.
58
+ 6. Route by cost tier [D2]; upgrade to `@general-paid` per [D3] for high-stakes offers; if that apply dispatch hits provider errors, downgrade once per [D3f].
56
59
  7. Cap parallelism at 2 per round [H1].
57
60
  8. One in-flight dispatch per company [H5].
58
61
  9. Orchestrator does not fill forms in multi-job mode [H4].
package/CLAUDE.md CHANGED
@@ -36,6 +36,9 @@ AI-powered job search pipeline: scans portals, evaluates offers, generates CVs v
36
36
  - [D3] Upgrade `apply` routing to `@general-paid` when offer score ≥ 4.0/5, when user flags "top-tier / dream job / high-stakes", or when late-stage pipeline (post-screens).
37
37
  why: form-fill flows are 6+ steps; free-tier sometimes aborts mid-flow on large Greenhouse/Workday schemas; paid tier has more headroom
38
38
 
39
+ - [D3f] **Provider-failure downgrade on `apply` (all harnesses; OpenCode + OpenRouter especially):** If you dispatched `@general-paid` per [D3] and that subagent fails or exhausts retries with provider-side errors — copy mentioning Venice / Diem / Chutes, "insufficient" USD/credits/funds/balance, HTTP 402/429, overload / temporarily unavailable — re-dispatch the **same apply URL** once on `@general-free` before marking FAILED. Do not abandon the role solely because the upgraded tier hit a pool-specific limit.
40
+ why: `@general-paid` on OpenCode still uses free OpenRouter model ids; Venice-style balance errors are a backend-route issue, not proof that procedural `@general-free` cannot complete the same Greenhouse-style flow after [D5]/[H2] gates pass
41
+
39
42
  - [D4] Auto-submit for offers scoring 3.0+/5 without pausing for confirmation between steps — scan → evaluate → apply is one continuous pipeline. Mark SKIP for <3.0 and move on.
40
43
  why: JobForge is designed for end-to-end automation; pausing between steps defeats the purpose and the 3.0 gate already enforces quality
41
44
 
@@ -52,7 +55,7 @@ AI-powered job search pipeline: scans portals, evaluates offers, generates CVs v
52
55
  3. Apply [D1]: batch/Geometra work → delegate; single/read-only/dev → inline.
53
56
  4. Before any `task` batch using Geometra, run cleanup [H3].
54
57
  5. Before `apply`, run duplicate check [H2] and location filter [D5].
55
- 6. Route by cost tier [D2]; upgrade to `@general-paid` per [D3] for high-stakes offers.
58
+ 6. Route by cost tier [D2]; upgrade to `@general-paid` per [D3] for high-stakes offers; if that apply dispatch hits provider errors, downgrade once per [D3f].
56
59
  7. Cap parallelism at 2 per round [H1].
57
60
  8. One in-flight dispatch per company [H5].
58
61
  9. Orchestrator does not fill forms in multi-job mode [H4].
@@ -196,6 +196,7 @@ const opencodeCfg = {
196
196
  'nvidia/nemotron-nano-9b-v2:free': {},
197
197
  'google/gemma-4-26b-a4b-it:free': {},
198
198
  'google/gemma-4-31b-it:free': {},
199
+ 'meta-llama/llama-3.3-70b-instruct:free': {},
199
200
  },
200
201
  },
201
202
  },
@@ -140,14 +140,16 @@ Default chains ship upstream in each agent's YAML frontmatter (`node_modules/job
140
140
  | Agent | Primary | Fallback chain (in order) |
141
141
  |-------|---------|---------------------------|
142
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` |
143
+ | `@general-paid` | `openrouter/qwen/qwen3-next-80b-a3b-instruct:free` | `openrouter/openai/gpt-oss-120b:free` → `openrouter/nvidia/nemotron-3-super-120b-a12b:free` → `openrouter/z-ai/glm-4.5-air:free` → `openrouter/qwen/qwen3-coder:free` → `openrouter/google/gemma-4-31b-it:free` → `openrouter/meta-llama/llama-3.3-70b-instruct:free` |
144
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
 
148
- Consumers **do not need to configure anything** to get these defaults: the subagent chains arrive via the symlinked agent MD files, and the harness also ships `.opencode/opencode-model-fallback.json` for the main orchestrator / any agent without its own list. `@razroo/opencode-model-fallback` (≥0.3.1) reads per-agent chains from the frontmatter-derived `fallback_models` field and falls through to the global file when no per-agent list exists. The consumer's `opencode.json` only needs `"plugin": ["@razroo/opencode-model-fallback"]` — which the scaffolder sets automatically.
148
+ Consumers **do not need to configure anything** to get these defaults: the subagent chains arrive via the symlinked agent MD files, and the harness ships `.opencode/opencode-model-fallback.json` for the main orchestrator / any agent without its own list. That JSON is **generated by `@razroo/iso-harness`** from the top-level `opencodeModelFallback` object in the harness's `iso/config.json` (same `iso build` pass as `opencode.json`), so it stays in sync with published releases — not a hand-edited file in git. `@razroo/opencode-model-fallback` (≥0.3.1) reads per-agent chains from the frontmatter-derived `fallback_models` field and falls through to the global file when no per-agent list exists. The consumer's `opencode.json` only needs `"plugin": ["@razroo/opencode-model-fallback"]` — which the scaffolder sets automatically.
149
149
 
150
- **When fallback fires:** the plugin pattern-matches rate-limit / 5xx / quota / "overloaded" / "insufficient credits" errors. Failed models enter a 60-second cooldown before they're retried. Every rotation logs to `~/.config/opencode/opencode-model-fallback.log` with the trigger error, original model, and target model — grep for `"Auto-retrying with fallback model"` to confirm it fired.
150
+ **When fallback fires:** the plugin pattern-matches rate-limit / 5xx / quota / "overloaded" / insufficient-balance style errors (including Venice / Diem copy — see `retryable_error_patterns` in the harness source). Failed models enter a cooldown before they're retried. Every rotation logs to `~/.config/opencode/opencode-model-fallback.log` with the trigger error, original model, and target model — grep for `"Auto-retrying with fallback model"` to confirm it fired.
151
+
152
+ **Orchestrator policy (all harnesses):** if an upgraded `@general-paid` apply still fails after model fallback, follow **[D3f]** in the shared instructions (`AGENTS.md` / `CLAUDE.md` / Cursor rules / Codex `AGENTS.md`) — re-dispatch the same URL once on `@general-free` before marking FAILED.
151
153
 
152
154
  ### Overriding an upstream chain
153
155
 
@@ -165,17 +167,23 @@ Add an `agent.<name>.fallback_models` block to your project's `opencode.json`. T
165
167
 
166
168
  ### Global fallback chain (agents without their own)
167
169
 
168
- Plugin-level config at `.opencode/opencode-model-fallback.json` applies to any agent whose `fallback_models` is empty:
170
+ Source of truth: **`iso/config.json` `opencodeModelFallback`** (iso-harness writes `.opencode/opencode-model-fallback.json` on `npm run build:config` / `prepack`). Applies to the orchestrator and any agent whose `fallback_models` is empty. Example shape:
169
171
 
170
172
  ```json
171
173
  {
172
174
  "cooldown_seconds": 60,
173
175
  "timeout_seconds": 30,
174
176
  "notify_on_fallback": true,
175
- "fallback_models": ["openrouter/openai/gpt-oss-120b:free", "openrouter/z-ai/glm-4.5-air:free"]
177
+ "fallback_models": [
178
+ "openrouter/openai/gpt-oss-120b:free",
179
+ "openrouter/z-ai/glm-4.5-air:free"
180
+ ],
181
+ "retryable_error_patterns": ["(?i)venice.*insufficient"]
176
182
  }
177
183
  ```
178
184
 
185
+ `retryable_error_patterns` extends the plugin's built-in matchers — use it for provider-specific strings (Venice Diem balance, etc.) that do not match the stock regexes.
186
+
179
187
  ### Disabling fallback
180
188
 
181
189
  Remove `"@razroo/opencode-model-fallback"` from `opencode.json:plugin` — agents keep their `model:` primary and errors propagate normally.
@@ -12,13 +12,17 @@ targets:
12
12
  temperature: 0.3
13
13
  reasoningEffort: medium
14
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.
15
+ # openrouter-free preset. First fallbacks intentionally avoid another
16
+ # immediate hop through the same Venice/Qwen pool when OpenRouter
17
+ # returns "[Venice] insufficient …" — gpt-oss-120b + nemotron are
18
+ # usually different backends. Remaining picks stay free-only.
17
19
  fallback_models:
18
- - openrouter/nvidia/nemotron-3-super-120b-a12b:free
19
20
  - openrouter/openai/gpt-oss-120b:free
21
+ - openrouter/nvidia/nemotron-3-super-120b-a12b:free
20
22
  - openrouter/z-ai/glm-4.5-air:free
21
23
  - openrouter/qwen/qwen3-coder:free
24
+ - openrouter/google/gemma-4-31b-it:free
25
+ - openrouter/meta-llama/llama-3.3-70b-instruct:free
22
26
  tools:
23
27
  geometra_*: false
24
28
  gmail_*: false
package/iso/config.json CHANGED
@@ -1,4 +1,26 @@
1
1
  {
2
+ "opencodeModelFallback": {
3
+ "cooldown_seconds": 60,
4
+ "timeout_seconds": 30,
5
+ "notify_on_fallback": true,
6
+ "fallback_models": [
7
+ "openrouter/openai/gpt-oss-120b:free",
8
+ "openrouter/z-ai/glm-4.5-air:free",
9
+ "openrouter/nvidia/nemotron-3-super-120b-a12b:free",
10
+ "openrouter/qwen/qwen3-next-80b-a3b-instruct:free"
11
+ ],
12
+ "retryable_error_patterns": [
13
+ "\\bvenice\\b",
14
+ "insufficient\\s+usd",
15
+ "insufficient\\s+.*\\s+diem",
16
+ "diem\\s+balance",
17
+ "add\\s+credits",
18
+ "chutes",
19
+ "insufficient\\s+(?:credits?|funds?|balance)",
20
+ "credit.*balance.*too.*low",
21
+ "(?:temporarily\\s+)?unavailable|overloaded|try\\s+again"
22
+ ]
23
+ },
2
24
  "targets": {
3
25
  "opencode": {
4
26
  "plugin": ["@razroo/opencode-model-fallback"],
@@ -17,7 +39,8 @@
17
39
  "nvidia/nemotron-3-nano-30b-a3b:free": {},
18
40
  "nvidia/nemotron-nano-9b-v2:free": {},
19
41
  "google/gemma-4-26b-a4b-it:free": {},
20
- "google/gemma-4-31b-it:free": {}
42
+ "google/gemma-4-31b-it:free": {},
43
+ "meta-llama/llama-3.3-70b-instruct:free": {}
21
44
  }
22
45
  }
23
46
  }
@@ -36,6 +36,9 @@ AI-powered job search pipeline: scans portals, evaluates offers, generates CVs v
36
36
  - [D3] Upgrade `apply` routing to `@general-paid` when offer score ≥ 4.0/5, when user flags "top-tier / dream job / high-stakes", or when late-stage pipeline (post-screens).
37
37
  why: form-fill flows are 6+ steps; free-tier sometimes aborts mid-flow on large Greenhouse/Workday schemas; paid tier has more headroom
38
38
 
39
+ - [D3f] **Provider-failure downgrade on `apply` (all harnesses; OpenCode + OpenRouter especially):** If you dispatched `@general-paid` per [D3] and that subagent fails or exhausts retries with provider-side errors — copy mentioning Venice / Diem / Chutes, "insufficient" USD/credits/funds/balance, HTTP 402/429, overload / temporarily unavailable — re-dispatch the **same apply URL** once on `@general-free` before marking FAILED. Do not abandon the role solely because the upgraded tier hit a pool-specific limit.
40
+ why: `@general-paid` on OpenCode still uses free OpenRouter model ids; Venice-style balance errors are a backend-route issue, not proof that procedural `@general-free` cannot complete the same Greenhouse-style flow after [D5]/[H2] gates pass
41
+
39
42
  - [D4] Auto-submit for offers scoring 3.0+/5 without pausing for confirmation between steps — scan → evaluate → apply is one continuous pipeline. Mark SKIP for <3.0 and move on.
40
43
  why: JobForge is designed for end-to-end automation; pausing between steps defeats the purpose and the 3.0 gate already enforces quality
41
44
 
@@ -52,7 +55,7 @@ AI-powered job search pipeline: scans portals, evaluates offers, generates CVs v
52
55
  3. Apply [D1]: batch/Geometra work → delegate; single/read-only/dev → inline.
53
56
  4. Before any `task` batch using Geometra, run cleanup [H3].
54
57
  5. Before `apply`, run duplicate check [H2] and location filter [D5].
55
- 6. Route by cost tier [D2]; upgrade to `@general-paid` per [D3] for high-stakes offers.
58
+ 6. Route by cost tier [D2]; upgrade to `@general-paid` per [D3] for high-stakes offers; if that apply dispatch hits provider errors, downgrade once per [D3f].
56
59
  7. Cap parallelism at 2 per round [H1].
57
60
  8. One in-flight dispatch per company [H5].
58
61
  9. Orchestrator does not fill forms in multi-job mode [H4].
package/opencode.json CHANGED
@@ -25,7 +25,8 @@
25
25
  "nvidia/nemotron-3-nano-30b-a3b:free": {},
26
26
  "nvidia/nemotron-nano-9b-v2:free": {},
27
27
  "google/gemma-4-26b-a4b-it:free": {},
28
- "google/gemma-4-31b-it:free": {}
28
+ "google/gemma-4-31b-it:free": {},
29
+ "meta-llama/llama-3.3-70b-instruct:free": {}
29
30
  }
30
31
  }
31
32
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "job-forge",
3
- "version": "2.14.0",
3
+ "version": "2.14.2",
4
4
  "description": "AI-powered job search pipeline built on opencode",
5
5
  "type": "module",
6
6
  "bin": {
@@ -88,7 +88,7 @@
88
88
  },
89
89
  "devDependencies": {
90
90
  "@razroo/iso": "^0.2.5",
91
- "@razroo/iso-harness": "^0.6.0",
91
+ "@razroo/iso-harness": "^0.6.1",
92
92
  "@razroo/iso-route": "^0.5.0",
93
93
  "@razroo/iso-trace": "^0.1.0",
94
94
  "@razroo/opencode-model-fallback": "^0.3.1"