job-forge 2.2.0 → 2.3.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/.cursor/rules/main.mdc +21 -0
- package/AGENTS.md +21 -0
- package/CLAUDE.md +21 -0
- package/iso/instructions.md +21 -0
- package/modes/apply.md +4 -1
- package/package.json +1 -1
package/.cursor/rules/main.mdc
CHANGED
|
@@ -348,6 +348,27 @@ Is the visible value correct?
|
|
|
348
348
|
|
|
349
349
|
**The `invalidCount` from schema is a heuristic, not ground truth.** Always prefer direct observation of field values over the invalid count. If Submit becomes enabled, ignore any remaining invalid fields — the portal accepted the data.
|
|
350
350
|
|
|
351
|
+
**Text-field specific fix — `imeFriendly: true`.** For text fills where the React-controlled input swallows programmatic value assignment (visible value correct, but `invalidCount` stays >0 and Submit is rejected with "flagged as possible spam" or "field required"), pass `imeFriendly: true` to `geometra_fill_fields`. This fires proper composition events (`compositionstart` / `input` / `compositionend`) that clear React's internal validity state. Confirmed fix on Ashby for Supabase (2026-04-19): first submit rejected despite clean fills; refill with `imeFriendly: true` succeeded on retry. Safe to use as default on all Ashby text fields — no cost if not needed.
|
|
352
|
+
|
|
353
|
+
### Ashby Anti-Bot Spam Filter — Two Failure Classes
|
|
354
|
+
|
|
355
|
+
**Symptom:** after a form is filled cleanly (`invalidCount: 0`, all values correct) and Submit is clicked, Ashby returns: *"We couldn't submit your application. Your application submission was flagged as possible spam."*
|
|
356
|
+
|
|
357
|
+
These blocks come from two distinct root causes and require different responses:
|
|
358
|
+
|
|
359
|
+
| Class | Root cause | Recoverable in-session? | Fix |
|
|
360
|
+
|---|---|---|---|
|
|
361
|
+
| **A. React-validation lag** | programmatic text input didn't fire composition events; React marks required fields internally missing even though values look correct | Yes | Refill with `imeFriendly: true` and resubmit once. |
|
|
362
|
+
| **B. Environment fingerprint** | datacenter IP / VPN / headless Chromium signatures / browser-extension tells detected server-side | No (in headless) | Mark `Failed` with note "Ashby env-fingerprint"; recommend manual submit from user's own browser. |
|
|
363
|
+
|
|
364
|
+
**How to tell them apart:** if you saw `invalidCount > 0` and the "required field" error BEFORE submit, class A is likely — retry with `imeFriendly: true`. If the form filled perfectly clean (`invalidCount: 0` on every step) and the spam flag fires only on submit, class B is likely — Ashby's "Learn more" dialog cites VPN/proxy, ad blockers, shared/public network, which `imeFriendly` cannot influence.
|
|
365
|
+
|
|
366
|
+
**Evidence (2026-04-19 session):**
|
|
367
|
+
- Class A confirmed: Supabase #793 (rejected → refilled with `imeFriendly` → applied).
|
|
368
|
+
- Class B confirmed: Unstructured #786 + ClickUp #787 — both filled cleanly with per-field `imeFriendly: true`, both still spam-flagged on submit with identical "VPN / ad blockers / shared network" messaging.
|
|
369
|
+
|
|
370
|
+
**Rule — do NOT loop retrying a class B block.** One retry with `imeFriendly: true` is the correct test for class A. If the same spam message fires after a clean `imeFriendly` refill, stop, mark Failed, move on. Repeated retries waste subagent time and do not change the outcome.
|
|
371
|
+
|
|
351
372
|
### Nested Scroll Containers (Greenhouse / Ashby)
|
|
352
373
|
|
|
353
374
|
The major ATS portals (Greenhouse, Workday, Lever, Ashby) use nested scrollable regions. A field's `visibleBounds` may show it as off-screen even when it is actually visible within a child scroll container. Geometra's `scroll_to` operates on the outermost page scroll, so it cannot reach fields in inner scroll regions.
|
package/AGENTS.md
CHANGED
|
@@ -343,6 +343,27 @@ Is the visible value correct?
|
|
|
343
343
|
|
|
344
344
|
**The `invalidCount` from schema is a heuristic, not ground truth.** Always prefer direct observation of field values over the invalid count. If Submit becomes enabled, ignore any remaining invalid fields — the portal accepted the data.
|
|
345
345
|
|
|
346
|
+
**Text-field specific fix — `imeFriendly: true`.** For text fills where the React-controlled input swallows programmatic value assignment (visible value correct, but `invalidCount` stays >0 and Submit is rejected with "flagged as possible spam" or "field required"), pass `imeFriendly: true` to `geometra_fill_fields`. This fires proper composition events (`compositionstart` / `input` / `compositionend`) that clear React's internal validity state. Confirmed fix on Ashby for Supabase (2026-04-19): first submit rejected despite clean fills; refill with `imeFriendly: true` succeeded on retry. Safe to use as default on all Ashby text fields — no cost if not needed.
|
|
347
|
+
|
|
348
|
+
### Ashby Anti-Bot Spam Filter — Two Failure Classes
|
|
349
|
+
|
|
350
|
+
**Symptom:** after a form is filled cleanly (`invalidCount: 0`, all values correct) and Submit is clicked, Ashby returns: *"We couldn't submit your application. Your application submission was flagged as possible spam."*
|
|
351
|
+
|
|
352
|
+
These blocks come from two distinct root causes and require different responses:
|
|
353
|
+
|
|
354
|
+
| Class | Root cause | Recoverable in-session? | Fix |
|
|
355
|
+
|---|---|---|---|
|
|
356
|
+
| **A. React-validation lag** | programmatic text input didn't fire composition events; React marks required fields internally missing even though values look correct | Yes | Refill with `imeFriendly: true` and resubmit once. |
|
|
357
|
+
| **B. Environment fingerprint** | datacenter IP / VPN / headless Chromium signatures / browser-extension tells detected server-side | No (in headless) | Mark `Failed` with note "Ashby env-fingerprint"; recommend manual submit from user's own browser. |
|
|
358
|
+
|
|
359
|
+
**How to tell them apart:** if you saw `invalidCount > 0` and the "required field" error BEFORE submit, class A is likely — retry with `imeFriendly: true`. If the form filled perfectly clean (`invalidCount: 0` on every step) and the spam flag fires only on submit, class B is likely — Ashby's "Learn more" dialog cites VPN/proxy, ad blockers, shared/public network, which `imeFriendly` cannot influence.
|
|
360
|
+
|
|
361
|
+
**Evidence (2026-04-19 session):**
|
|
362
|
+
- Class A confirmed: Supabase #793 (rejected → refilled with `imeFriendly` → applied).
|
|
363
|
+
- Class B confirmed: Unstructured #786 + ClickUp #787 — both filled cleanly with per-field `imeFriendly: true`, both still spam-flagged on submit with identical "VPN / ad blockers / shared network" messaging.
|
|
364
|
+
|
|
365
|
+
**Rule — do NOT loop retrying a class B block.** One retry with `imeFriendly: true` is the correct test for class A. If the same spam message fires after a clean `imeFriendly` refill, stop, mark Failed, move on. Repeated retries waste subagent time and do not change the outcome.
|
|
366
|
+
|
|
346
367
|
### Nested Scroll Containers (Greenhouse / Ashby)
|
|
347
368
|
|
|
348
369
|
The major ATS portals (Greenhouse, Workday, Lever, Ashby) use nested scrollable regions. A field's `visibleBounds` may show it as off-screen even when it is actually visible within a child scroll container. Geometra's `scroll_to` operates on the outermost page scroll, so it cannot reach fields in inner scroll regions.
|
package/CLAUDE.md
CHANGED
|
@@ -343,6 +343,27 @@ Is the visible value correct?
|
|
|
343
343
|
|
|
344
344
|
**The `invalidCount` from schema is a heuristic, not ground truth.** Always prefer direct observation of field values over the invalid count. If Submit becomes enabled, ignore any remaining invalid fields — the portal accepted the data.
|
|
345
345
|
|
|
346
|
+
**Text-field specific fix — `imeFriendly: true`.** For text fills where the React-controlled input swallows programmatic value assignment (visible value correct, but `invalidCount` stays >0 and Submit is rejected with "flagged as possible spam" or "field required"), pass `imeFriendly: true` to `geometra_fill_fields`. This fires proper composition events (`compositionstart` / `input` / `compositionend`) that clear React's internal validity state. Confirmed fix on Ashby for Supabase (2026-04-19): first submit rejected despite clean fills; refill with `imeFriendly: true` succeeded on retry. Safe to use as default on all Ashby text fields — no cost if not needed.
|
|
347
|
+
|
|
348
|
+
### Ashby Anti-Bot Spam Filter — Two Failure Classes
|
|
349
|
+
|
|
350
|
+
**Symptom:** after a form is filled cleanly (`invalidCount: 0`, all values correct) and Submit is clicked, Ashby returns: *"We couldn't submit your application. Your application submission was flagged as possible spam."*
|
|
351
|
+
|
|
352
|
+
These blocks come from two distinct root causes and require different responses:
|
|
353
|
+
|
|
354
|
+
| Class | Root cause | Recoverable in-session? | Fix |
|
|
355
|
+
|---|---|---|---|
|
|
356
|
+
| **A. React-validation lag** | programmatic text input didn't fire composition events; React marks required fields internally missing even though values look correct | Yes | Refill with `imeFriendly: true` and resubmit once. |
|
|
357
|
+
| **B. Environment fingerprint** | datacenter IP / VPN / headless Chromium signatures / browser-extension tells detected server-side | No (in headless) | Mark `Failed` with note "Ashby env-fingerprint"; recommend manual submit from user's own browser. |
|
|
358
|
+
|
|
359
|
+
**How to tell them apart:** if you saw `invalidCount > 0` and the "required field" error BEFORE submit, class A is likely — retry with `imeFriendly: true`. If the form filled perfectly clean (`invalidCount: 0` on every step) and the spam flag fires only on submit, class B is likely — Ashby's "Learn more" dialog cites VPN/proxy, ad blockers, shared/public network, which `imeFriendly` cannot influence.
|
|
360
|
+
|
|
361
|
+
**Evidence (2026-04-19 session):**
|
|
362
|
+
- Class A confirmed: Supabase #793 (rejected → refilled with `imeFriendly` → applied).
|
|
363
|
+
- Class B confirmed: Unstructured #786 + ClickUp #787 — both filled cleanly with per-field `imeFriendly: true`, both still spam-flagged on submit with identical "VPN / ad blockers / shared network" messaging.
|
|
364
|
+
|
|
365
|
+
**Rule — do NOT loop retrying a class B block.** One retry with `imeFriendly: true` is the correct test for class A. If the same spam message fires after a clean `imeFriendly` refill, stop, mark Failed, move on. Repeated retries waste subagent time and do not change the outcome.
|
|
366
|
+
|
|
346
367
|
### Nested Scroll Containers (Greenhouse / Ashby)
|
|
347
368
|
|
|
348
369
|
The major ATS portals (Greenhouse, Workday, Lever, Ashby) use nested scrollable regions. A field's `visibleBounds` may show it as off-screen even when it is actually visible within a child scroll container. Geometra's `scroll_to` operates on the outermost page scroll, so it cannot reach fields in inner scroll regions.
|
package/iso/instructions.md
CHANGED
|
@@ -343,6 +343,27 @@ Is the visible value correct?
|
|
|
343
343
|
|
|
344
344
|
**The `invalidCount` from schema is a heuristic, not ground truth.** Always prefer direct observation of field values over the invalid count. If Submit becomes enabled, ignore any remaining invalid fields — the portal accepted the data.
|
|
345
345
|
|
|
346
|
+
**Text-field specific fix — `imeFriendly: true`.** For text fills where the React-controlled input swallows programmatic value assignment (visible value correct, but `invalidCount` stays >0 and Submit is rejected with "flagged as possible spam" or "field required"), pass `imeFriendly: true` to `geometra_fill_fields`. This fires proper composition events (`compositionstart` / `input` / `compositionend`) that clear React's internal validity state. Confirmed fix on Ashby for Supabase (2026-04-19): first submit rejected despite clean fills; refill with `imeFriendly: true` succeeded on retry. Safe to use as default on all Ashby text fields — no cost if not needed.
|
|
347
|
+
|
|
348
|
+
### Ashby Anti-Bot Spam Filter — Two Failure Classes
|
|
349
|
+
|
|
350
|
+
**Symptom:** after a form is filled cleanly (`invalidCount: 0`, all values correct) and Submit is clicked, Ashby returns: *"We couldn't submit your application. Your application submission was flagged as possible spam."*
|
|
351
|
+
|
|
352
|
+
These blocks come from two distinct root causes and require different responses:
|
|
353
|
+
|
|
354
|
+
| Class | Root cause | Recoverable in-session? | Fix |
|
|
355
|
+
|---|---|---|---|
|
|
356
|
+
| **A. React-validation lag** | programmatic text input didn't fire composition events; React marks required fields internally missing even though values look correct | Yes | Refill with `imeFriendly: true` and resubmit once. |
|
|
357
|
+
| **B. Environment fingerprint** | datacenter IP / VPN / headless Chromium signatures / browser-extension tells detected server-side | No (in headless) | Mark `Failed` with note "Ashby env-fingerprint"; recommend manual submit from user's own browser. |
|
|
358
|
+
|
|
359
|
+
**How to tell them apart:** if you saw `invalidCount > 0` and the "required field" error BEFORE submit, class A is likely — retry with `imeFriendly: true`. If the form filled perfectly clean (`invalidCount: 0` on every step) and the spam flag fires only on submit, class B is likely — Ashby's "Learn more" dialog cites VPN/proxy, ad blockers, shared/public network, which `imeFriendly` cannot influence.
|
|
360
|
+
|
|
361
|
+
**Evidence (2026-04-19 session):**
|
|
362
|
+
- Class A confirmed: Supabase #793 (rejected → refilled with `imeFriendly` → applied).
|
|
363
|
+
- Class B confirmed: Unstructured #786 + ClickUp #787 — both filled cleanly with per-field `imeFriendly: true`, both still spam-flagged on submit with identical "VPN / ad blockers / shared network" messaging.
|
|
364
|
+
|
|
365
|
+
**Rule — do NOT loop retrying a class B block.** One retry with `imeFriendly: true` is the correct test for class A. If the same spam message fires after a clean `imeFriendly` refill, stop, mark Failed, move on. Repeated retries waste subagent time and do not change the outcome.
|
|
366
|
+
|
|
346
367
|
### Nested Scroll Containers (Greenhouse / Ashby)
|
|
347
368
|
|
|
348
369
|
The major ATS portals (Greenhouse, Workday, Lever, Ashby) use nested scrollable regions. A field's `visibleBounds` may show it as off-screen even when it is actually visible within a child scroll container. Geometra's `scroll_to` operates on the outermost page scroll, so it cannot reach fields in inner scroll regions.
|
package/modes/apply.md
CHANGED
|
@@ -191,7 +191,8 @@ geometra_run_actions({
|
|
|
191
191
|
sessionId: "...",
|
|
192
192
|
actions: [
|
|
193
193
|
{ type: "upload_files", fieldLabel: "Resume/CV", paths: ["/abs/path/cv.pdf"] },
|
|
194
|
-
{ type: "fill_fields",
|
|
194
|
+
{ type: "fill_fields", imeFriendly: true,
|
|
195
|
+
valuesByLabel: { "First Name": "...", "Last Name": "...", ... } },
|
|
195
196
|
{ type: "pick_listbox_option", fieldLabel: "Country", value: "United States" },
|
|
196
197
|
... (one entry per choice/listbox) ...
|
|
197
198
|
{ type: "click", labelOrText: "Submit application" }
|
|
@@ -199,6 +200,8 @@ geometra_run_actions({
|
|
|
199
200
|
})
|
|
200
201
|
```
|
|
201
202
|
|
|
203
|
+
**Always pass `imeFriendly: true` on `fill_fields` for Ashby** (and safe as a default everywhere). Ashby's React form swallows programmatic text input silently — visible value looks correct, `invalidCount` stays >0, and Submit fails with "field required" or "flagged as possible spam." `imeFriendly: true` fires proper composition events that clear React's internal validity state. Confirmed fix: Supabase #793 (2026-04-19). Zero cost on other portals; no reason to leave it off.
|
|
204
|
+
|
|
202
205
|
### Use `fieldLabel` over `fieldId` (Rule B)
|
|
203
206
|
|
|
204
207
|
Labels are stable across DOM refreshes; IDs are not. If `fieldLabel` works, use it everywhere. Only fall back to `fieldId` when two fields share the same label (rare — add a qualifier via sibling text instead).
|