Skip to content

Hard-block monday.com apex so it can never be graded#28

Merged
kgowru merged 1 commit into
harden-score-api-and-fern-rerunfrom
kgowru/block-monday-apex
Jun 5, 2026
Merged

Hard-block monday.com apex so it can never be graded#28
kgowru merged 1 commit into
harden-score-api-and-fern-rerunfrom
kgowru/block-monday-apex

Conversation

@kgowru

@kgowru kgowru commented Jun 5, 2026

Copy link
Copy Markdown
Collaborator

The detection fix in #27 correctly rejects the monday.com marketing apex, but the cache lookup in the score route runs before detection — so a stale cached row (or a future detection flake) would still serve a score. This adds an apex-only entry to isBlockedDomain, which runs before the cache and before scoring, guaranteeing the marketing apex monday.com (and www.) is always rejected. Subdomains are explicitly not matched, so developers.monday.com and other docs subdomains stay gradeable.

🤖 Generated with Claude Code

The detection layer already rejects monday.com, but the cache lookup runs
before detection — a stale cached row would still be served. Add an apex-only
block (exact host + www, subdomains excluded) that runs before the cache and
scoring, guaranteeing the marketing apex is rejected while developers.monday.com
and other docs subdomains stay gradeable.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@vercel

vercel Bot commented Jun 5, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
fern-agent-score Ready Ready Preview Jun 5, 2026 1:14am

Request Review

@kgowru kgowru merged commit 18aee75 into harden-score-api-and-fern-rerun Jun 5, 2026
1 check passed
kgowru added a commit that referenced this pull request Jun 5, 2026
* feat: switch category inference from OpenAI to Claude Haiku

Replace gpt-4o-mini with claude-haiku-4-5 in the LLM fallback for
category classification. Uses ANTHROPIC_API_KEY instead of OPENAI_API_KEY.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* feat: redirect known duplicate slugs to canonical leaderboard entry

Add a slug-alias map so typing a domain like monday.com (which resolves
to the weaker "monday" slug) lands on the curated leaderboard entry
"developer-monday-com-apps". Applied in the score API and the company
page so both search and direct navigation redirect to the canonical slug.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix: keep *.ferndocs.com sites distinct from canonical company slug (#23)

Fern preview/staging hosts (*.ferndocs.com) now always slug by URL
instead of the derived company name, so e.g. docusign.ferndocs.com no
longer collapses onto the "docusign" slug and return the cached live
entry. These sites are now graded as distinct entries.

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix: route monday.com to canonical api-reference leaderboard entry (#25)

* fix: route monday.com to canonical api-reference leaderboard entry

The "monday" alias pointed at developer-monday-com-apps, which has since
been hidden (score 68/D). Repoint to developer-monday-com-api-reference,
the visible canonical entry (score 91/A).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix: make slug alias a lookup redirect, never a scoring target

Previously a forced rerun (or dev run) of monday.com would score
https://monday.com and upsert it under the aliased slug
developer-monday-com-api-reference, clobbering the curated A-grade entry.
Now the alias only redirects cache lookups to the existing canonical
entry; scoring always stores under the raw slug.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix: reject apex marketing sites that ship an llms.txt (e.g. monday.com) (#27)

An llms.txt returning 200 short-circuited docs detection, so marketing
homepages that now ship one (monday.com) were graded as docs sites. At a
bare apex/root, llms.txt is no longer sufficient on its own; we defer to
the homepage content check (only a visible marketing page is rejected, and
deeper paths / docs subdomains still pass). Also drop the now-unneeded
monday slug alias.

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix: hard-block monday.com apex so it can never be graded as docs (#28)

The detection layer already rejects monday.com, but the cache lookup runs
before detection — a stale cached row would still be served. Add an apex-only
block (exact host + www, subdomains excluded) that runs before the cache and
scoring, guaranteeing the marketing apex is rejected while developers.monday.com
and other docs subdomains stay gradeable.

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix: redirect monday.com apex to curated developer-docs entry instead of erroring

Hard-blocking monday.com produced a confusing "not eligible for scoring"
dead-end. Instead, drop the apex block and restore the SLUG_ALIASES entry
(monday -> developer-monday-com-api-reference) so the cache lookup surfaces
the existing curated developer-docs entry and the frontend navigates there.
The detection fix still rejects the marketing apex as a backstop, so
monday.com is never scored; developers.monday.com remains gradeable.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix: redirect aliased domains in dev too, before docs detection

The monday.com -> developer-docs redirect lived only inside the prod-gated
cache block, so in local dev it was skipped and monday.com hit the "not a
docs site" detection rejection. Resolve an explicit alias up front (dev and
prod, even with force, before detection): if the curated entry exists, return
{ existing: true, slug } so the frontend navigates straight to it. Falls
through to normal scoring only when the curated entry is missing.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* test: add Vitest framework and cover docs-eligibility / monday behavior

Adds Vitest (npm test / test:watch) with no app changes beyond extracting the
testable logic into lib modules:
- lib/docs-detection.ts: detectDocsUrl + the docs regexes (was inline in the route)
- lib/slug.ts: urlToSlug / nameToSlug (was inline in the route)

Tests (25) cover the eligibility logic with a stubbed fetch:
- docs-detection: subdomain/path/platform acceptance, apex marketing rejection
  even when an llms.txt is present (the monday.com case), llms.txt nuance, and
  unreachable-page handling
- blocked-domains, slug-aliases, slug derivation
- monday-behavior: an executable spec — monday.com apex is not blocked, aliases
  to the curated developer-docs entry, and is rejected by detection as a backstop;
  developers.monday.com stays gradeable

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant