santifer/career-ops · error · Error

consider: ${entry.name} needs a 'consider_board' id in porta

Error message

consider: ${entry.name} needs a 'consider_board' id in portals.yml

What it means

The Consider board id is not derivable from the hostname (e.g. Founderful's board id is 'wingman'), so the entry must declare it explicitly via `consider_board` in portals.yml. fetch throws this when the origin resolved fine but entry.consider_board is missing/empty, since the search POST body needs board.id.

Source

Thrown at providers/consider.mjs:151

  if (Array.isArray(job.normalizedLocations) && job.normalizedLocations.length) {
    return job.normalizedLocations.map(l => l?.label || l?.value).filter(Boolean).join(', ');
  }
  return job.remote ? 'Remote' : '';
}

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

  detect(entry) {
    const origin = resolveOrigin(entry);
    return entry.consider_board && origin ? { url: origin + ENDPOINT_PATH } : null;
  },

  async fetch(entry, ctx) {
    const origin = resolveOrigin(entry);
    if (!origin) throw new Error(`consider: ${entry.name} needs an https careers_url on a public host`);
    if (!entry.consider_board) throw new Error(`consider: ${entry.name} needs a 'consider_board' id in portals.yml`);
    const size = Number.isInteger(entry.consider_size) && entry.consider_size > 0 ? entry.consider_size : DEFAULT_SIZE;

    // Perform the CSRF handshake before the POST. ctx._acquireHandshake is a
    // test seam: set it to a stub in unit tests so no real network call is made.
    const { cookie, csrfToken } = await (
      typeof ctx._acquireHandshake === 'function'
        ? ctx._acquireHandshake(origin)
        : acquireCsrfHandshake(origin)
    );

    const csrfHeaders = {};
    if (cookie) csrfHeaders.cookie = cookie;
    if (csrfToken) csrfHeaders['x-csrf-token'] = csrfToken;

    const json = await ctx.fetchJson(origin + ENDPOINT_PATH, {
      method: 'POST',
      // redirect:'error' so a 3xx from the (config-driven) board host can't be
      // followed to a private/metadata IP — the host guard above pins the first hop.

View on GitHub (pinned to 1696bec4d0)

Solutions

  1. Add `consider_board: <board-id>` to the entry, e.g. consider_board: wingman for Founderful.
  2. Find the board id from a headless/network capture of the board's POST to /api-boards/search-jobs (the body's board.id field).
  3. Fix field-name typos — the provider reads exactly entry.consider_board.
  4. Verify the id is a non-empty string (numbers coerce via String() in the body, but empty/undefined throws).

Example fix

# before
- name: Founderful (portfolio)
  provider: consider
  careers_url: https://jobs.founderful.com/jobs
# after
- name: Founderful (portfolio)
  provider: consider
  consider_board: wingman
  careers_url: https://jobs.founderful.com/jobs
Defensive patterns

Strategy: validation

Validate before calling

function hasConsiderBoard(entry) {
  return typeof entry.consider_board === 'string' && entry.consider_board.length > 0;
}
if (entry.provider === 'consider' && !hasConsiderBoard(entry)) {
  throw new Error(`${entry.name}: consider_board is required`);
}

Type guard

function hasConsiderBoardId(e) {
  return e != null && typeof e.consider_board === 'string' && e.consider_board.trim().length > 0;
}

Try / catch

try {
  await scanEntry(entry);
} catch (e) {
  if (e.message.includes("needs a 'consider_board' id")) {
    console.error(`${entry.name}: add consider_board: <board-id> (not derivable from the hostname)`);
  } else throw e;
}

Prevention

When it happens

Trigger: A consider entry with a valid public https careers_url but no consider_board field, an empty string, or a wrong-typed value (e.g. consider_size set instead). The check `if (!entry.consider_board)` fires right after the origin check passes.

Common situations: Assuming the board id equals the subdomain (it usually doesn't); copying an entry template from another provider (greenhouse/ashby style) that has no consider_board key; renaming the field by mistake (board, board_id).

Related errors


AI-assisted analysis of santifer/career-ops@1696bec4d0 (2026-09-01). Data as JSON: /api/errors/c326befe5123a95b. Report an issue: GitHub.