santifer/career-ops · error · Error

wttj: the WTTJ board is global — configure explicit searches

Error message

wttj: the WTTJ board is global — configure explicit searches via `wttj: { queries: ["…"] }`

What it means

WTTJ's board is global and huge, so the provider refuses to scan an arbitrary default slice — it requires an explicit wttj: { queries: [...] } block. resolveConfig throws when, after filtering, there are zero non-empty string queries.

Source

Thrown at providers/wttj.mjs:144

      : 0;
  if (min || max) {
    job.salary = {
      min: min || max,
      max: max || min,
      currency: typeof h.salary_currency === 'string' ? h.salary_currency.trim().toUpperCase() : '',
    };
  }
  return job;
}

/** Resolve config: required queries list + optional per-query hit cap. */
function resolveConfig(entry) {
  const cfg = entry?.wttj && typeof entry.wttj === 'object' ? entry.wttj : {};
  const queries = Array.isArray(cfg.queries)
    ? cfg.queries.filter((q) => typeof q === 'string' && q.trim()).map((q) => q.trim())
    : [];
  if (queries.length === 0) {
    throw new Error(
      'wttj: the WTTJ board is global — configure explicit searches via `wttj: { queries: ["…"] }`',
    );
  }
  const maxHits =
    Number.isInteger(cfg.max_hits) && cfg.max_hits > 0 ? Math.min(cfg.max_hits, MAX_HITS_CAP) : DEFAULT_MAX_HITS;
  return { queries, maxHits };
}

/** @type {Provider} */
export default {
  id: 'wttj',

  detect(entry) {
    return entry?.provider === 'wttj' ? { url: SITE_ORIGIN } : null;
  },

  async fetch(entry, ctx) {
    const { queries, maxHits } = resolveConfig(entry);

View on GitHub (pinned to 9b17a8ac97)

Solutions

  1. Add wttj: { queries: ["finops", "data platform engineer"] } to the entry.
  2. Confirm the YAML indentation puts queries under wttj:, not at the entry root.
  3. Optionally add max_hits (per-query, capped at 200) alongside queries.

Example fix

# before
- name: Welcome to the Jungle
  provider: wttj
# after
- name: Welcome to the Jungle
  provider: wttj
  wttj:
    queries: ["finops", "data platform engineer", "snowflake"]
    max_hits: 100
Defensive patterns

Strategy: validation

Validate before calling

function wttjQueriesConfigured(entry) {
  const cfg = entry?.wttj && typeof entry.wttj === "object" ? entry.wttj : {};
  return Array.isArray(cfg.queries) &&
    cfg.queries.some(q => typeof q === "string" && q.trim());
}
if (entry.provider === "wttj" && !wttjQueriesConfigured(entry)) {
  console.warn(`skip ${entry.name}: add wttj.queries`);
  continue;
}

Type guard

const hasWttjQueries = (e) => Array.isArray(e?.wttj?.queries) &&
  e.wttj.queries.some(q => typeof q === "string" && q.trim());

Prevention

When it happens

Trigger: An entry with provider: wttj but no wttj: block; a wttj: block whose queries is missing / not an array / all-empty / contains non-strings; a typo like query: instead of queries:; queries placed at the entry root instead of under wttj:.

Common situations: User copies the WTTJ sample and deletes the queries; misspells queries; indents queries wrong so it lands outside the wttj: map.

Related errors


AI-assisted analysis of santifer/career-ops@9b17a8ac97 (2026-08-13). Data as JSON: /api/errors/fef876581c7ab69b. Report an issue: GitHub.