{"record":{"id":"4566c2b367cf5c52","repo":"santifer/career-ops","slug":"e-num-company-company-looks-like-a-confi","errorCode":null,"errorMessage":"#${e.num}: company \"${company}\" looks like a confidentiality placeholder — use the structural marker ? (locale-invariant, can't collide with a real firm)","messagePattern":"#(.+?): company \"(.+?)\" looks like a confidentiality placeholder — use the structural marker \\? \\(locale-invariant, can't collide with a real firm\\)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"verify-pipeline.mjs","lineNumber":387,"sourceCode":"// application was direct). Unknown employers use the structural marker `?` in\n// Company — never a word like \"Confidential\", which is locale-dependent and can\n// collide with a real firm name.\nlet viaIssues = 0;\nconst CONFIDENTIAL_WORD_RE = /^(confidential|vertraulich|confidentiel|confidencial|riservato|gizli|機密|سري)$/i;\nfor (const e of entries) {\n  const company = String(e.company || '').trim();\n  const via = String(e.via || '').trim();\n  if (company === '?') {\n    if (COLMAP.via == null) {\n      warn(`#${e.num}: unknown employer (?) but the tracker has no Via column — add it with: node merge-tracker.mjs --migrate-via`);\n      viaIssues++;\n    } else if (!via || via === '—') {\n      error(`#${e.num}: unknown employer (?) with no Via channel — record the agency/recruiter firm`);\n      viaIssues++;\n    }\n  }\n  if (CONFIDENTIAL_WORD_RE.test(company)) {\n    warn(`#${e.num}: company \"${company}\" looks like a confidentiality placeholder — use the structural marker ? (locale-invariant, can't collide with a real firm)`);\n    viaIssues++;\n  }\n}\n// Same company+role reached through different channels: both submissions are\n// real, so this is a warning to the human (double-submission risk), never an\n// auto-merge. Channel identity uses the shared normalizeVia() that merge-tracker\n// and dedup-tracker key agencies with (#2397), so \"Hays\" and \"HAYS \" read as one\n// channel while リクルート and パーソル stay two; the raw spelling is kept for\n// the message. Before this, both non-Latin agencies normalized to '' and fell\n// back to 'direct', hiding exactly the double-submission this check exists for.\nconst normalizeChannel = (v) => normalizeVia(v ?? '') || 'direct';\nconst channelsByRole = new Map();\nfor (const e of entries) {\n  const company = String(e.company || '').trim();\n  if (!company || company === '?') continue;\n  const key = `${company.toLowerCase()}::${String(e.role || '').trim().toLowerCase()}`;\n  if (!channelsByRole.has(key)) channelsByRole.set(key, new Map());\n  const channels = channelsByRole.get(key);","sourceCodeStart":369,"sourceCodeEnd":405,"githubUrl":"https://github.com/santifer/career-ops/blob/e7abd431fce9348a95261acac9e0c14779c35df8/verify-pipeline.mjs#L369-L405","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","solutions":["Replace the placeholder company text in that tracker row with the structural marker `?` (locale-invariant)","Record the actual agency/recruiter firm in the Via column (`via=Hays`) so the channel is known","Re-run `node verify-pipeline.mjs` to confirm the warning clears","If the employer name becomes known later, replace `?` with the real company name"],"exampleFix":"// before (applications.md row)\n| 42 | 2026-09-01 | Confidential | Backend Engineer | 4.2/5 | Applied | ... |\n// after\n| 42 | 2026-09-01 | ? | Backend Engineer | 4.2/5 | Applied | ... | via=Hays |","handlingStrategy":"validation","validationCode":"const CONFIDENTIAL_WORD_RE = /confidential|undisclosed|withheld/i;\nif (CONFIDENTIAL_WORD_RE.test(row.company)) row.company = '?';","typeGuard":"const isPlaceholderCompany = (c) => typeof c === 'string' && /confidential|undisclosed|withheld/i.test(c.trim());","tryCatchPattern":null,"preventionTips":["Never type 'Confidential' into the tracker Company field — use `?`","Always pair `?` with a real via=Agency value","Backfill employer names when they become known","Run verify-pipeline.mjs after any hand edit of applications.md"],"tags":["data-contract","tracker","validation"],"backgroundTag":"invalid-config-value","analyzedSha":"e7abd431fce9348a95261acac9e0c14779c35df8","analyzedAt":"2026-09-16T06:35:29.214Z","contentChangedAt":"2026-09-16T06:35:29.214Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}