santifer/career-ops · warning
# : Score has markdown bold
Error message
#${e.num}: Score has markdown bold: "${e.score}" What it means
A warning from verify-pipeline.mjs (Check 7) that a tracker row's Score cell contains markdown bold ('**'), violating the canonical-format rule that statuses/scores carry no markdown decoration. Bold breaks downstream parsers (merge-tracker.mjs's looksLikeScoreCell, stats roll-ups) that expect the literal `X.X/5` form.
Solutions
- Edit the row to strip the asterisks so the cell reads exactly `4.5/5` (or a sentinel `N/A`/`—`/`-`).
- Run `node normalize-statuses.mjs`, which canonicalizes status/score cells, then re-verify.
- If many rows are affected, a one-line sed over the Score column of data/applications.md is safe because `**` never belongs there.
- Prompt-batch workers to emit plain score cells; never render tracker tables as emphasized markdown.
Example fix
// before | 42 | 2026-09-16 | Acme | Sr Backend | **4.5/5** | Applied | ... | // after | 42 | 2026-09-16 | Acme | Sr Backend | 4.5/5 | Applied | ... |
Defensive patterns
Strategy: validation
Validate before calling
const SCORE_RE = /^\d\.\d\/5$|^N\/A$|^—$|-$/; if (!SCORE_RE.test(scoreCell.trim())) fixScoreCell(rowNum, scoreCell);
Prevention
- Never apply markdown emphasis inside tracker table cells.
- Run normalize-statuses.mjs after manual tracker edits.
- Instruct LLM batch workers to emit bare `X.X/5` score cells.
When it happens
Trigger: Running `node verify-pipeline.mjs` when applications.md has a row like `**4.5/5**` — typically from an AI or human writing the table with markdown emphasis, or from a template that bolded the score column.
Common situations: Hand-editing the tracker with a markdown editor that auto-bolds; LLM-generated tracker rows using emphasis; copy-pasting rendered markdown tables back into the file.
Understand the failure class
Background: "Invalid ... format", "must be in format X", "does not look like a ..." — invalid argument format errors across CLI tools and libraries — this error's family across 17 libraries.
Related errors
- INVALID_DATE
- ⚠️ Keep # and # : exact-title match but advanced status…
- Possible duplicates: `).join(', ')} ( — )
- # : — no automatic update
- Conflicting status recommendations require manual review:
AI-assisted analysis of santifer/career-ops@e7abd431fc (2026-09-16).
Data as JSON: /api/errors/50512dba3e4a2c1b.
Report an issue: GitHub.
Appendix: source
Thrown at verify-pipeline.mjs:229
}
if (badRows === 0) ok('All rows properly formatted');
// --- Check 6: Pending TSVs ---
let pendingTsvs = 0;
if (existsSync(ADDITIONS_DIR)) {
const files = readdirSync(ADDITIONS_DIR).filter(f => f.endsWith('.tsv'));
pendingTsvs = files.length;
if (pendingTsvs > 0) {
warn(`${pendingTsvs} pending TSVs in tracker-additions/ (not merged)`);
}
}
if (pendingTsvs === 0) ok('No pending TSVs');
// --- Check 7: Bold in scores ---
let boldScores = 0;
for (const e of entries) {
if (e.score.includes('**')) {
warn(`#${e.num}: Score has markdown bold: "${e.score}"`);
boldScores++;
}
}
if (boldScores === 0) ok('No bold in scores');
// --- Check 8: Stale report-number sentinels (GC) ---
// reserve-report-num.mjs drops NNN-RESERVED.md files in reports/ when a
// number is claimed. If the process crashed before writing the real report
// and deleting the sentinel it will linger. Sentinels older than 4 h are
// stale; remove them here so they don't skew the next slot allocation.
const SENTINEL_MAX_AGE_MS = 4 * 60 * 60 * 1000;
let staleSentinels = 0;
if (existsSync(REPORTS_DIR)) {
const now = Date.now();
for (const name of readdirSync(REPORTS_DIR)) {
if (!name.endsWith('-RESERVED.md')) continue;
const full = join(REPORTS_DIR, name);
try {View on GitHub (pinned to e7abd431fc)