Repository navigation
feat(landing): agent-surface contract: home Markdown twin, Accept negotiation, api-catalog, security.txt (T-5785) - #669
Merged
Conversation
…d security.txt (T-5785)
Review or Edit in CodeSandboxOpen the branch in Web Editor • VS Code • Insiders |
…@devino.com (a domain we do not run)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
GetItDone T-5785 (fleet agent-surface contract), applied to useupup.com. Live probe 2026-10-26 with ci-tooling's
scripts/agent-surface/check.py --origin https://useupup.com: 4/9. Failing:index-md,accept-markdown,alternate-link,security-txt,api-catalog. This PR makes the landing app pass all nine.What
/index.md(home Markdown twin)text/markdown,Vary: Accept,Cache-Control: private, no-store,Link: <https://useupup.com/>; rel="canonical"/withAccept: text/markdowntext/htmlcomes beforetext/markdown; browsers,*/*and no Accept keep HTML<link rel="alternate" type="text/markdown" href="https://useupup.com/index.md">in the head andLink: </index.md>; rel="alternate"; type="text/markdown"header (missing:the Markdown Accept, so the Markdown answer carries only its canonical)/.well-known/api-catalogapplication/linkset+jsonwith the RFC 9727 profile,Link: rel="api-catalog"/.well-known/security.txtHow
src/lib/home-markdown.ts) is built from the modules the home page renders: the page title/description (moved verbatim intosrc/lib/home-page.ts,page.tsxnow reads it), the framework registry behind the hero strip and install box, the storage-provider and file-type lists of the features section (planned providers are listed as "On the roadmap", exactly as the page's planned strip), the home FAQ (lib/faqs.ts), the agent-setup pill sentence, and the site's existing links (docs, llms.txt, llms-full.txt, GitHub, Discord). No new claims.rewrites()now returns{ beforeFiles, afterFiles, fallback }; the existing llms/docs-twin/PostHog/Sentry rules moved verbatim intoafterFiles(the telemetry and Sentry tests readafterFilesthrough Next'sloadCustomRoutesand still pass)./index.mdisforce-dynamicso Next's prerenderVarylist cannot replaceVary: Accept.Linkon/./.well-known/*paths are excluded from Next'strailingSlashredirect (verified innext/dist/lib/load-custom-routes.js), so/.well-known/api-catalogis a direct 200, no 308.tsconfig.jsonincludessrc/app/.well-known/**/*.tsbecause**skips dot-dirs.Policy:line on purpose: the repo'sSECURITY.mdnameshello@devino.com(not a devino.ca mailbox), which would contradict the Contact. Left untouched here.src/proxy.ts(visitor cookie,/_t/*telemetry strip) is untouched. Unknown root.mdpaths stay 404;/docs/<slug>.mdtwins,/llms.txtand/agent-setup/prompt.mdare unchanged.api-catalog decision
upup is an SDK, not a hosted API. Its one HTTP API is the one
createUpupHandler()from@useupup/serverserves, and it runs on the developer's own server at whatever prefix they mount it. The catalog therefore lists that API by its wire-level reference,/docs/api-reference/server-http/(item), withservice-doclinks to the HTML page, its Markdown twin/docs/api-reference/server-http.mdand/llms-full.txt. Noservice-desc(there is no OpenAPI description). Theuseupup.com/api/*routes (demo backend, docs search, support form) are deliberately not listed: robots.txt keeps crawlers off/api/and none is offered as a public API. A test pins every catalog URL to a docs page that exists.Tests
src/__tests__/agent-surface.test.ts(23 tests): the/rewrite and Link header replayed through Next's own path andhas/missingmatchers for Markdown, browser,*/*, missing andtext/html, text/markdown;q=0.1Accept values; other pages and.mdpaths untouched; page metadata alternate;/index.mdheaders and body; the twin lists every framework, provider (planned ones only on the roadmap line), file type and FAQ, and links only to sitemap pages or the machine-readable files; api-catalog content type, profile, self-link and that every URL is a served docs page; security.txt fields, and Expires between 30 and 366 days away (deliberately date-bound: renewSECURITY_TXT_EXPIRESinsrc/lib/security-txt.tswhen it fails).typecheck,lint(eslint, max-warnings 0),knip, prettier and the pre-commit core/react/server suites all green.Local check.py result (
next build+next start, production base URL)9/9 (live prod today: 4/9). Also checked by hand on the same server:
/docs/api-reference/server-http.md200text/markdown,/docs/llms.txt200,/react/withAccept: text/markdownstill HTML, HSTS still on/.After promotion
This reaches useupup.com with the next dev→master promotion. Prod proof then:
Expected 9/9. Cloudflare reports
cf-cache-status: DYNAMICfor/today, so the edge does not cache the home HTML and the Markdown answer is never stored (it isprivate, no-storeregardless).Security contact fix (second commit):
SECURITY.mdandCODE_OF_CONDUCT.mdsent reports tohello@devino.com. devino.com is not a Devino domain: its NS is Bluehost and its MX is a separate Outlook tenant, while every fleet domain is on Cloudflare. So vulnerability reports went to a third party. Both now usealaddin@devino.ca, the same contact as the new security.txt and devino.ca's.