Version control for product messaging.
NarrativeSpec is a repo-native source of truth for product messaging. It stores approved claims, qualifiers, and supporting evidence in versioned files, then checks launch assets for drift before they ship.
This MVP focuses on deterministic review for complex product launches:
- approved vs unapproved claims
- stale wording and expired claims
- banned phrases
- missing qualifiers
- cross-surface drift across docs, release notes, and web copy
- CTA drift across site sections
- asset reuse across pages
- date/version drift across launches and docs
- long or filler-heavy phrasing that could be more succinct
Marketing systems move fast. Product narratives drift across websites, docs, launch briefs, release notes, and comms. NarrativeSpec treats messaging as structured project state instead of scattered copy.
npm install
npm run buildnarrativespec check --config examples/demo/narrativespec.config.yaml
narrativespec check --config examples/demo/narrativespec.config.yaml examples/demo/content
narrativespec init ./my-launchnarrativespec.config.yaml
version: 1
registry:
- ./narratives/claude.yaml
include:
- ./content/**/*.md
- ./content/**/*.html
rules:
fail_on: error
banned_phrases:
- guaranteed safe
unsupported_patterns:
- pattern: "\\bnever hallucinates\\b"
explanation: Absolute reliability claim
severity: errorClaim registry files are YAML documents with a claims array:
product: Claude
claims:
- id: claude-values
status: approved
canonical: Claude is designed to be helpful, honest, and harmless.
aliases:
- Claude is helpful, honest, and harmless.
required_qualifiers:
- designed to
evidence:
- label: Anthropic careers
url: https://www.anthropic.com/careersText output is optimized for CI and pull requests. JSON output is available with --format json.
Issue types:
unsupported-claimbanned-phrasestale-wordingstale-claimmissing-qualifiercross-surface-driftcta-driftasset-reusedate-version-driftsuccinctness
This repo includes a local composite action at the repo root. Example:
name: narrativespec
on:
pull_request:
push:
branches: [main]
jobs:
check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: ./
with:
config: examples/demo/narrativespec.config.yamlThe repo ships with two example fixtures:
examples/happy-pathis clean and should pass.examples/demoincludes intentional issues and should fail.examples/anthropic-corpustargets a large Firecrawl harvest of Anthropic pages and Claude Code docs.
After building:
npm run example
npm run check:demo
node dist/src/cli.js check --config examples/anthropic-corpus/narrativespec.config.yamlThe latest Anthropic corpus proof and writeup live in proofs/.
npm run typecheck
npm test
npm run buildThis is a deterministic MVP. It does not generate copy, replace review, or claim truth on its own. It checks whether repo-declared messaging rules and evidence are being followed.