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
- 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
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
- 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
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
- Cross-channel duplicate
- INVALID_DATE
- ⚠️ Non-canonical status
- 4dayweek: invalid URL
- 4dayweek: URL must use HTTPS
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)