The LinkedIn mark ships in the footer's contact list, and sameAs is derived from the same string
Affects: config/site.ts (socials.linkedin), app/layout.tsx (ORGANIZATION_JSON_LD.sameAs), components/layout/site-footer.tsx, scripts/check-social-identity.mjs, docs/linkedin-company-page.md, docs/company-profiles.md.
What was decided
siteConfig.socials.linkedin now holds https://www.linkedin.com/company/novelsystems-ca. It is the first entry this site has ever published in that object, and the first entry in the Organization graph's sameAs.
Why the slug is not the one every document predicted
Every draft written before the page existed guessed novel-systems. novel-systems is a ten-follower company in Espoo, Finland. It was one of the three wrong links D-098 pulled out of the footer, and it is still wrong today; the difference is that the guess is now provably distinguishable from the real page instead of being one plausible string among several.
What counted as verification
Not "the URL loads". A 200 from an identity host is a true statement about reachability and says nothing about ownership — that distinction is the entire premise of scripts/check-social-identity.mjs. The evidence recorded in the register is that requesting the public vanity URL while signed in redirects to /company/143066613/admin/dashboard/ under the heading "Novel Systems". LinkedIn performs that redirect only for an administrator of the page, so it is a statement about control rather than existence.
Why the mark sits beside the phone number and the email
The footer already had a row of bordered social buttons, and putting it there was the obvious move. It sits in the contact list instead, because the company page is one of the ways to reach the company, alongside the two that were already in that list — and because a "row" holding exactly one button reads as a row with two marks missing. The X and GitHub entries stay in SOCIAL_LINKS with empty hrefs, so the row is simply not rendered; the branch is retained for whichever account is opened next.
It is deliberately not rendered in both places. Two identical LinkedIn glyphs a hundred pixels apart in the same column reads as a bug, and it would be one.
Why sameAs reads from siteConfig rather than holding a literal
Because the alternative is two copies of one fact, which is exactly how the placeholder phone number survived in lib/constants.ts while the footer showed nothing (D-102). The array is built by filtering the three socials values for non-empty strings, so the day GitHub or X is opened, one string changes and both the graph and the footer follow. The filter is load-bearing: an unfiltered spread would emit "" into sameAs, asserting that this organization is also the page at the current URL.
What would make this wrong
Losing administrative control of the page — the register entry names khan.ahmadz6370@gmail.com and dates the check, so it can be re-confirmed rather than trusted indefinitely. If that ever fails, the correct response is to empty the string in config/site.ts, not to delete the register entry: emptying it removes the claim from the graph, the footer and the guard in one edit.