santifer/career-ops · warning

# : company " " looks like a confidentiality placeholder —…

Error message

#${e.num}: company "${company}" looks like a confidentiality placeholder — use the structural marker ? (locale-invariant, can't collide with a real firm)

What it means

verify-pipeline.mjs Check 11 (Via-channel consistency) warns when a tracker row's Company field matches CONFIDENTIAL_WORD_RE — strings like 'Confidential' or 'Company withheld' used to hide an employer. The pipeline's convention is to write the structural marker `?` in the Company field instead, which is locale-invariant and can't collide with a real firm name, plus record the actual agency/recruiter in the Via channel.

Solutions

  1. Replace the placeholder company text in that tracker row with the structural marker `?` (locale-invariant)
  2. Record the actual agency/recruiter firm in the Via column (`via=Hays`) so the channel is known
  3. Re-run `node verify-pipeline.mjs` to confirm the warning clears
  4. If the employer name becomes known later, replace `?` with the real company name

Example fix

// before (applications.md row)
| 42 | 2026-09-01 | Confidential | Backend Engineer | 4.2/5 | Applied | ... |
// after
| 42 | 2026-09-01 | ? | Backend Engineer | 4.2/5 | Applied | ... | via=Hays |
Defensive patterns

Strategy: validation

Validate before calling

const CONFIDENTIAL_WORD_RE = /confidential|undisclosed|withheld/i;
if (CONFIDENTIAL_WORD_RE.test(row.company)) row.company = '?';

Type guard

const isPlaceholderCompany = (c) => typeof c === 'string' && /confidential|undisclosed|withheld/i.test(c.trim());

Prevention

When it happens

Trigger: Running `node verify-pipeline.mjs` against a tracker where a row's company cell contains a confidentiality placeholder word (e.g. "Confidential", "Undisclosed company") instead of the `?` marker — typically after hand-editing applications.md or backfilling rows from a posting that hid the end employer.

Common situations: Agencies post jobs for unnamed clients; the applicant pastes the posting's 'Confidential company' text straight into the tracker. Non-English variants ('Confidencial', 'Vertraulich') from other job boards also match the regex.

Understand the failure class

Background: "Invalid value" and "allowed values are" config errors: what your library rejected and how to fix it — this error's family across 41 libraries.

Related errors


AI-assisted analysis of santifer/career-ops@e7abd431fc (2026-09-16). Data as JSON: /api/errors/4566c2b367cf5c52. Report an issue: GitHub.

Appendix: source

Thrown at verify-pipeline.mjs:387

// application was direct). Unknown employers use the structural marker `?` in
// Company — never a word like "Confidential", which is locale-dependent and can
// collide with a real firm name.
let viaIssues = 0;
const CONFIDENTIAL_WORD_RE = /^(confidential|vertraulich|confidentiel|confidencial|riservato|gizli|機密|سري)$/i;
for (const e of entries) {
  const company = String(e.company || '').trim();
  const via = String(e.via || '').trim();
  if (company === '?') {
    if (COLMAP.via == null) {
      warn(`#${e.num}: unknown employer (?) but the tracker has no Via column — add it with: node merge-tracker.mjs --migrate-via`);
      viaIssues++;
    } else if (!via || via === '—') {
      error(`#${e.num}: unknown employer (?) with no Via channel — record the agency/recruiter firm`);
      viaIssues++;
    }
  }
  if (CONFIDENTIAL_WORD_RE.test(company)) {
    warn(`#${e.num}: company "${company}" looks like a confidentiality placeholder — use the structural marker ? (locale-invariant, can't collide with a real firm)`);
    viaIssues++;
  }
}
// Same company+role reached through different channels: both submissions are
// real, so this is a warning to the human (double-submission risk), never an
// auto-merge. Channel identity uses the shared normalizeVia() that merge-tracker
// and dedup-tracker key agencies with (#2397), so "Hays" and "HAYS " read as one
// channel while リクルート and パーソル stay two; the raw spelling is kept for
// the message. Before this, both non-Latin agencies normalized to '' and fell
// back to 'direct', hiding exactly the double-submission this check exists for.
const normalizeChannel = (v) => normalizeVia(v ?? '') || 'direct';
const channelsByRole = new Map();
for (const e of entries) {
  const company = String(e.company || '').trim();
  if (!company || company === '?') continue;
  const key = `${company.toLowerCase()}::${String(e.role || '').trim().toLowerCase()}`;
  if (!channelsByRole.has(key)) channelsByRole.set(key, new Map());
  const channels = channelsByRole.get(key);

View on GitHub (pinned to e7abd431fc)