Skip to content

[quality] Member profile Sources renders a dead link (www.walmartlabs.com); data-rendered URLs have no link-rot gate #1856

Closed

Description

@hivecommons-hive

Finding

The member directory renders a dead outbound link on the production site.

src/components/MemberDirectory/MemberProfile.js renders every entry of
member.sourceAttribution as a clickable link in the profile Sources
list. For Walmart (data/members.json, .members[96]), that list contains:

https://www.walmartlabs.com

That host no longer exists:

$ getent hosts www.walmartlabs.com
(no A record)
$ getent hosts walmartlabs.com
192.237.192.239  walmartlabs.com        # apex still resolves
$ getent hosts www.walmart.com
184.30.252.175   ...www.walmart.com     # control: resolver is fine
$ curl -sS -o /dev/null -L --max-time 25 -w '%{http_code}\n' https://www.walmartlabs.com
000

So a visitor opening the Walmart profile and clicking its source link gets a
connection failure. This is a broken link on the live site.

Why it rotted silently

The repository already has a link-rot gate, and it deliberately covers
markdown only:

  • .github/workflows/check-links.yml runs weekly and executes
    npm run check:links.
  • check:links -> _check:links -> _check:links-md, which pipes
    _list:check:md (a find . -name '*.md') into markdown-link-check.

URLs that reach the page from data/*.json rather than from a .md file are
therefore never liveness-checked. The dead Walmart link is the symptom; the
absent coverage is the cause, and nothing stops the next one.

I swept the 121 URLs the site actually renders from data/members.json and
data/awards.json (member sourceAttribution, award announcementUrl /
caseStudyUrl / talkUrl). www.walmartlabs.com is the only genuinely dead
one. The other non-2xx responses (403 from adobe.com, ebay.com, blackrock.com,
mercedes-benz.com, ...; 406 from uber.com) are WAF/bot blocking — those hosts
answer, so they are reachable and must not be treated as rot. Any gate added
here has to make that distinction or it will sit permanently red.

Recommendation

Two separable parts.

  1. The gate (pull request follows). Add scripts/check-data-links.mjs
    plus a private _check:links-data script, and have _check:links run it
    after _check:links-md. Because the weekly workflow already invokes
    npm run check:links, this needs no change to
    .github/workflows/check-links.yml
    , and because check:links is not run
    by ci.yml, it adds no network dependency to pull request checks.
    Liveness semantics: a host that answers with any HTTP status other than
    404/410 counts as reachable (so bot-blocking 403/406 passes);
    DNS ENOTFOUND, 404 and 410 count as rot. Following the precedent in
    scripts/check-community-group-links.mjs, a run in which every probe is
    inconclusive fails loudly rather than reporting a false all-clear.

  2. The data itself (needs a maintainer). The Walmart URL is generated,
    not hand-written: it comes from data/enduser-landscape.json, which
    scripts/collect-enduser-members.mjs derives from the pinned
    cncf/landscape snapshot. Editing data/members.json by hand would be
    overwritten by the next npm run generate:members. The durable fix is
    upstream in cncf/landscape (Walmart's homepage_url), which is outside
    this repository. Until that lands, the gate added in part 1 will report it
    on each weekly run.

Remit

ADR 0008 rule 1, first bullet: a defect an end user can observe on the
production site — a broken link. The gate in part 1 is in scope under rule 2
because that user-observable effect depends on it; it is not a coverage- or
mutation-metric change, and it moves none of the frozen thresholds in rule 3.

Priority

  • Impact: medium
  • Effort: low

🐝 Hive Agent: quality | Instance: hosted-available-lke648397-260827-5n31 | SHA: aee93a8

— hive: agent=quality backend=copilot model=claude-opus-5 copilot=1.0.88

Activity

  1. added
    testingApproved by a Hive merger/owner for auto-merge on green CI
    agent/qualityApproved by a Hive merger/owner for auto-merge on green CI
    stage/020-claimedClaimed by the scanner or a relay contributor
    on Oct 23, 2026
  2. hivecommons-hive commented on Oct 23, 2026

    @hivecommons-hive
    ContributorAuthor

    🛠️ Hive agent quality (hive hosted-available-lke648397-260827-5n31) started work on this issue at 2026-10-23T21:26:20Z. A pull request referencing this issue supersedes this mark; it lapses on its own at 2026-10-23T23:26:20Z if none appears.

  3. hivecommons-hive commented on Oct 23, 2026

    @hivecommons-hive
    ContributorAuthor

    Correcting the diagnosis in the issue body, and recording what it changed in the fix.

    I originally described www.walmartlabs.com as having "no A record", based on getent hosts returning nothing. That was imprecise. The authoritative answer is SERVFAIL from a broken delegation, not NXDOMAIN:

    $ curl -H 'accept: application/dns-json' \
        'https://cloudflare-dns.com/dns-query?name=www.walmartlabs.com&type=A'
    {"Status":2, ...
     "Comment":["EDE(22): No Reachable Authority at delegation wmtcdev.com.",
                "EDE(23): Network Error 69.20.95.4:53 returned REFUSED for prod.wmtcdev.com A"]}
    
    walmartlabs.com -> Status 0, A 192.237.192.239   # apex is fine
    www.walmart.com -> Status 0                      # control
    

    So the www label is a CNAME into prod.wmtcdev.com, whose authority no longer answers. The link is still broken for a visitor — the conclusion in the issue stands — but the mechanism is not the one I named.

    This mattered for the fix rather than being a point of pedantry. A resolver reports SERVFAIL to Node as EAI_AGAIN, the code that ordinarily means "temporary", not ENOTFOUND. The gate I first wrote treated only ENOTFOUND as rot, so when I ran it against the real data it reported Walmart as merely unverified and exited 0 — it would have missed the single defect it was built for. #1857 therefore also treats a name that never resolved as dead, but only when another probe in the same run succeeded, which is what distinguishes link rot from a CI runner whose DNS is down.

    Part 2 of the recommendation is unchanged and still needs a human: the URL is generated from the pinned cncf/landscape snapshot, so the durable correction is upstream and outside this repository.


    🐝 Hive Agent: quality | Instance: hosted-available-lke648397-260827-5n31 | SHA: 1c42af1

    — hive: agent=quality backend=copilot model=claude-opus-5 copilot=1.0.88

  4. mrbobbytables commented on Oct 24, 2026

    @mrbobbytables
    Member

    Keeping this open as the user-observable tracking issue. The URL is generated: data/members.json is built from the pinned cncf/landscape snapshot (data/enduser-landscape.json), and upstream landscape.yml still lists https://www.walmartlabs.com as the homepage_url for Walmart (member). A hand edit here would be reverted by the next collect:enduser-members, so the fix is an upstream landscape change followed by a snapshot refresh. Waiting on upstream. #1857 (a new data link-rot gate) was closed under ADR 0008 rule 2; it did not change the link.

  5. 31 remaining items

  6. mrbobbytables commented on Oct 25, 2026

    @mrbobbytables
    Member

    Status after today's refresh:

  7. hivecommons-hive commented on Oct 25, 2026

    @hivecommons-hive
    ContributorAuthor

    PR #1904 covers this issue: #1904

    The PR body says this is partial/non-closing work (Refs/Part of or leave-open wording), so Hive will not add a closing keyword. GitHub will not show its issue-list PR icon without a closing keyword; the stage comment is the link.

  8. hivecommons-hive commented on Oct 25, 2026

    @hivecommons-hive
    ContributorAuthor

    Verification (2026-10-25): the remainder is still open and still upstream-blocked. www.walmartlabs.com still returns SERVFAIL (broken prod.wmtcdev.com delegation, confirmed via Cloudflare DoH, curl exit 56), and cncf/landscape landscape.yml still sets Walmart (member) → homepage_url: https://www.walmartlabs.com on master. Nothing in this repository can close it until the upstream homepage correction lands and the member-refresh lane propagates it. Labelled hive/verified-open; the logo/refresh half is confirmed done per #1898/#1900/#1901.


    🐝 Hive Agent: scanner | Instance: hosted-available-lke648397-260827-5n31 | SHA: unknown

    — hive: agent=scanner backend=copilot model=kimi-k3 copilot=1.0.88

  9. mrbobbytables commented on Oct 25, 2026

    @mrbobbytables
    Member

    Closing as upstream-blocked (maintainer decision; ADR 0008 applies to any later finding on this link).

    Everything this site controls is done: the dead URL is allowlisted in scripts/lib/data-links.mjs with a reason, the data URL link check (#1904) covers the rest of the member directory, and the scheduled data refresh (#1903) will pick up the corrected value automatically once the source changes. The remaining defect is the homepage_url in cncf/landscape landscape.yml, now tracked at cncf/landscape#5222. When that lands, the allowlist entry can be dropped in the same refresh.

    Follow-up tests of the member directory's outbound links (#1857, #1863, #1888) were already declined; please do not re-file.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    agent/qualityApproved by a Hive merger/owner for auto-merge on green CIhive/claimed-by-qualityhive/partially-addressedA merged PR addressed only part of this issue; remainder still actionablehive/verified-opentestingApproved by a Hive merger/owner for auto-merge on green CI

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions