diff --git a/__tests__/root-static-csp.test.ts b/__tests__/root-static-csp.test.ts index d6b4b9d..2ad57da 100644 --- a/__tests__/root-static-csp.test.ts +++ b/__tests__/root-static-csp.test.ts @@ -37,6 +37,7 @@ function loadWorker() { console, openNext: { fetch: openNextFetch }, withTiming: (handler: RootWorker['fetch']) => handler, + withPublicReadability: (handler: RootWorker['fetch']) => handler, handleAgentEdge: () => null, handleRolePatchAgentRoutes: () => null, isDocumentRequest: () => true, diff --git a/biome.json b/biome.json index 590a467..e99c196 100644 --- a/biome.json +++ b/biome.json @@ -32,7 +32,8 @@ "!**/.pages-deploy", "!**/extension", "!**/*.css", - "!**/design.html" + "!**/design.html", + "!src/lib/agent-surfaces" ] }, "formatter": { diff --git a/knip.json b/knip.json index 8ba91aa..e354593 100644 --- a/knip.json +++ b/knip.json @@ -20,7 +20,7 @@ "agent-edge.mjs", "worker.mjs" ], - "ignore": ["open-next.config.ts"], + "ignore": ["open-next.config.ts", "src/lib/agent-surfaces/**"], "ignoreIssues": { "src/components/ui/**": ["exports", "types"] }, "ignoreDependencies": [ "@mozilla/readability", diff --git a/landing-astro/src/layouts/Layout.astro b/landing-astro/src/layouts/Layout.astro index 38ee683..a7c3306 100644 --- a/landing-astro/src/layouts/Layout.astro +++ b/landing-astro/src/layouts/Layout.astro @@ -28,6 +28,7 @@ const jsonLd = productJsonLd(SITE_URL); {title} + @@ -38,7 +39,7 @@ const jsonLd = productJsonLd(SITE_URL); - + diff --git a/landing-astro/src/lib/product.ts b/landing-astro/src/lib/product.ts index acd67c3..28ca9ac 100644 --- a/landing-astro/src/lib/product.ts +++ b/landing-astro/src/lib/product.ts @@ -1,3 +1,4 @@ +import { publicIdentity } from '../../../src/lib/public-identity'; const PRODUCT_DESCRIPTION = 'Tailor a resume to one job using claims supported by your experience, then review every proposed change before it becomes part of the application.'; @@ -39,8 +40,11 @@ export const PRODUCT_FAQS = [ export const productJsonLd = (siteUrl: string) => ({ '@context': 'https://schema.org', '@graph': [ + publicIdentity['@graph'][0], { '@type': 'WebSite', + '@id': `${siteUrl}/#app`, + publisher: { '@id': 'https://sarthakagrawal.dev/#person' }, name: 'RolePatch', alternateName: ['Role Patch', 'rolepatch.com'], url: siteUrl, diff --git a/landing-astro/src/pages/changelog.astro b/landing-astro/src/pages/changelog.astro index 9588797..e370124 100644 --- a/landing-astro/src/pages/changelog.astro +++ b/landing-astro/src/pages/changelog.astro @@ -1,4 +1,5 @@ --- +import { PublicChangelog } from '../../../src/components/public-changelog'; import Layout from '@/layouts/Layout.astro'; import SiteFooter from '@/components/SiteFooter.astro'; import SiteHeader from '@/components/SiteHeader.astro'; @@ -6,74 +7,13 @@ import SiteHeader from '@/components/SiteHeader.astro'; const TITLE = 'RolePatch changelog — Verified product updates'; const DESCRIPTION = 'Verified RolePatch updates to guest workflows, job discovery, review-first application assistance, receipts, proof, and release checks.'; -const sourceUrl = 'https://github.com/Significant-Hobbies/rolepatch'; -const roadmapUrl = `${sourceUrl}/issues`; -const entries = [ - { - date: 'July 11, 2026', - title: 'Guest workflows became more predictable', - body: 'The test environment now resets browser-local state between runs. That protects the same boundary unsigned users rely on when they keep resumes, searches, and application drafts on one device.', - }, - { - date: 'July 4, 2026', - title: 'Job discovery moved into the product', - body: 'A LinkedIn-focused job browser added quick searches, posting signals, resume-aware ranking, visible match evidence, and reviewed batch queueing. Guests can search and prepare locally without being forced to sign in.', - }, - { - date: 'July 4, 2026', - title: 'Application assistance became receipt-first', - body: 'The reviewed queue added Chrome-assisted ATS fill, guarded submit attempts, provider-aware blockers, field-level details, retry timelines, and copyable audit summaries. Unattended bulk apply remains out of scope.', - }, - { - date: 'July 4, 2026', - title: 'Proof and public release checks shipped', - body: 'RolePatch added a source-backed Proof surface and a release preflight covering type safety, formatting, tests, the extension build, the Cloudflare build, public routes, and responsive browser journeys.', - }, -]; ---
-
-
-
- -

What changed, and why it matters.

-

- Shipped changes live here. Planned work stays in the public issue tracker, where it - cannot be mistaken for a finished feature. -

-
-
- -
-
-
- {entries.map((entry) => ( -
- -
-

{entry.title}

-

{entry.body}

-
-
- ))} -
-
-
-

Inspect the work behind the claims.

-

The canonical repository and its issue tracker are public.

-
- -
-
-
-
+
diff --git a/landing-astro/src/pages/docs.astro b/landing-astro/src/pages/docs.astro index 535468d..1711ab1 100644 --- a/landing-astro/src/pages/docs.astro +++ b/landing-astro/src/pages/docs.astro @@ -1,4 +1,5 @@ --- +import { PublicDocs } from '../../../src/components/public-docs'; import Layout from '@/layouts/Layout.astro'; import SiteFooter from '@/components/SiteFooter.astro'; import SiteHeader from '@/components/SiteHeader.astro'; @@ -7,94 +8,13 @@ const TITLE = 'RolePatch developer docs — Public discovery surfaces'; const DESCRIPTION = 'Documentation for RolePatch’s read-only public catalog, LLM indexes, Markdown negotiation, OpenAPI schema, typed errors, and version policy.'; -const endpoints = [ - ['/api/ai', 'JSON catalog of every public HTML surface and same-origin Markdown alternate.'], - ['/api/public/v1/surfaces/{id}', 'Versioned JSON lookup for one catalog surface. This link uses the home surface as a working example; an unknown id returns a typed problem response.', '/api/public/v1/surfaces/home'], - ['/llms.txt', 'Compact product guidance, best-fit use cases, boundaries, access, and discovery links.'], - ['/llms-full.txt', 'Expanded product brief for agents that need the full product contract.'], - ['/index.md', 'Canonical Markdown explanation of product purpose, evidence rules, access, and state.'], - ['/openapi.json', 'OpenAPI 3.1 description of these read-only discovery routes.'], - ['/sitemap.xml', 'Canonical public route inventory for crawlers.'], -] as const; + ---
-
-
-
- -

Read the product contract. Do not automate the applicant.

-

- RolePatch publishes a small, unauthenticated, read-only interface so agents can - discover the product and understand its limits. Resume tailoring and application - actions remain inside the reviewed user workflow. -

-
-
- -
-
-
- -

Seven public routes. No mutation API.

-

- Use GET or HEAD. These routes require no token or account. They describe RolePatch; - they do not accept a resume, spend credits, fill an ATS, or submit an application. -

-
-
- {endpoints.map(([path, body, href = path]) => ( - - ))} -
-
-
- -
-
-
- -

Ask for Markdown at the page URL.

-

- Send Accept: text/markdown to any cataloged public page, or request its - explicit .md alternate. Negotiated responses include{' '} - Vary: Accept so HTML and Markdown cannot poison one another in a cache. -

-
-
- -

Discovery errors are structured.

-

- Unsupported methods and missing discovery routes return{' '} - application/problem+json with a stable code, status, detail, and - resolution hint. Ordinary product routes keep their own application contracts. -

-
-
- -

Breaking changes get a new major contract.

-

- The OpenAPI info.version follows semantic versioning. A breaking change - gets a new major version; the previous contract remains available for at least 90 - days with Deprecation and Sunset response headers. -

-
-
- -

No public agent can apply on your behalf.

-

- There is no public mutation API, MCP tool, payment-by-agent rail, CAPTCHA bypass, or - unattended file upload. Those absences preserve the review-first product boundary. -

-
-
-
-
+
diff --git a/landing-astro/src/pages/faq.astro b/landing-astro/src/pages/faq.astro index 962d09f..cf9ef7d 100644 --- a/landing-astro/src/pages/faq.astro +++ b/landing-astro/src/pages/faq.astro @@ -1,4 +1,5 @@ --- +import { PublicFaq } from '../../../src/components/public-faq'; import Layout from '@/layouts/Layout.astro'; import SiteFooter from '@/components/SiteFooter.astro'; import SiteHeader from '@/components/SiteHeader.astro'; @@ -22,38 +23,7 @@ const faqJsonLd = {
-
-
-
- -

Straight answers before you trust it with a real application.

-

- What RolePatch may change, what it must leave alone, where your records live, what - costs money, and where application assistance stops. -

-
-
- -
-
-
- {PRODUCT_FAQS.map((faq) => ( -
-

{faq.q}

-

{faq.a}

-
- ))} -
-
-
-

Bring the job. Keep the claims yours.

-

Start with a guest workspace, then decide whether account-backed persistence belongs in your search.

-
- Open RolePatch -
-
-
-
+