Skip to content

test(web): fail the build when marketing copy drifts from shipped providers - #126

Merged
ralyodio merged 1 commit into
masterfrom
feat/marketing-page-drift-guard
Aug 3, 2026
Merged

test(web): fail the build when marketing copy drifts from shipped providers#126
ralyodio merged 1 commit into
masterfrom
feat/marketing-page-drift-guard

Conversation

@ralyodio

@ralyodio ralyodio commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

The structural fix behind #123, #124, and #125.

Why

Those three PRs all fixed one bug wearing different hats. /credential-sharing and README.md are hand-written copy; the providers they advertise are a real registry in @logicsrc/plugin-credential-sharing. Nothing connected the two.

So the team provider shipped 2026-07-13 and three weeks later both surfaces still described a five-provider tool that never said the word "team". The docs were correct the entire time — only the pages people actually land on had gone stale. That is the worse failure: a reader concludes the product cannot do this, not the docs are thin. It cost a real "does this even support teams yet?"

Reviews do not catch this, because the diff that ships a provider looks complete on its own. So assert it.

What

For every provider in the registry, the Credential Sharing section and the README must contain something that counts as advertising it.

The registry's own name cannot serve as the proof — env is "Local .env file" and team is "LogicSRC Team Vault", neither of which is how marketing copy reads. So each provider declares its own pattern in MARKETING_PROOF, and a provider with no declaration fails too. Adding a provider therefore forces a deliberate answer about customer-facing copy rather than allowing silence.

Three assertions:

  1. every shipped provider declares what advertising it looks like
  2. the credential sharing section names every shipped provider
  3. the README names every shipped provider

Assertion 2 scopes the match to the <section id="credential-sharing"> band, so an unrelated mention elsewhere on the page cannot satisfy it.

Verification

Confirmed against the actual bug, not just confirmed green. Reverting the copy to its pre-#123 state:

× the credential sharing section names every shipped provider
  These providers ship but /credential-sharing never mentions them: team.
  Update renderPageMarkup in src/lib/page-markup.ts.

× the README names every shipped provider
  These providers ship but README.md never mentions them: sh1pt, team.

And removing a MARKETING_PROOF entry, standing in for a newly added provider:

× every shipped provider declares what advertising it looks like
  Add these provider ids to MARKETING_PROOF, then make sure the marketing
  page and README actually say so: sh1pt

Green state: 74 contract tests pass (71 + 3), and next build compiles clean. The one Turbopack NFT warning is pre-existing — I verified it appears without this change too.

Adds @logicsrc/plugin-credential-sharing as a devDependency of the web app so the test reads the real registry rather than a regex over source. Lockfile diff is that one line.

Scope

This covers credential providers, because that is where a machine-readable registry exists to check against. It is deliberately not a general "docs must match marketing" rule — that would be noisy and unenforceable. Other capabilities can be added the same way as registries appear.

🤖 Generated with Claude Code

…viders

The last three PRs all fixed the same class of bug. /credential-sharing
and README.md are hand-written copy; the providers they advertise are a
real registry in @logicsrc/plugin-credential-sharing. Nothing connected
the two, so the `team` provider shipped on 2026-07-13 and three weeks
later both surfaces still described a five-provider tool with no mention
of teams. The docs were right the whole time -- only the pages people
actually land on had gone stale, which is worse, because it reads as
"the product cannot do this" rather than as a documentation gap.

Assert it instead. For every provider in the registry, the Credential
Sharing section and the README must say something that counts as
advertising it. The registry's own `name` cannot be the proof -- `env`
is "Local .env file" and `team` is "LogicSRC Team Vault", neither of
which is how the copy reads -- so each provider declares its own
pattern, and a provider with no declaration fails too. That way adding
a provider forces a deliberate answer about the customer-facing copy.

Verified against the bug it is meant to catch: reverting the team copy
reproduces "These providers ship but /credential-sharing never mentions
them: team", and reverting the README line reproduces the same for
sh1pt and team.

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

github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown

vu1nz Security Review

0 finding(s) in PR #?

No security issues found.

@github-actions

github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown

ThreatCrush Security Scan

55 finding(s)

HIGH/CRITICAL: 30 | MEDIUM: 25

Severity Rule Location
HIGH secret-openai-key plugins/credential-sharing/src/vault-encryption.test.ts:21
HIGH manifest-typosquat apps/commandboard-web/package.json:20
HIGH secret-generic-credential apps/logicsrc-web/contract/logicsrc-web.contract.test.ts:392
HIGH secret-generic-credential apps/logicsrc-web/contract/logicsrc-web.contract.test.ts:410
HIGH secret-generic-credential apps/logicsrc-web/contract/logicsrc-web.contract.test.ts:426
HIGH secret-generic-credential apps/logicsrc-web/contract/logicsrc-web.contract.test.ts:428
HIGH secret-generic-credential apps/logicsrc-web/contract/logicsrc-web.contract.test.ts:433
HIGH secret-generic-credential apps/logicsrc-web/contract/logicsrc-web.contract.test.ts:471
HIGH secret-generic-credential apps/logicsrc-web/contract/logicsrc-web.contract.test.ts:477
HIGH secret-generic-credential apps/logicsrc-web/contract/logicsrc-web.contract.test.ts:499
HIGH secret-generic-credential apps/logicsrc-web/contract/logicsrc-web.contract.test.ts:516
HIGH secret-generic-credential apps/logicsrc-web/contract/logicsrc-web.contract.test.ts:528
HIGH manifest-typosquat apps/logicsrc-web/package.json:28
HIGH js-ssrf-outbound-request apps/logicsrc-web/src/lib/coinpay.ts:50
HIGH manifest-typosquat apps/pwa/package.json:19
HIGH js-ssrf-outbound-request apps/pwa/public/sw.js:45
HIGH secret-generic-credential apps/pwa/test/appbar.test.mjs:10
HIGH secret-generic-credential packages/account-core/src/index.test.ts:104
HIGH secret-generic-credential packages/agentad/src/exchange.test.ts:13
HIGH secret-generic-credential plugins/agentgit/src/index.ts:12
HIGH secret-generic-credential plugins/c0mpute/src/index.ts:12
HIGH secret-generic-credential plugins/coinpay/src/index.ts:12
HIGH secret-generic-credential plugins/credential-sharing/src/engine.test.ts:69
HIGH secret-generic-credential plugins/credential-sharing/src/engine.test.ts:134
HIGH secret-database-url plugins/credential-sharing/src/rekey.test.ts:33
HIGH secret-generic-credential plugins/credential-sharing/src/vault-encryption.test.ts:21
HIGH js-ssrf-outbound-request plugins/feed-discovery/src/providers/itunes-podcast.ts:37
HIGH js-ssrf-outbound-request plugins/feed-discovery/src/providers/podcastindex.ts:43
HIGH secret-generic-credential plugins/sh1pt/src/index.ts:11
HIGH secret-generic-credential plugins/ugig/src/index.ts:11
MEDIUM js-unescaped-html-sink apps/commandboard-web/src/main.ts:19
MEDIUM js-unescaped-html-sink apps/logicsrc-web/src/app/[[...slug]]/page.tsx:73
MEDIUM js-unescaped-html-sink apps/logicsrc-web/src/app/blog/[slug]/page.tsx:120
MEDIUM js-unescaped-html-sink apps/logicsrc-web/src/app/docs/[slug]/page.tsx:55
MEDIUM js-unescaped-html-sink apps/logicsrc-web/src/app/layout.tsx:83
MEDIUM js-unescaped-html-sink apps/logicsrc-web/src/app/pricing/page.tsx:46
MEDIUM js-unescaped-html-sink apps/logicsrc-web/src/components/site-shell.tsx:46
MEDIUM sql-template-interpolation packages/cli/src/index.ts:812
MEDIUM sql-template-interpolation packages/cli/src/index.ts:814
MEDIUM sql-template-interpolation packages/cli/src/index.ts:821
MEDIUM sql-template-interpolation packages/cli/src/teams.ts:284
MEDIUM redos-nested-quantifier packages/openontology/src/ids.ts:20
MEDIUM redos-nested-quantifier packages/openprd/src/validate.ts:41
MEDIUM redos-nested-quantifier packages/schemas/schemas/logicsrc-account-audit-event.schema.json:23
MEDIUM redos-nested-quantifier packages/schemas/schemas/logicsrc-account-grant.schema.json:23
MEDIUM redos-nested-quantifier packages/schemas/schemas/logicsrc-account-grant.schema.json:35
MEDIUM redos-nested-quantifier packages/schemas/schemas/logicsrc-account-provider.schema.json:20
MEDIUM redos-nested-quantifier packages/schemas/schemas/logicsrc-connected-account.schema.json:30
MEDIUM redos-nested-quantifier packages/schemas/schemas/logicsrc-credential-audit-event.schema.json:14
MEDIUM redos-nested-quantifier packages/schemas/schemas/logicsrc-openontology-manifest.schema.json:28

…and 5 more. Full results in the Security tab.

Snippets are redacted; ThreatCrush never prints matched credential material.

@ralyodio
ralyodio marked this pull request as ready for review August 3, 2026 14:18
@ralyodio
ralyodio merged commit 4c88155 into master Aug 3, 2026
7 checks passed
@ralyodio
ralyodio deleted the feat/marketing-page-drift-guard branch August 3, 2026 14:18
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