Bhavana's Week 03: The Branches, Not the Happy Path
A Humanitarians AI Fellow explains why the messy edge cases in job posting structured data, not the easy ones, are where real SEO engineering happens.
Getting a website's structured data to render for the easy cases is the simple part. The real test of a job listings site comes from the jobs that do not fit the template cleanly: no salary listed, a title that says "intern," a fully remote role with no office address at all. This week's update from a Humanitarians AI Fellow working on a job seeker platform's SEO is about exactly those messy cases, and why handling them badly is worse than not handling them at all.
Structured data as a contract with Google
The rule the whole video is built on comes before any code: a schema field is a contract with Google. You emit a field only when the data behind it is complete, and you omit it cleanly when it is not. What you never do is fake a value just to fill the gap. That distinction matters more than it might sound, because a half-formed field does not just look sloppy, it teaches Google's crawler a malformed shape it may start expecting elsewhere on the site, which can quietly degrade how the rest of the structured data gets trusted and parsed.
Mapping remote roles and internships
Three messy cases tested that rule directly: a job with no salary listed, a title that says "intern," and a fully remote role with no physical office. The instinct with structured data is often to fill in every field, using placeholders where real data is missing. That instinct is wrong here. A base salary field left half-formed, or a fake street address bolted onto a remote job, teaches the crawler the same malformed pattern the contract rule warns against. So the discipline holds across every field: emit base salary only when the number is actually there, map employment type to intern, part-time, or contractor based on the real title rather than guessing, falling back to full-time only when nothing else fits, and give a remote role a telecommute designation with a country-level requirement instead of inventing an address that does not exist.
Testing when the real data pipeline is down
The harder problem in this update was not the schema logic, it was that there was nothing to test it against. The dev database was empty and nothing was deployed yet, which is where SEO work diverges from most feature work. You are not checking whether something looks right in a browser, you are checking whether it looks right to a crawler, and a crawler needs either real data or a live page to evaluate against. Neither existed. So the variety of test cases got built by hand instead of pulled from the database: four representative jobs, one with a salary, one without, one remote, one an internship, each checked line by line against the schema spec. It is slower than watching an automated check turn green, but it was the only option available while the real data loop was down.
Key takeaways
- Treat a structured data field as a contract with Google: emit it only when complete, omit it cleanly when it is not, and never fill a gap with a fake value.
- A half-formed field, like a placeholder salary, can teach the crawler a malformed shape it starts expecting elsewhere on the site.
- Employment type should map cleanly to real title signals, intern, part-time, or contractor, falling back to full-time rather than guessing.
- A remote role with no office should use a telecommute designation with a country-level requirement, not a fabricated address.
- When no live data or deployed pipeline exists to test against, build a small, representative set of edge cases by hand and check it against the spec line by line.
Try it yourself
Take a function in your own project that emits structured data, and ask Claude for the inputs most likely to break it: the empty field, the wrong type, the case nobody built for. For each one, decide whether it should fail with a clean omission or a safe fallback. This kind of hands-on debugging is a regular part of the work Fellows do in the Humanitarians AI Fellows program.
Chapters
Full transcript(auto-generated, with timestamps)
Dealing with Reality in Job Components
[0:00]Hi, I'm Bavana, a humanitarian's AI fellow. Week three of my jobseker report, where I'm the SEO engineer making Google find and rank our job listings. The site was discoverable, but the component that describes each job only handled the easy ones. This week, the messy jobs, no salary, internships,
Why Structured Data is a Contract
[0:21]Remote office. Here's the rule this video is built on before any code. A schema field is a contract with Google. Emit it only when it's complete. Omit it cleanly when it isn't. And never fake a value to fill the gap. A half-formed field teaches the crawler a malformed shape it may start expecting elsewhere. Three messy cases tested that rule this week. A job with no salary, a title that
Mapping Remote Roles and Internships
[0:45]Says intern, and a remote role with no office at all. The instinct with structured data is to emit every field, filling gaps with placeholders. Wrong instinct. Google treats job posting as a contract and a half-formed base salary teaches the crawler a malformed shape it may start expecting elsewhere. So the rule emit base salary only when the data is actually there and omit it cleanly
Testing When the Real Loop is Down
[1:10]Otherwise same discipline for the rest. Employment type isn't guessed. The title maps cleanly to intern, part-time or contractor and falls back to full-time. And a remote role doesn't get a fake street address. It becomes telecomute with a country level requirement instead. Every field either maps to something real or it doesn't ship. Then the wall. There was no data to point this at. The dev database was empty and nothing was deployed yet. And here's what makes SEO different from most
Recap: Omit, Don't Fake
[1:41]Feature work. You're not checking does this look right in the browser. You're checking does this look right to a crawler. And a crawler needs either real data or a live page. Neither existed. So I built the variety by hand instead of finding it. Four representative jobs, one with salary, one without, one remote, one an internship. And I read the components output against the spec, line by line. Slower than watching a green check mark appear, but the only option when the real loop is down. Recognizing the gap was structural, not personal, was half the lesson. The recap, the branches were the work, not the happy path. Emit a schema field only when it's complete. Omit, don't fake because the parser treats it as a contract. Map employment type and remote cleanly. Never guess. And when the validation loop is missing, build the variety by hand and read it against the spec. The rule this week, the branches, not the happy path. Your turn. Take a function that emits structured data and ask Claude for the inputs that break it. The empty field, the wrong type, the case you didn't build for. Then for each one, ask how it should fail. a clean omission or a safe fallback. Run this and find the branch you're missing.
More from Humanitarians AI Fellows
2:54Bhavana's Week 02: Readable Isn't Findable
2:48Bhavana's Week 04: One Right Page Thirty Times
2:15Bhavana's Week 01: Follow the Spec Until You Shouldn't
2:03Bhavana's Week 05: Swap the Variable
2:30NASA’s ExoMiner: How Explainable AI Validated 301 New Planets
2:41