remoteintech/remote-jobs · error
Missing required section: "## ${section}"
Error message
Missing required section: "## ${section}" What it means
Required-section check at lines 167-177. After stripping the frontmatter block, each section in REQUIRED_SECTIONS = ['Company blurb', 'Remote status', 'How to apply'] is matched by the regex /^##\s+<escaped section>\s*$/m. The heading must be exactly a level-2 (`##`) heading whose only text is the section name — level-1, level-3, trailing colons, trailing text, or extra whitespace all fail.
Source
Thrown at .github/scripts/validate-companies.js:175
`Invalid \`website\` URL: "${data.website}". Must be a full URL starting with https:// or http://`
);
}
if (data.careers_url && !isValidUrl(data.careers_url)) {
errors.push(
`Invalid \`careers_url\`: "${data.careers_url}". Must be a full URL starting with https:// or http://`
);
}
// Check required markdown sections
const bodyContent = content.replace(/^---[\s\S]*?---/, "");
for (const section of REQUIRED_SECTIONS) {
const sectionPattern = new RegExp(
`^##\\s+${escapeRegExp(section)}\\s*$`,
"m"
);
if (!sectionPattern.test(bodyContent)) {
errors.push(`Missing required section: "## ${section}"`);
}
}
// Check that "Company blurb" has content (not just the heading)
const blurbMatch = bodyContent.match(
/^##\s+Company blurb\s*\n([\s\S]*?)(?=^##\s|\s*$)/m
);
if (blurbMatch && !blurbMatch[1].trim()) {
warnings.push(
'The "Company blurb" section is empty. Please add a description of the company.'
);
}
return { errors, warnings };
}
function isValidUrl(str) {
try {View on GitHub (pinned to b1dd8deb19)
Solutions
- Add each missing section as `## <Section Name>` exactly, on its own line, level-2 only.
- Confirm there is no trailing punctuation or whitespace after the heading text.
- Re-run the validator to confirm the section passes.
Example fix
// before # Company blurb Acme makes things. // after ## Company blurb Acme makes things.
Defensive patterns
Strategy: validation
Validate before calling
const REQUIRED_SECTIONS = ['Company blurb', 'Remote status', 'How to apply'];
function missingSections(body) {
return REQUIRED_SECTIONS.filter(s =>
!new RegExp(`^##\\s+${escapeRegExp(s)}\\s*$`, 'm').test(body));
} Type guard
function hasRequiredSections(body) {
return REQUIRED_SECTIONS.every(s =>
new RegExp(`^##\\s+${escapeRegExp(s)}\\s*$`, 'm').test(body));
} Prevention
- Use exactly level-2 (`##`) headings with the literal section names.
- Don't append colons or extra words to the heading text.
- Start from the canonical template so all three sections are present from the outset.
When it happens
Trigger: Section is absent; uses the wrong heading level (`#` or `###`); heading has trailing punctuation (`## Company blurb:`); heading has trailing whitespace stripped inconsistently; the body kept the heading inside a code fence so it isn't a real heading.
Common situations: Contributor unfamiliar with the template uses h1 for the title and h3 for subsections; markdown linter rewrites heading levels; autoformatter adds trailing colons.
Related errors
- Missing YAML frontmatter. The file must start with `---` fol
- The "Company blurb" section is empty. Please add a descripti
- Missing required field: `${field}`
- Invalid `region`: "${data.region}". Must be one of: ${VALID_
- Invalid `remote_policy`: "${data.remote_policy}". Must be on
AI-assisted analysis of remoteintech/remote-jobs@b1dd8deb19 (2026-08-13).
Data as JSON: /api/errors/7edbbf2b3a13e96d.
Report an issue: GitHub.