<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Nalqerio: AI Visibility & Technical SEO]]></title><description><![CDATA[Nalqerio: AI Visibility & Technical SEO]]></description><link>https://nalqerio.hashnode.dev</link><generator>RSS for Node</generator><lastBuildDate>Tue, 20 Oct 2026 12:40:10 GMT</lastBuildDate><atom:link href="https://nalqerio.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[A small regression check for Organization JSON-LD]]></title><description><![CDATA[Catch stale Organization JSON-LD fields with a local Python check, then review visible evidence. Includes tested examples and validation limits.]]></description><link>https://nalqerio.hashnode.dev/a-small-regression-check-for-organization-json-ld</link><guid isPermaLink="true">https://nalqerio.hashnode.dev/a-small-regression-check-for-organization-json-ld</guid><category><![CDATA[Python]]></category><category><![CDATA[SEO for Developers]]></category><dc:creator><![CDATA[Christof Bartel]]></dc:creator><pubDate>Sun, 11 Oct 2026 11:12:09 GMT</pubDate><content:encoded><![CDATA[<p>A site migration can leave perfectly parseable JSON-LD pointing at an old hostname or mailbox. A syntax check will not tell you whether those values still describe the business. A small regression check can catch a few predictable mistakes before release, while a human reviews the claims it cannot verify.</p>
<p>Disclosure: I own Nalqerio. This article was written with AI assistance and checked against the documentation linked below. The organization, addresses and migration scenario are fictional. The Python example only checks local sample data; it makes no network requests and accesses no server.</p>
<h2>Define a narrow contract</h2>
<p>Suppose the visible contact page for a fictional organization says:</p>
<ul>
<li>Name: Example Workshop</li>
<li>Website: <a href="https://example.com/">https://example.com/</a></li>
<li>Contact email: <a href="mailto:hello@example.com">hello@example.com</a></li>
</ul>
<p>We want those three facts to agree with one Organization object in the page's JSON-LD. This is a release contract chosen for this example, not a list of Google's required properties.</p>
<p>The intended object is:</p>
<pre><code class="language-json">{
  "@context": "https://schema.org",
  "@type": "Organization",
  "@id": "https://example.com/#organization",
  "name": "Example Workshop",
  "url": "https://example.com/",
  "email": "hello@example.com"
}
</code></pre>
<p>Schema.org documents Organization and its properties here:
<a href="https://schema.org/Organization">Schema.org Organization</a></p>
<p>The example deliberately omits ratings, awards, logos and social profiles. Add information only when it is accurate and relevant; the shortest object is not automatically the right one for every site.</p>
<h2>Check the values you actually control</h2>
<p>This standard-library Python example compares three fields. It expects the single Organization object above, after JSON parsing. It does not extract data from a page or resolve a JSON-LD graph.</p>
<pre><code class="language-python">EXPECTED = {
    "name": "Example Workshop",
    "url": "https://example.com/",
    "email": "hello@example.com",
}

def field_mismatches(organization, expected):
    return {
        key: {"expected": value, "actual": organization.get(key)}
        for key, value in expected.items()
        if organization.get(key) != value
    }

assert field_mismatches(dict(EXPECTED), EXPECTED) == {}

stale = dict(EXPECTED, url="https://old.example.com/")
assert set(field_mismatches(stale, EXPECTED)) == {"url"}

missing = dict(EXPECTED)
del missing["email"]
assert field_mismatches(missing, EXPECTED)["email"]["actual"] is None
</code></pre>
<p>All three assertions were executed successfully for this article. That result covers the illustrated field comparison only.</p>
<p>The first assertion passes when the fields match. The second detects an old website URL. The third detects the missing mailbox value. A missing field is a failure of our chosen release contract; that alone does not establish invalid Schema.org markup or ineligibility for a Google feature.</p>
<p>Exact string matching is intentional here. It will also flag a trailing slash or capitalization change. Decide the desired output in advance. Do not normalize away differences casually: changing a path, subdomain or email address can change its meaning.</p>
<p>For production, connect the check to the actual rendered output of your build. Keep the expected values in a maintained source of truth. If the same bug changes both the expected values and generated markup, a green test can still hide the problem. Independently compare the public contact page during review.</p>
<h2>Add a human evidence review</h2>
<p>Use a short review record for each relevant property:</p>
<table>
<thead>
<tr>
<th>Property</th>
<th>Evidence to inspect</th>
<th>Decision</th>
</tr>
</thead>
<tbody><tr>
<td>name</td>
<td>Visible business identity on the page</td>
<td>Does it identify the same organization?</td>
</tr>
<tr>
<td>url</td>
<td>Current public business website</td>
<td>Is this the intended destination?</td>
</tr>
<tr>
<td>email</td>
<td>Published, authorized contact address</td>
<td>Is it current and suitable for public display?</td>
</tr>
<tr>
<td>sameAs, if used</td>
<td>The destination profile and its owner</td>
<td>Is it an identity reference for this organization?</td>
</tr>
<tr>
<td>description, if used</td>
<td>The visible description and actual offer</td>
<td>Are the claims accurate and current?</td>
</tr>
</tbody></table>
<p>The table reviews evidence. It does not suggest that every property is required. An unrelated directory listing is not automatically a suitable sameAs identity reference, and an optimistic description does not become true because it is machine readable.</p>
<p>Google's general structured data guidelines require truthful, relevant information consistent with the page. They also explain that correct markup does not guarantee a rich result:
<a href="https://developers.google.com/search/docs/appearance/structured-data/sd-policies">Google structured data guidelines</a></p>
<h2>Separate the validation questions</h2>
<p>There are several different checks to record:</p>
<ol>
<li>Does the JSON parse?</li>
<li>Are the vocabulary and types appropriate?</li>
<li>Do the facts agree with visible, current content?</li>
<li>If targeting a Google search feature, does the implementation meet that feature's current documentation?</li>
<li>After deployment, is the intended markup actually present on the public page?</li>
</ol>
<p>The local function addresses a small part of question three. It is not a JSON-LD validator, a Rich Results Test replacement or a crawler-access test. Choose additional checks for your real output format, including arrays or @graph if your site uses them.</p>
<p>Nalqerio's business schema guide provides the broader type-selection and validation workflow:
<a href="https://nalqerio.com/knowledge/schema-markup">Business schema markup: examples and validation</a></p>
<p>For Google's interpretation of Organization markup, consult its feature documentation directly:
<a href="https://developers.google.com/search/docs/appearance/structured-data/organization">Google Organization documentation</a></p>
<p>Close a release review with a precise statement: which fields were compared, what evidence was checked, and which validation steps passed. Record search appearances and AI citations separately. Neither a passing assertion nor valid structured data proves that an AI system will cite the page.</p>
]]></content:encoded></item></channel></rss>