@brandlab-digital/conformance 3.2.1 → 3.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,3 @@
1
+ # `@brandlab-digital/conformance`
2
+
3
+ Proprietary software © Brandlab Digital Marketing. All rights reserved. Published for Brandlab client sites.
@@ -23,30 +23,30 @@ export const BRANDLAB_CURRENT_RUNTIME_RELEASE = Object.freeze({
23
23
  "kind": "brandlab-runtime-release-contract",
24
24
  "packages": {
25
25
  "@brandlab-digital/conformance": {
26
- "version": "3.2.1"
26
+ "version": "3.3.1"
27
27
  },
28
28
  "@brandlab-digital/eslint-plugin": {
29
- "version": "3.2.1"
29
+ "version": "3.3.1"
30
30
  },
31
31
  "@brandlab-digital/site-core": {
32
- "version": "3.2.1"
32
+ "version": "3.3.1"
33
33
  },
34
34
  "@brandlab-digital/site-next": {
35
- "version": "3.2.1"
35
+ "version": "3.3.1"
36
36
  }
37
37
  },
38
- "releaseVersion": "3.2.1",
38
+ "releaseVersion": "3.3.1",
39
39
  "runtime": {
40
40
  "bundler": "turbopack",
41
41
  "cacheComponents": false,
42
- "next": "16.3.6",
42
+ "next": "16.3.8",
43
43
  "nextVersionPolicy": "exact",
44
44
  "node": "24.x",
45
45
  "packageManager": "npm@11.14.1",
46
46
  "react": "19.2.8",
47
47
  "reactDom": "19.2.8",
48
48
  "router": "app",
49
- "sharp": "0.35.4",
49
+ "sharp": "0.35.5",
50
50
  "typescript": "6.0.3"
51
51
  },
52
52
  "schemaVersion": "brandlab.runtime-release-contract.v1"
@@ -1 +1 @@
1
- {"version":3,"file":"current-release.js","sourceRoot":"","sources":["../src/current-release.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,wEAAwE;AACxE,OAAO,EAEL,sCAAsC,GACvC,MAAM,uBAAuB,CAAC;AAE/B,MAAM,CAAC,MAAM,gCAAgC,GAAG,MAAM,CAAC,MAAM,CAC7D;IACE,cAAc,EAAE;QACd,uCAAuC;QACvC,8BAA8B;QAC9B,yBAAyB;QACzB,6BAA6B;QAC7B,0BAA0B;QAC1B,4BAA4B;QAC5B,kCAAkC;QAClC,wCAAwC;QACxC,yBAAyB;KAC1B;IACD,WAAW,EAAE;QACX,WAAW,EAAE,cAAc;QAC3B,cAAc,EAAE,iBAAiB;QACjC,eAAe,EAAE,mBAAmB;QACpC,SAAS,EAAE,YAAY;QACvB,KAAK,EAAE,QAAQ;KAChB;IACD,MAAM,EAAE,mCAAmC;IAC3C,UAAU,EAAE;QACV,+BAA+B,EAAE;YAC/B,SAAS,EAAE,OAAO;SACnB;QACD,iCAAiC,EAAE;YACjC,SAAS,EAAE,OAAO;SACnB;QACD,6BAA6B,EAAE;YAC7B,SAAS,EAAE,OAAO;SACnB;QACD,6BAA6B,EAAE;YAC7B,SAAS,EAAE,OAAO;SACnB;KACF;IACD,gBAAgB,EAAE,OAAO;IACzB,SAAS,EAAE;QACT,SAAS,EAAE,WAAW;QACtB,iBAAiB,EAAE,KAAK;QACxB,MAAM,EAAE,QAAQ;QAChB,mBAAmB,EAAE,OAAO;QAC5B,MAAM,EAAE,MAAM;QACd,gBAAgB,EAAE,aAAa;QAC/B,OAAO,EAAE,QAAQ;QACjB,UAAU,EAAE,QAAQ;QACpB,QAAQ,EAAE,KAAK;QACf,OAAO,EAAE,QAAQ;QACjB,YAAY,EAAE,OAAO;KACtB;IACD,eAAe,EAAE,sCAAsC;CACxD,CAC6C,CAAC;AAE/C,sCAAsC,CAAC,gCAAgC,CAAC,CAAC","sourcesContent":["// Generated by standards/scripts/generate-conformance-current-release.mjs.\n// Each exact package release verifies its own current runtime contract.\nimport {\n type BrandlabRuntimeReleaseContract,\n validateBrandlabRuntimeReleaseContract,\n} from \"./release-manifest.js\";\n\nexport const BRANDLAB_CURRENT_RUNTIME_RELEASE = Object.freeze(\n{\n \"capabilities\": [\n \"typed-project-business-and-route-data\",\n \"essential-search-foundations\",\n \"shared-contact-delivery\",\n \"privacy-safe-lead-analytics\",\n \"security-patched-runtime\",\n \"live-google-review-summary\",\n \"high-signal-project-verification\",\n \"packed-positive-and-negative-consumers\",\n \"changesets-oidc-release\"\n ],\n \"contracts\": {\n \"analytics\": \"analytics-v4\",\n \"architecture\": \"architecture-v7\",\n \"configuration\": \"project-config-v7\",\n \"contact\": \"contact-v4\",\n \"seo\": \"seo-v4\"\n },\n \"kind\": \"brandlab-runtime-release-contract\",\n \"packages\": {\n \"@brandlab-digital/conformance\": {\n \"version\": \"3.2.1\"\n },\n \"@brandlab-digital/eslint-plugin\": {\n \"version\": \"3.2.1\"\n },\n \"@brandlab-digital/site-core\": {\n \"version\": \"3.2.1\"\n },\n \"@brandlab-digital/site-next\": {\n \"version\": \"3.2.1\"\n }\n },\n \"releaseVersion\": \"3.2.1\",\n \"runtime\": {\n \"bundler\": \"turbopack\",\n \"cacheComponents\": false,\n \"next\": \"16.3.6\",\n \"nextVersionPolicy\": \"exact\",\n \"node\": \"24.x\",\n \"packageManager\": \"npm@11.14.1\",\n \"react\": \"19.2.8\",\n \"reactDom\": \"19.2.8\",\n \"router\": \"app\",\n \"sharp\": \"0.35.4\",\n \"typescript\": \"6.0.3\"\n },\n \"schemaVersion\": \"brandlab.runtime-release-contract.v1\"\n},\n) as unknown as BrandlabRuntimeReleaseContract;\n\nvalidateBrandlabRuntimeReleaseContract(BRANDLAB_CURRENT_RUNTIME_RELEASE);\n"]}
1
+ {"version":3,"file":"current-release.js","sourceRoot":"","sources":["../src/current-release.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,wEAAwE;AACxE,OAAO,EAEL,sCAAsC,GACvC,MAAM,uBAAuB,CAAC;AAE/B,MAAM,CAAC,MAAM,gCAAgC,GAAG,MAAM,CAAC,MAAM,CAC7D;IACE,cAAc,EAAE;QACd,uCAAuC;QACvC,8BAA8B;QAC9B,yBAAyB;QACzB,6BAA6B;QAC7B,0BAA0B;QAC1B,4BAA4B;QAC5B,kCAAkC;QAClC,wCAAwC;QACxC,yBAAyB;KAC1B;IACD,WAAW,EAAE;QACX,WAAW,EAAE,cAAc;QAC3B,cAAc,EAAE,iBAAiB;QACjC,eAAe,EAAE,mBAAmB;QACpC,SAAS,EAAE,YAAY;QACvB,KAAK,EAAE,QAAQ;KAChB;IACD,MAAM,EAAE,mCAAmC;IAC3C,UAAU,EAAE;QACV,+BAA+B,EAAE;YAC/B,SAAS,EAAE,OAAO;SACnB;QACD,iCAAiC,EAAE;YACjC,SAAS,EAAE,OAAO;SACnB;QACD,6BAA6B,EAAE;YAC7B,SAAS,EAAE,OAAO;SACnB;QACD,6BAA6B,EAAE;YAC7B,SAAS,EAAE,OAAO;SACnB;KACF;IACD,gBAAgB,EAAE,OAAO;IACzB,SAAS,EAAE;QACT,SAAS,EAAE,WAAW;QACtB,iBAAiB,EAAE,KAAK;QACxB,MAAM,EAAE,QAAQ;QAChB,mBAAmB,EAAE,OAAO;QAC5B,MAAM,EAAE,MAAM;QACd,gBAAgB,EAAE,aAAa;QAC/B,OAAO,EAAE,QAAQ;QACjB,UAAU,EAAE,QAAQ;QACpB,QAAQ,EAAE,KAAK;QACf,OAAO,EAAE,QAAQ;QACjB,YAAY,EAAE,OAAO;KACtB;IACD,eAAe,EAAE,sCAAsC;CACxD,CAC6C,CAAC;AAE/C,sCAAsC,CAAC,gCAAgC,CAAC,CAAC","sourcesContent":["// Generated by standards/scripts/generate-conformance-current-release.mjs.\n// Each exact package release verifies its own current runtime contract.\nimport {\n type BrandlabRuntimeReleaseContract,\n validateBrandlabRuntimeReleaseContract,\n} from \"./release-manifest.js\";\n\nexport const BRANDLAB_CURRENT_RUNTIME_RELEASE = Object.freeze(\n{\n \"capabilities\": [\n \"typed-project-business-and-route-data\",\n \"essential-search-foundations\",\n \"shared-contact-delivery\",\n \"privacy-safe-lead-analytics\",\n \"security-patched-runtime\",\n \"live-google-review-summary\",\n \"high-signal-project-verification\",\n \"packed-positive-and-negative-consumers\",\n \"changesets-oidc-release\"\n ],\n \"contracts\": {\n \"analytics\": \"analytics-v4\",\n \"architecture\": \"architecture-v7\",\n \"configuration\": \"project-config-v7\",\n \"contact\": \"contact-v4\",\n \"seo\": \"seo-v4\"\n },\n \"kind\": \"brandlab-runtime-release-contract\",\n \"packages\": {\n \"@brandlab-digital/conformance\": {\n \"version\": \"3.3.1\"\n },\n \"@brandlab-digital/eslint-plugin\": {\n \"version\": \"3.3.1\"\n },\n \"@brandlab-digital/site-core\": {\n \"version\": \"3.3.1\"\n },\n \"@brandlab-digital/site-next\": {\n \"version\": \"3.3.1\"\n }\n },\n \"releaseVersion\": \"3.3.1\",\n \"runtime\": {\n \"bundler\": \"turbopack\",\n \"cacheComponents\": false,\n \"next\": \"16.3.8\",\n \"nextVersionPolicy\": \"exact\",\n \"node\": \"24.x\",\n \"packageManager\": \"npm@11.14.1\",\n \"react\": \"19.2.8\",\n \"reactDom\": \"19.2.8\",\n \"router\": \"app\",\n \"sharp\": \"0.35.5\",\n \"typescript\": \"6.0.3\"\n },\n \"schemaVersion\": \"brandlab.runtime-release-contract.v1\"\n},\n) as unknown as BrandlabRuntimeReleaseContract;\n\nvalidateBrandlabRuntimeReleaseContract(BRANDLAB_CURRENT_RUNTIME_RELEASE);\n"]}
@@ -247,7 +247,7 @@ function inspectFileName(root, path, add) {
247
247
  if (name.endsWith('.module.css')) {
248
248
  const component = name.replace(/\.module\.css$/, '');
249
249
  // Exact names from the directory listing: existsSync is case-insensitive on macOS but not on the Linux CI
250
- // (H&R's button.module.css beside Button.tsx passed locally and failed in CI).
250
+ // (a button.module.css beside Button.tsx passed locally and failed in CI).
251
251
  const siblings = directoryEntries(join(root, directory));
252
252
  if (!['tsx', 'ts', 'jsx'].some(extension => siblings.has(`${component}.${extension}`))) {
253
253
  add(path, 'file-naming', `Keep ${name} beside the ${component} component it styles (the file names must match exactly, including case).`);
@@ -1 +1 @@
1
- {"version":3,"file":"engineering.js","sourceRoot":"","sources":["../src/engineering.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';\nimport { join, posix } from 'node:path';\nimport ts from 'typescript';\nimport { globMatch } from './glob.js';\nimport {\n collectBrandlabSource,\n createBrandlabModuleResolver,\n findImportedCalls,\n isDirectory,\n lineOfNode,\n listModuleReferences,\n objectPropertyValue,\n parseBrandlabSourceFile,\n walkProjectFiles,\n type BrandlabSourceFile,\n type BrandlabSourceIndex,\n} from './source-files.js';\nimport { describeCapabilities } from './static-rules.js';\n\nexport const ENGINEERING_FAST_COMMANDS = ['typecheck', 'lint', 'test', 'check:unused', 'check:unused:production', 'check:standards'] as const;\n\n/** The exact fast verification command from the Brandlab 3.0 target (section 6). */\nexport const BRANDLAB_EXPECTED_VERIFY_SCRIPT =\n 'npm run check:standards && npm run typecheck && npm run lint && npm run test && npm run check:unused && npm run check:unused:production';\n\n/** Scripts whose exact values the 3.0 target fixes; dev and start must exist. */\nexport const BRANDLAB_EXPECTED_SCRIPTS: Readonly<Record<string, string>> = Object.freeze({\n build: 'next build',\n typecheck: 'next typegen && tsc --noEmit',\n lint: 'eslint .',\n test: 'vitest run',\n 'test:e2e': 'playwright test',\n 'check:unused': 'knip',\n 'check:unused:production': 'knip --production',\n 'check:standards': 'brandlab-verify --mode ci --engineering',\n});\n\nexport type EngineeringFindingSeverity = 'blocker' | 'info';\nexport interface EngineeringFinding { path: string; rule: string; message: string; severity: EngineeringFindingSeverity; line?: number }\nexport interface EngineeringCheck {\n status: 'pass' | 'blocked';\n findings: EngineeringFinding[];\n coverage: string;\n outstandingEvidence: readonly string[];\n}\n\ninterface PackageManifest {\n type?: string;\n scripts?: Record<string, string>;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n}\n\nconst SRC_DIRECTORIES = new Set(['app', 'config', 'data', 'content', 'lib', 'components', 'types']);\nconst SRC_ROOT_FILES = /^(?:instrumentation(?:-client)?|proxy|mdx-components)\\.(?:ts|tsx)$/;\nconst COMPONENT_ROLES = new Set(['layout', 'ui', 'sections', 'features', 'page-families']);\nconst TEST_DIRECTORIES = new Set(['config', 'data', 'lib', 'components', 'e2e', 'support']);\nconst RETIRED_ROOT_DIRECTORIES = ['app', 'components', 'data', 'lib', 'config', 'content', 'hooks', 'context', 'utils', 'src/components/templates'];\nconst DEV_TOOLING = ['eslint', 'vitest', '@playwright/test', 'knip'];\nconst NEXT_SPECIAL_FILE = /^(?:page|layout|template|loading|error|global-error|not-found|global-not-found|forbidden|unauthorized|default|route|opengraph-image|twitter-image|icon|apple-icon|sitemap|robots|manifest)\\.(?:ts|tsx|js|jsx|mdx)$/;\nconst CODE_OR_STYLE = /\\.(?:[cm]?[jt]sx?|mdx|css)$/;\nconst PASCAL_COMPONENT = /^[A-Z][A-Za-z0-9]*\\.tsx$/;\nconst CAMEL_MODULE = /^[a-z][A-Za-z0-9]*(?:\\.d)?\\.ts$/;\nconst SEMVER = /^\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?$/;\n\n/** The Vercel function region of every Brandlab site (3.2.1): Sydney. */\nexport const BRANDLAB_FUNCTION_REGION = 'syd1';\n/** The contact route's delivery options (labels, email style, attachment policy): server-only (3.2.1). */\nconst CONTACT_RUNTIME = 'src/config/contactRuntime.ts';\n/** The business facts' evidence (defineBrandlabBusiness): server-only (3.2.1). */\nconst BUSINESS_EVIDENCE = 'src/data/businessEvidence.ts';\nconst BUSINESS_VALUES = 'src/data/business.ts';\nconst SITE_IDENTITY = 'src/config/site.ts';\nconst BUSINESS_FACT_CALLS = /\\b(?:defineBrandlabBusiness|verifiedFact|unknownFact|notApplicableFact)\\s*\\(/;\n\n/** Opt-in structural check. Static success must never masquerade as whole-project acceptance. */\nexport function checkEngineeringStructure(root: string): EngineeringCheck {\n directoryListings.clear();\n const findings: EngineeringFinding[] = [];\n const add = (path: string, rule: string, message: string, extra: { severity?: EngineeringFindingSeverity; line?: number } = {}) =>\n findings.push({ path, rule, message, severity: extra.severity ?? 'blocker', ...(extra.line ? { line: extra.line } : {}) });\n let pkg: PackageManifest = {};\n try { pkg = JSON.parse(readFileSync(join(root, 'package.json'), 'utf8')); }\n catch { add('package.json', 'package-readable', 'A readable package.json is required.'); }\n const config = existsSync(join(root, 'brandlab.config.ts')) ? readFileSync(join(root, 'brandlab.config.ts'), 'utf8') : null;\n const capabilities = describeCapabilities(root, config);\n\n const source = collectBrandlabSource(root);\n\n inspectCommands(pkg, add);\n inspectDependencies(pkg, add);\n inspectLayout(root, capabilities, add);\n inspectSourceModules(root, source, add);\n inspectServerBoundaries(root, capabilities, source, add);\n inspectTests(root, capabilities, add);\n inspectToolPresets(root, add);\n inspectDelivery(root, add);\n\n return { status: findings.some(finding => finding.severity === 'blocker') ? 'blocked' : 'pass', findings,\n coverage: 'Static layout, naming, command, dependency-pin, tool-preset, CI, deployment and documentation structure only. This is not engineering-standard completion.',\n outstandingEvidence: ['Usage and deletion review including assets, configuration and dynamic references', 'Business data and component/style ownership review', 'Clean install, fast checks and production build', 'Full discovered technical URL estate', 'All distinct page families and important browser journeys', 'Exact-source protected Preview', 'Reporting/Ads provider cutover and authorised production verification'] };\n}\n\ntype Add = (path: string, rule: string, message: string, extra?: { severity?: EngineeringFindingSeverity; line?: number }) => void;\n\n// --- commands (section 6) ----------------------------------------------------\n\nfunction inspectCommands(pkg: PackageManifest, add: Add) {\n const scripts = pkg.scripts ?? {};\n for (const command of ['dev', 'start', ...ENGINEERING_FAST_COMMANDS, 'verify', 'build', 'test:e2e']) {\n if (!scripts[command]?.trim()) add('package.json', 'command-contract', `Missing ${command} command.`);\n }\n for (const [name, expected] of Object.entries(BRANDLAB_EXPECTED_SCRIPTS)) {\n const actual = scripts[name]?.trim();\n if (actual && actual.replace(/\\s+/g, ' ') !== expected) {\n add('package.json', 'script-contract', `${name} must be exactly \"${expected}\" (found \"${actual}\").`);\n }\n }\n const verify = scripts.verify?.trim();\n if (verify) {\n const unrecognised = splitCommandChain(verify).filter(segment => scriptReferences(segment, scripts) === null);\n if (unrecognised.length > 0) {\n add('package.json', 'verification-command-form',\n `verify may only chain package scripts (npm run <script>, npm test, run-s, run-p); \"${unrecognised.join('\", \"')}\" is not recognised. Expected \"${BRANDLAB_EXPECTED_VERIFY_SCRIPT}\".`);\n }\n }\n const reachable = new Set<string>();\n const visit = (name: string) => {\n if (reachable.has(name)) return;\n reachable.add(name);\n for (const segment of splitCommandChain(scripts[name] ?? '')) {\n for (const reference of scriptReferences(segment, scripts) ?? []) visit(reference);\n }\n };\n visit('verify');\n for (const command of ENGINEERING_FAST_COMMANDS) {\n if (!reachable.has(command)) add('package.json', 'verification-wiring', `verify must execute ${command}. Expected \"${BRANDLAB_EXPECTED_VERIFY_SCRIPT}\".`);\n }\n if (reachable.has('build')) add('package.json', 'single-build', 'Keep the production build separate from fast verify; run it once for the final candidate.');\n}\n\n/** Split a shell command on its chaining operators. */\nexport function splitCommandChain(command: string): string[] {\n return command.split(/&&|\\|\\||[;|&]/).map(segment => segment.trim()).filter(Boolean);\n}\n\n/**\n * The package scripts one command segment runs, or null when the segment is\n * not a recognised script invocation (npm run, npm test, run-s, run-p, npm-run-all).\n */\nexport function scriptReferences(segment: string, scripts: Readonly<Record<string, string>>): string[] | null {\n const words = segment.split(/\\s+/).filter(Boolean);\n while (words[0] && /^[A-Z_][A-Z0-9_]*=/.test(words[0])) words.shift();\n const [tool, ...rest] = words;\n if (tool === 'npm') {\n const [subcommand, ...args] = rest;\n if (subcommand === 'test' || subcommand === 't') return ['test'];\n if (subcommand === 'start' || subcommand === 'stop' || subcommand === 'restart') return [subcommand];\n if (subcommand === 'run' || subcommand === 'run-script') {\n const name = args.find(arg => !arg.startsWith('-'));\n return name ? [name] : null;\n }\n return null;\n }\n if (tool === 'run-s' || tool === 'run-p' || tool === 'npm-run-all') {\n const patterns: string[] = [];\n for (const word of rest) {\n if (word === '--') break;\n if (!word.startsWith('-')) patterns.push(word.replace(/^['\"]|['\"]$/g, ''));\n }\n if (patterns.length === 0) return null;\n // npm-run-all globs: `*` stays within one `:` segment; a whole `**` segment spans several.\n return patterns.flatMap(pattern => pattern.includes('*') || pattern.includes('?') || pattern.includes('[')\n ? Object.keys(scripts).filter(name => globMatch(pattern, name, { separator: ':', globstar: true }))\n : [pattern]);\n }\n return null;\n}\n\n// --- dependencies (section 1) ------------------------------------------------\n\nfunction inspectDependencies(pkg: PackageManifest, add: Add) {\n if (pkg.type !== 'module') add('package.json', 'module-type', 'Declare \"type\": \"module\".');\n const dependencies = { ...pkg.dependencies, ...pkg.devDependencies };\n for (const tool of DEV_TOOLING) {\n const spec = pkg.devDependencies?.[tool];\n if (!spec || !SEMVER.test(spec)) add('package.json', 'dev-tooling', `Pin ${tool} exactly as a development dependency.`);\n }\n // Packed preflight binds the four Brandlab packages to local file: archives; the evaluator verifies those.\n const ranges = Object.entries(dependencies)\n .filter(([name, spec]) => !SEMVER.test(spec) && !(name.startsWith('@brandlab-digital/') && spec.startsWith('file:')))\n .map(([name, spec]) => `${name}@${spec}`);\n if (ranges.length > 0) add('package.json', 'exact-pins', `Pin every dependency to the exact locked version: ${ranges.sort().join(', ')}.`);\n const next = dependencies.next;\n for (const companion of ['eslint-config-next', '@next/mdx']) {\n const spec = dependencies[companion];\n if (spec && spec !== next) add('package.json', 'framework-companion-pin', `${companion} must equal the next version (${next ?? 'missing'}); found ${spec}.`);\n }\n if (!dependencies['eslint-config-next']) add('package.json', 'framework-companion-pin', 'Declare eslint-config-next at the exact next version for brandlab.configs.next.');\n if (pkg.dependencies?.sharp || pkg.devDependencies?.sharp) add('package.json', 'sharp-override-only', 'Remove the direct sharp dependency; the release-owned overrides.sharp pin is the only declaration.');\n}\n\n// --- layout and naming (section 2) --------------------------------------------\n\nfunction inspectLayout(root: string, capabilities: ReturnType<typeof describeCapabilities>, add: Add) {\n for (const path of ['src/app', 'src/config', 'src/data', 'src/lib', 'src/components', 'tests']) {\n if (!isDirectory(join(root, path))) add(path, 'source-organisation', `Place the corresponding implementation under ${path}.`);\n }\n for (const path of RETIRED_ROOT_DIRECTORIES) {\n if (existsSync(join(root, path))) add(path, 'retired-source-layout', 'Migrate consumers to the current src responsibilities and remove the superseded directory.');\n }\n const required = [\n 'src/config/site.ts', 'src/config/analytics.ts', 'src/data/business.ts', 'src/data/routes.ts', 'src/data/redirects.ts',\n 'src/lib/seo/metadata.ts', 'src/instrumentation-client.ts', 'src/app/layout.tsx', 'src/app/robots.ts', 'src/app/sitemap.xml/route.ts',\n 'src/data/businessEvidence.ts',\n ...(capabilities.contactEnabled ? ['src/config/contact.ts', CONTACT_RUNTIME, 'src/app/api/contact/route.ts'] : []),\n ...(capabilities.reviewsEnabled ? ['src/config/reviews.ts'] : []),\n ...(capabilities.locationsDeclared ? ['src/data/locations/estate.ts'] : []),\n ];\n for (const path of required) {\n if (!existsSync(join(root, path))) add(path, 'owner-file', `The 3.0 layout places this owner at ${path}.`);\n }\n for (const [path, message] of [\n ['src/config/env.ts', 'Remove the local environment parser; site configuration is a source constant.'],\n ['src/lib/analytics', 'Remove the local analytics layer; installBrandlabInstrumentation owns it.'],\n ['src/lib/contact/definition.ts', 'Remove the local contact definition; the contract lives in src/config/contact.ts.'],\n ['src/lib/contact/constants.ts', 'Remove the local contact constants; the contract lives in src/config/contact.ts.'],\n ['src/lib/contact/runtime.ts', 'Remove the local contact runtime; POST uses createBrandlabContactRouteHandler.'],\n ['src/components/analytics/GoogleTag.tsx', 'Render BrandlabGoogleTag directly in src/app/layout.tsx.'],\n ['src/components/analytics/CoreWebVitalsReporter.tsx', 'Remove the web-vitals reporter.'],\n ['src/lib/seo/sitemaps', 'Remove the local sitemap builders; the sitemap route uses createBrandlabSitemapRoute.'],\n ['src/lib/seo/sitemaps.ts', 'Remove the local sitemap builders; the sitemap route uses createBrandlabSitemapRoute.'],\n ['src/lib/seo/schema/sanitize.ts', 'Remove the local schema sanitiser; the packages own sanitising.'],\n ['src/lib/seo/schema/SchemaScript.tsx', 'Import SchemaScript from @brandlab-digital/site-next/schema.'],\n ['src/lib/seo/index.ts', 'Remove the SEO barrel and import each module directly.'],\n ] as const) {\n if (existsSync(join(root, path))) add(path, 'retired-file', message);\n }\n\n if (isDirectory(join(root, 'src'))) {\n for (const entry of readdirSync(join(root, 'src'), { withFileTypes: true })) {\n if (entry.name.startsWith('.')) continue;\n const path = `src/${entry.name}`;\n if (entry.isDirectory() && SRC_DIRECTORIES.has(entry.name)) {\n if (entry.name === 'types' && walkProjectFiles(root, path).some(file => !file.endsWith('.d.ts'))) {\n add(path, 'standard-layout', 'src/types may hold only ambient .d.ts declarations.');\n }\n continue;\n }\n if (entry.isFile() && SRC_ROOT_FILES.test(entry.name)) continue;\n add(path, 'standard-layout', `${path} is outside the standard layout (src/{app,config,data,content,lib,components}).`);\n }\n }\n if (isDirectory(join(root, 'src/components'))) {\n for (const entry of readdirSync(join(root, 'src/components'), { withFileTypes: true })) {\n if (entry.name.startsWith('.') || entry.name === 'templates') continue;\n if (!entry.isDirectory() || !COMPONENT_ROLES.has(entry.name)) {\n add(`src/components/${entry.name}`, 'component-role', 'Components belong to one role: layout, ui, sections, features or page-families.');\n }\n }\n }\n for (const path of walkProjectFiles(root, 'src')) inspectFileName(root, path, add);\n}\n\nfunction inspectFileName(root: string, path: string, add: Add) {\n const name = posix.basename(path);\n const directory = posix.dirname(path);\n if (directory === 'src' && SRC_ROOT_FILES.test(name)) return;\n if (name.endsWith('.module.css')) {\n const component = name.replace(/\\.module\\.css$/, '');\n // Exact names from the directory listing: existsSync is case-insensitive on macOS but not on the Linux CI\n // (H&R's button.module.css beside Button.tsx passed locally and failed in CI).\n const siblings = directoryEntries(join(root, directory));\n if (!['tsx', 'ts', 'jsx'].some(extension => siblings.has(`${component}.${extension}`))) {\n add(path, 'file-naming', `Keep ${name} beside the ${component} component it styles (the file names must match exactly, including case).`);\n }\n return;\n }\n if (path.startsWith('src/app/')) {\n // Images, fonts and metadata assets are framework-consumed; only code and styles are placed.\n if (!CODE_OR_STYLE.test(name)) return;\n const segments = path.split('/');\n const privateFolder = segments.slice(2, -1).find(segment => segment.startsWith('_') && segment !== '_components');\n if (privateFolder) {\n add(path, 'route-local-code', `Route-local code belongs in src/app/<route>/_components/, not ${privateFolder}/.`);\n return;\n }\n if (!segments.includes('_components')) {\n if (NEXT_SPECIAL_FILE.test(name) || path === 'src/app/globals.css') return;\n add(path, 'route-local-code', 'Route-local code belongs in src/app/<route>/_components/; framework files keep their reserved names.');\n return;\n }\n }\n if (!/\\.(?:ts|tsx)$/.test(name) || path.startsWith('src/content/')) return;\n if (name.endsWith('.tsx') && !PASCAL_COMPONENT.test(name)) {\n add(path, 'file-naming', 'Components use PascalCase .tsx file names.');\n } else if (name.endsWith('.ts') && !CAMEL_MODULE.test(name)) {\n add(path, 'file-naming', 'Data and helper modules use camelCase .ts file names.');\n }\n if (path.startsWith('src/components/page-families/') && name.endsWith('.tsx') && !/^[A-Z][A-Za-z0-9]*Page\\.tsx$/.test(name)) {\n add(path, 'file-naming', 'Page families are named <RouteKind>Page.tsx.');\n }\n}\n\n// --- module structure: barrels, ui data imports, estate ----------------------\n\nfunction inspectSourceModules(root: string, source: BrandlabSourceIndex, add: Add) {\n const resolver = createBrandlabModuleResolver(root, new Set(source.byPath.keys()));\n for (const file of source.files.filter(candidate => candidate.path.startsWith('src/'))) {\n const references = listModuleReferences(file);\n const forwarding = forwardingExports(file);\n if (isBarrel(file)) {\n add(file.path, 'no-barrels', 'This module only re-exports other modules; import each owner directly.');\n } else {\n for (const line of forwarding) {\n add(file.path, 'no-forwarding-exports', 'This export forwards another module; import the owner directly.', { line });\n }\n }\n if (file.path.startsWith('src/components/ui/')) {\n for (const reference of references.filter(candidate => candidate.kind !== 'export')) {\n const resolved = resolver(file.path, reference.specifier);\n if (resolved?.startsWith('src/data/') || /^@\\/data(?:\\/|$)/.test(reference.specifier)) {\n add(file.path, 'ui-imports-data', 'UI primitives never import data modules; pass prepared props from a section or route.', { line: reference.line });\n }\n }\n }\n inspectRegistryDerivedEstate(file, add);\n }\n const estate = source.byPath.get('src/data/locations/estate.ts');\n if (estate) {\n inspectRetainedExclusions(estate, add);\n inspectSiteOwnedLocations(estate, add);\n }\n}\n\n// --- server-only boundaries (3.2.1) ------------------------------------------\n\n/**\n * What a browser bundle must never carry. The contact route's delivery options and\n * the business evidence live in server-only modules, alias hosts in next.config, and\n * no module a client component reaches imports a server-only module or holds an\n * evidence record. (Next's build also refuses a client import of `server-only`; this\n * names the chain before a build is needed.)\n */\nfunction inspectServerBoundaries(\n root: string,\n capabilities: ReturnType<typeof describeCapabilities>,\n source: BrandlabSourceIndex,\n add: Add,\n) {\n const contact = source.byPath.get('src/config/contact.ts');\n const runtime = source.byPath.get(CONTACT_RUNTIME);\n if (capabilities.contactEnabled && runtime) {\n if (!importsServerOnly(runtime)) {\n add(CONTACT_RUNTIME, 'server-only-module', `${CONTACT_RUNTIME} imports 'server-only', so no client component can bundle the delivery options.`);\n }\n if (!declaresName(runtime, 'contactRuntime')) {\n add(CONTACT_RUNTIME, 'contact-runtime', `${CONTACT_RUNTIME} exports contactRuntime (the labels, email style and attachment policy createBrandlabContactRouteHandler takes).`);\n }\n }\n const moved = contact ? declaresName(contact, 'contactRuntime') : undefined;\n if (contact && moved) {\n add('src/config/contact.ts', 'contact-runtime', `contactRuntime belongs in ${CONTACT_RUNTIME}: the contact form imports src/config/contact.ts, so everything contactRuntime reads (the site identity, business data) reaches the browser.`, { line: moved });\n }\n\n const evidence = source.byPath.get(BUSINESS_EVIDENCE);\n if (evidence) {\n if (!importsServerOnly(evidence)) {\n add(BUSINESS_EVIDENCE, 'server-only-module', `${BUSINESS_EVIDENCE} imports 'server-only', so no client component can bundle the evidence records.`);\n }\n if (findImportedCalls(evidence, /^@brandlab-digital\\/site-core\\/business$/, 'defineBrandlabBusiness').length === 0) {\n add(BUSINESS_EVIDENCE, 'business-evidence', `${BUSINESS_EVIDENCE} declares the business facts with defineBrandlabBusiness, each with its evidence.`);\n }\n }\n const values = source.byPath.get(BUSINESS_VALUES);\n if (values) {\n const call = BUSINESS_FACT_CALLS.exec(values.executable);\n const record = evidenceRecordLines(values)[0];\n if (call || record) {\n add(BUSINESS_VALUES, 'business-evidence', `${BUSINESS_VALUES} holds the display values only (businessFacts); defineBrandlabBusiness and the evidence belong in ${BUSINESS_EVIDENCE}, which stays on the server.`,\n { line: record ?? lineAtIndex(values.text, call!.index) });\n }\n }\n\n const site = source.byPath.get(SITE_IDENTITY);\n const aliasHosts = site ? declaredAliasHosts(site) : undefined;\n if (aliasHosts) {\n add(SITE_IDENTITY, 'alias-hosts', 'Declare the alias hosts in next.config.ts with defineBrandlabNextConfig({ aliasHosts }): client components import the site identity, so its alias hosts reach the browser.', { line: aliasHosts });\n }\n\n const resolver = createBrandlabModuleResolver(root, new Set(source.byPath.keys()));\n const reached = new Map<string, string | null>();\n const queue = source.files.filter(file => file.path.startsWith('src/') && (isClientModule(file) || /^src\\/instrumentation-client\\.[cm]?[jt]sx?$/.test(file.path)));\n for (const file of queue) reached.set(file.path, null);\n while (queue.length > 0) {\n const file = queue.shift()!;\n for (const reference of listModuleReferences(file)) {\n if (reference.typeOnly) continue;\n const target = resolver(file.path, reference.specifier);\n if (!target || reached.has(target)) continue;\n reached.set(target, file.path);\n const next = source.byPath.get(target);\n if (next) queue.push(next);\n }\n }\n const chain = (path: string) => {\n const steps: string[] = [];\n for (let at: string | null | undefined = path; at; at = reached.get(at)) steps.unshift(at);\n return steps.join(' → ');\n };\n for (const path of [...reached.keys()].sort()) {\n const file = source.byPath.get(path);\n if (!file) continue;\n if (importsServerOnly(file)) {\n add(path, 'client-bundle-boundary', `A client component imports this server-only module (${chain(path)}); pass what it needs as props from a server component.`);\n continue;\n }\n const record = evidenceRecordLines(file)[0];\n if (record) {\n add(path, 'client-bundle-boundary', `An evidence record (sourceKind, verifiedAt) reaches the browser (${chain(path)}); keep evidence in ${BUSINESS_EVIDENCE}.`, { line: record });\n }\n }\n}\n\n/** A module whose directive prologue says 'use client'. */\nfunction isClientModule(file: BrandlabSourceFile): boolean {\n for (const statement of parseBrandlabSourceFile(file).statements) {\n if (!ts.isExpressionStatement(statement) || !ts.isStringLiteral(statement.expression)) return false;\n if (statement.expression.text === 'use client') return true;\n }\n return false;\n}\n\n/** `import 'server-only'` at the top level. */\nfunction importsServerOnly(file: BrandlabSourceFile): boolean {\n return parseBrandlabSourceFile(file).statements.some(statement =>\n ts.isImportDeclaration(statement) && !statement.importClause &&\n ts.isStringLiteral(statement.moduleSpecifier) && statement.moduleSpecifier.text === 'server-only');\n}\n\n/** The line of a top-level declaration of `name`, if the module declares it. */\nfunction declaresName(file: BrandlabSourceFile, name: string): number | undefined {\n for (const statement of parseBrandlabSourceFile(file).statements) {\n if (ts.isVariableStatement(statement)) {\n for (const declaration of statement.declarationList.declarations) {\n if (ts.isIdentifier(declaration.name) && declaration.name.text === name) return lineOfNode(file, statement);\n }\n } else if ((ts.isFunctionDeclaration(statement) || ts.isClassDeclaration(statement)) && statement.name?.text === name) {\n return lineOfNode(file, statement);\n }\n }\n return undefined;\n}\n\n/** Lines of object literals that are evidence records: they name both sourceKind and verifiedAt. */\nfunction evidenceRecordLines(file: BrandlabSourceFile): number[] {\n const lines: number[] = [];\n const visit = (node: ts.Node) => {\n if (ts.isObjectLiteralExpression(node)) {\n const names = new Set(node.properties.map(property => property.name && (ts.isIdentifier(property.name) || ts.isStringLiteral(property.name)) ? property.name.text : ''));\n if (names.has('sourceKind') && names.has('verifiedAt')) lines.push(lineOfNode(file, node));\n }\n ts.forEachChild(node, visit);\n };\n visit(parseBrandlabSourceFile(file));\n return lines;\n}\n\n/** The line of a non-empty `aliasHosts` in the defineBrandlabSite call. */\nfunction declaredAliasHosts(file: BrandlabSourceFile): number | undefined {\n for (const call of findImportedCalls(file, /^@brandlab-digital\\/site-core\\/site$/, 'defineBrandlabSite')) {\n let definition: ts.Expression | undefined = call.arguments[0];\n while (definition && (ts.isAsExpression(definition) || ts.isSatisfiesExpression(definition) || ts.isParenthesizedExpression(definition))) {\n definition = definition.expression;\n }\n if (!definition || !ts.isObjectLiteralExpression(definition)) continue;\n const property = definition.properties.find(candidate =>\n (ts.isPropertyAssignment(candidate) || ts.isShorthandPropertyAssignment(candidate)) &&\n (ts.isIdentifier(candidate.name) || ts.isStringLiteral(candidate.name)) && candidate.name.text === 'aliasHosts');\n if (!property) continue;\n const array = ts.isPropertyAssignment(property)\n ? arrayLiteral(file, property.initializer)\n : ts.isShorthandPropertyAssignment(property) ? arrayLiteral(file, property.name) : undefined;\n if (array && array.elements.length === 0) continue;\n return lineOfNode(file, property);\n }\n return undefined;\n}\n\n/** Lines of `export ... from` statements and exports of names this module only imported. */\nfunction forwardingExports(file: BrandlabSourceFile): number[] {\n const source = parseBrandlabSourceFile(file);\n const imported = new Set(listModuleReferences(file).filter(reference => reference.kind === 'import').flatMap(reference => reference.bindings.map(binding => binding.local)));\n const lines: number[] = [];\n for (const statement of source.statements) {\n const forwards =\n (ts.isExportDeclaration(statement) && (statement.moduleSpecifier !== undefined ||\n (statement.exportClause !== undefined && ts.isNamedExports(statement.exportClause) &&\n statement.exportClause.elements.some(element => imported.has((element.propertyName ?? element.name).text))))) ||\n (ts.isExportAssignment(statement) && ts.isIdentifier(statement.expression) && imported.has(statement.expression.text));\n if (forwards) lines.push(lineOfNode(file, statement));\n }\n return lines;\n}\n\n/** A module with no declarations or statements of its own besides imports and exports. */\nfunction isBarrel(file: BrandlabSourceFile): boolean {\n const statements = parseBrandlabSourceFile(file).statements;\n return statements.length > 0 && forwardingExports(file).length > 0 &&\n statements.every(statement => ts.isImportDeclaration(statement) || ts.isExportDeclaration(statement) || ts.isExportAssignment(statement));\n}\n\nfunction inspectRegistryDerivedEstate(file: BrandlabSourceFile, add: Add) {\n const derived = listModuleReferences(file)\n .filter(reference => reference.kind === 'import' && /^@brandlab-digital\\/site-core\\//.test(reference.specifier))\n .flatMap(reference => reference.bindings.filter(binding => /WebsiteSuburbs$/.test(binding.imported)).map(binding => ({ ...binding, line: reference.line })));\n const namespaceUse = file.executable.match(/\\.\\s*([a-z][A-Za-z]*WebsiteSuburbs)\\b/);\n const first = derived[0] ?? (namespaceUse ? { imported: namespaceUse[1]!, line: lineAtIndex(file.text, namespaceUse.index ?? 0) } : null);\n if (!first) return;\n add(file.path, 'estate-registry-derived',\n `${first.imported} is a registry candidate list; the published estate in src/data/locations/estate.ts must be literal data, never derived from it.`, { line: first.line });\n}\n\nfunction inspectRetainedExclusions(file: BrandlabSourceFile, add: Add) {\n for (const call of findImportedCalls(file, /^@brandlab-digital\\/site-core\\/locations$/, 'defineLocationEstate')) {\n const retained = objectPropertyValue(call.arguments[0], 'retainedExclusions');\n if (!retained || !ts.isArrayLiteralExpression(retained) || retained.elements.length === 0) continue;\n const slugs = retained.elements.map(element => {\n if (ts.isStringLiteralLike(element)) return element.text;\n const slug = objectPropertyValue(element, 'slug');\n return slug && ts.isStringLiteralLike(slug) ? slug.text : null;\n }).filter((slug): slug is string => Boolean(slug));\n add(file.path, 'estate-retained-exclusions',\n `${retained.elements.length} policy-excluded location(s) stay published for a later SEO decision${slugs.length ? `: ${slugs.join(', ')}` : ''}.`,\n { severity: 'info', line: lineOfNode(file, retained) });\n }\n}\n\n/** An array literal, directly or through a top-level `const name = [...]` (optionally `as const`) in the same file. */\nfunction arrayLiteral(file: BrandlabSourceFile, node: ts.Expression | undefined): ts.ArrayLiteralExpression | undefined {\n const unwrap = (expression: ts.Expression | undefined): ts.Expression | undefined => {\n let current = expression;\n while (current && (ts.isAsExpression(current) || ts.isSatisfiesExpression(current) || ts.isParenthesizedExpression(current))) {\n current = current.expression;\n }\n return current;\n };\n const value = unwrap(node);\n if (value && ts.isArrayLiteralExpression(value)) return value;\n if (!value || !ts.isIdentifier(value)) return undefined;\n for (const statement of parseBrandlabSourceFile(file).statements) {\n if (!ts.isVariableStatement(statement)) continue;\n for (const declaration of statement.declarationList.declarations) {\n if (ts.isIdentifier(declaration.name) && declaration.name.text === value.text) {\n const initializer = unwrap(declaration.initializer);\n return initializer && ts.isArrayLiteralExpression(initializer) ? initializer : undefined;\n }\n }\n }\n return undefined;\n}\n\n/** Report the locations the site publishes outside the shared registry, with each group's reason. */\nfunction inspectSiteOwnedLocations(file: BrandlabSourceFile, add: Add) {\n for (const call of findImportedCalls(file, /^@brandlab-digital\\/site-core\\/locations$/, 'defineLocationEstate')) {\n const declared = objectPropertyValue(call.arguments[0], 'siteOwned');\n if (!declared) continue;\n const groups = arrayLiteral(file, declared);\n if (!groups) {\n add(file.path, 'estate-site-owned',\n 'siteOwned must be literal data in src/data/locations/estate.ts: [{ reason, slugs }], never derived.', { line: lineOfNode(file, declared) });\n continue;\n }\n if (groups.elements.length === 0) continue;\n let total = 0;\n const summaries = groups.elements.map(element => {\n const reason = objectPropertyValue(element, 'reason');\n const slugs = arrayLiteral(file, objectPropertyValue(element, 'slugs'));\n const count = slugs?.elements.length;\n total += count ?? 0;\n const label = reason && ts.isStringLiteralLike(reason) ? reason.text : 'a reason that is not a string literal';\n return `${count ?? 'an unknown number of'} for \"${label}\"`;\n });\n add(file.path, 'estate-site-owned',\n `${total} location(s) are published outside the shared geography registry, declared site-owned: ${summaries.join('; ')}.`,\n { severity: 'info', line: lineOfNode(file, groups) });\n }\n}\n\nfunction lineAtIndex(text: string, index: number): number {\n return text.slice(0, index).split('\\n').length;\n}\n\n// --- tests (sections 2 and 6) -------------------------------------------------\n\nfunction inspectTests(root: string, capabilities: ReturnType<typeof describeCapabilities>, add: Add) {\n if (!isDirectory(join(root, 'tests'))) return;\n for (const entry of readdirSync(join(root, 'tests'), { withFileTypes: true })) {\n if (entry.name.startsWith('.')) continue;\n if (!entry.isDirectory() || !TEST_DIRECTORIES.has(entry.name)) {\n add(`tests/${entry.name}`, 'test-layout', 'Tests live in tests/{config,data,lib,components,e2e,support}.');\n }\n }\n const required = [\n 'tests/data/routes.test.ts', 'tests/config/analytics.test.ts',\n 'tests/e2e/estate.spec.ts', 'tests/e2e/analytics.spec.ts', 'tests/e2e/families.spec.ts',\n ...(capabilities.contactEnabled ? ['tests/config/contact.test.ts', 'tests/e2e/contact.spec.ts'] : []),\n ];\n for (const path of required) {\n if (!existsSync(join(root, path))) add(path, 'shared-tests', `The shared 3.0 test set includes ${path}.`);\n }\n for (const path of walkProjectFiles(root, 'tests')) {\n if (/-darwin\\.png$/.test(path)) add(path, 'committed-snapshots', 'Delete committed darwin snapshots; rendered checks run against the CI build.');\n }\n}\n\n// --- dev presets (section 4) -------------------------------------------------\n\nfunction inspectToolPresets(root: string, add: Add) {\n const eslint = readOptional(join(root, 'eslint.config.mjs'));\n if (eslint === null) add('eslint.config.mjs', 'tool-preset', 'Add eslint.config.mjs: export default brandlab.configs.next.');\n else if (!/@brandlab-digital\\/eslint-plugin/.test(eslint) || !/export\\s+default\\s+[A-Za-z_$][\\w$]*\\.configs\\.next\\s*;?\\s*$/.test(eslint.trim())) {\n add('eslint.config.mjs', 'tool-preset', 'eslint.config.mjs is exactly `export default brandlab.configs.next` (imported from @brandlab-digital/eslint-plugin).');\n }\n const knip = readOptional(join(root, 'knip.ts'));\n if (knip === null) add('knip.ts', 'tool-preset', 'Add knip.ts: export default brandlabKnip({ mdx?, entry? }).');\n else if (!/@brandlab-digital\\/conformance\\/knip/.test(knip) || !/export\\s+default\\s+brandlabKnip\\s*\\(/.test(knip)) {\n add('knip.ts', 'tool-preset', 'knip.ts exports brandlabKnip({ mdx?, entry? }) from @brandlab-digital/conformance/knip.');\n }\n if (!['playwright.config.ts', 'playwright.config.mts'].some(name => existsSync(join(root, name)))) {\n add('playwright.config.ts', 'tool-preset', 'Add the Playwright configuration for the shared e2e specs.');\n }\n if (!['vitest.config.ts', 'vitest.config.mts'].some(name => existsSync(join(root, name)))) {\n add('vitest.config.ts', 'tool-preset', 'Add the Vitest configuration for the binding tests.');\n }\n}\n\n// --- CI, dependencies, Vercel and docs (section 6) ---------------------------\n\nfunction inspectDelivery(root: string, add: Add) {\n const workflowDirectory = join(root, '.github/workflows');\n const workflows = isDirectory(workflowDirectory) ? readdirSync(workflowDirectory).filter(name => /\\.ya?ml$/.test(name)).sort() : [];\n const callers = workflows.filter(name => /uses\\s*:\\s*['\"]?RomieDandan\\/brandlab\\/\\.github\\/workflows\\/verify-next\\.yml@/.test(readFileSync(join(workflowDirectory, name), 'utf8')));\n if (callers.length !== 1 || callers[0] !== 'verify.yml') {\n add('.github/workflows/verify.yml', 'ci-workflow', `Exactly one .github/workflows/verify.yml calls RomieDandan/brandlab/.github/workflows/verify-next.yml at the fleet SHA (found ${callers.length ? callers.join(', ') : 'none'}).`);\n }\n for (const path of ['.github/dependabot.yml', '.github/dependabot.yaml', 'renovate.json', 'renovate.json5', '.github/renovate.json', '.renovaterc', '.renovaterc.json']) {\n if (existsSync(join(root, path))) add(path, 'dependency-bots', 'Exact pins move with Brandlab releases; remove Dependabot/Renovate version updates.');\n }\n const vercel = readOptional(join(root, 'vercel.json'));\n let installCommand: unknown;\n try { installCommand = vercel === null ? undefined : JSON.parse(vercel).installCommand; } catch { installCommand = undefined; }\n if (installCommand !== 'npm ci') add('vercel.json', 'vercel-install', 'vercel.json sets installCommand to \"npm ci\".');\n let regions: unknown;\n try { regions = vercel === null ? undefined : JSON.parse(vercel).regions; } catch { regions = undefined; }\n if (!Array.isArray(regions) || regions.length !== 1 || regions[0] !== BRANDLAB_FUNCTION_REGION) {\n add('vercel.json', 'vercel-region', `vercel.json runs the server functions in Sydney: \"regions\": [\"${BRANDLAB_FUNCTION_REGION}\"] (found ${regions === undefined ? 'no regions' : JSON.stringify(regions)}). The visitors are in Australia; a Washington (iad1) function adds a Pacific round trip to every request it serves.`);\n }\n\n if (!existsSync(join(root, 'README.md'))) add('README.md', 'project-docs', 'Add the generated README.md (commands, architecture, environment names, deployment and rollback).');\n const agents = join(root, 'AGENTS.md');\n if (!existsSync(agents)) add('AGENTS.md', 'project-docs', 'Add AGENTS.md with the fixed sources of truth and guardrails.');\n else if (statSync(agents).size > 3_584) add('AGENTS.md', 'project-docs', `AGENTS.md is ${statSync(agents).size} bytes; keep it to about 3 KB and archive history to the control repo.`);\n const claude = readOptional(join(root, 'CLAUDE.md'));\n if (claude === null || claude.trim() !== '@AGENTS.md') add('CLAUDE.md', 'project-docs', 'CLAUDE.md is the single line @AGENTS.md.');\n}\n\nconst directoryListings = new Map<string, ReadonlySet<string>>();\n\n/** The exact file names in a directory (cached per check run). */\nfunction directoryEntries(path: string): ReadonlySet<string> {\n let entries = directoryListings.get(path);\n if (!entries) {\n try { entries = new Set(readdirSync(path)); } catch { entries = new Set(); }\n directoryListings.set(path, entries);\n }\n return entries;\n}\n\nfunction readOptional(path: string): string | null {\n return existsSync(path) ? readFileSync(path, 'utf8') : null;\n}\n"]}
1
+ {"version":3,"file":"engineering.js","sourceRoot":"","sources":["../src/engineering.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';\nimport { join, posix } from 'node:path';\nimport ts from 'typescript';\nimport { globMatch } from './glob.js';\nimport {\n collectBrandlabSource,\n createBrandlabModuleResolver,\n findImportedCalls,\n isDirectory,\n lineOfNode,\n listModuleReferences,\n objectPropertyValue,\n parseBrandlabSourceFile,\n walkProjectFiles,\n type BrandlabSourceFile,\n type BrandlabSourceIndex,\n} from './source-files.js';\nimport { describeCapabilities } from './static-rules.js';\n\nexport const ENGINEERING_FAST_COMMANDS = ['typecheck', 'lint', 'test', 'check:unused', 'check:unused:production', 'check:standards'] as const;\n\n/** The exact fast verification command from the Brandlab 3.0 target (section 6). */\nexport const BRANDLAB_EXPECTED_VERIFY_SCRIPT =\n 'npm run check:standards && npm run typecheck && npm run lint && npm run test && npm run check:unused && npm run check:unused:production';\n\n/** Scripts whose exact values the 3.0 target fixes; dev and start must exist. */\nexport const BRANDLAB_EXPECTED_SCRIPTS: Readonly<Record<string, string>> = Object.freeze({\n build: 'next build',\n typecheck: 'next typegen && tsc --noEmit',\n lint: 'eslint .',\n test: 'vitest run',\n 'test:e2e': 'playwright test',\n 'check:unused': 'knip',\n 'check:unused:production': 'knip --production',\n 'check:standards': 'brandlab-verify --mode ci --engineering',\n});\n\nexport type EngineeringFindingSeverity = 'blocker' | 'info';\nexport interface EngineeringFinding { path: string; rule: string; message: string; severity: EngineeringFindingSeverity; line?: number }\nexport interface EngineeringCheck {\n status: 'pass' | 'blocked';\n findings: EngineeringFinding[];\n coverage: string;\n outstandingEvidence: readonly string[];\n}\n\ninterface PackageManifest {\n type?: string;\n scripts?: Record<string, string>;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n}\n\nconst SRC_DIRECTORIES = new Set(['app', 'config', 'data', 'content', 'lib', 'components', 'types']);\nconst SRC_ROOT_FILES = /^(?:instrumentation(?:-client)?|proxy|mdx-components)\\.(?:ts|tsx)$/;\nconst COMPONENT_ROLES = new Set(['layout', 'ui', 'sections', 'features', 'page-families']);\nconst TEST_DIRECTORIES = new Set(['config', 'data', 'lib', 'components', 'e2e', 'support']);\nconst RETIRED_ROOT_DIRECTORIES = ['app', 'components', 'data', 'lib', 'config', 'content', 'hooks', 'context', 'utils', 'src/components/templates'];\nconst DEV_TOOLING = ['eslint', 'vitest', '@playwright/test', 'knip'];\nconst NEXT_SPECIAL_FILE = /^(?:page|layout|template|loading|error|global-error|not-found|global-not-found|forbidden|unauthorized|default|route|opengraph-image|twitter-image|icon|apple-icon|sitemap|robots|manifest)\\.(?:ts|tsx|js|jsx|mdx)$/;\nconst CODE_OR_STYLE = /\\.(?:[cm]?[jt]sx?|mdx|css)$/;\nconst PASCAL_COMPONENT = /^[A-Z][A-Za-z0-9]*\\.tsx$/;\nconst CAMEL_MODULE = /^[a-z][A-Za-z0-9]*(?:\\.d)?\\.ts$/;\nconst SEMVER = /^\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?$/;\n\n/** The Vercel function region of every Brandlab site (3.2.1): Sydney. */\nexport const BRANDLAB_FUNCTION_REGION = 'syd1';\n/** The contact route's delivery options (labels, email style, attachment policy): server-only (3.2.1). */\nconst CONTACT_RUNTIME = 'src/config/contactRuntime.ts';\n/** The business facts' evidence (defineBrandlabBusiness): server-only (3.2.1). */\nconst BUSINESS_EVIDENCE = 'src/data/businessEvidence.ts';\nconst BUSINESS_VALUES = 'src/data/business.ts';\nconst SITE_IDENTITY = 'src/config/site.ts';\nconst BUSINESS_FACT_CALLS = /\\b(?:defineBrandlabBusiness|verifiedFact|unknownFact|notApplicableFact)\\s*\\(/;\n\n/** Opt-in structural check. Static success must never masquerade as whole-project acceptance. */\nexport function checkEngineeringStructure(root: string): EngineeringCheck {\n directoryListings.clear();\n const findings: EngineeringFinding[] = [];\n const add = (path: string, rule: string, message: string, extra: { severity?: EngineeringFindingSeverity; line?: number } = {}) =>\n findings.push({ path, rule, message, severity: extra.severity ?? 'blocker', ...(extra.line ? { line: extra.line } : {}) });\n let pkg: PackageManifest = {};\n try { pkg = JSON.parse(readFileSync(join(root, 'package.json'), 'utf8')); }\n catch { add('package.json', 'package-readable', 'A readable package.json is required.'); }\n const config = existsSync(join(root, 'brandlab.config.ts')) ? readFileSync(join(root, 'brandlab.config.ts'), 'utf8') : null;\n const capabilities = describeCapabilities(root, config);\n\n const source = collectBrandlabSource(root);\n\n inspectCommands(pkg, add);\n inspectDependencies(pkg, add);\n inspectLayout(root, capabilities, add);\n inspectSourceModules(root, source, add);\n inspectServerBoundaries(root, capabilities, source, add);\n inspectTests(root, capabilities, add);\n inspectToolPresets(root, add);\n inspectDelivery(root, add);\n\n return { status: findings.some(finding => finding.severity === 'blocker') ? 'blocked' : 'pass', findings,\n coverage: 'Static layout, naming, command, dependency-pin, tool-preset, CI, deployment and documentation structure only. This is not engineering-standard completion.',\n outstandingEvidence: ['Usage and deletion review including assets, configuration and dynamic references', 'Business data and component/style ownership review', 'Clean install, fast checks and production build', 'Full discovered technical URL estate', 'All distinct page families and important browser journeys', 'Exact-source protected Preview', 'Reporting/Ads provider cutover and authorised production verification'] };\n}\n\ntype Add = (path: string, rule: string, message: string, extra?: { severity?: EngineeringFindingSeverity; line?: number }) => void;\n\n// --- commands (section 6) ----------------------------------------------------\n\nfunction inspectCommands(pkg: PackageManifest, add: Add) {\n const scripts = pkg.scripts ?? {};\n for (const command of ['dev', 'start', ...ENGINEERING_FAST_COMMANDS, 'verify', 'build', 'test:e2e']) {\n if (!scripts[command]?.trim()) add('package.json', 'command-contract', `Missing ${command} command.`);\n }\n for (const [name, expected] of Object.entries(BRANDLAB_EXPECTED_SCRIPTS)) {\n const actual = scripts[name]?.trim();\n if (actual && actual.replace(/\\s+/g, ' ') !== expected) {\n add('package.json', 'script-contract', `${name} must be exactly \"${expected}\" (found \"${actual}\").`);\n }\n }\n const verify = scripts.verify?.trim();\n if (verify) {\n const unrecognised = splitCommandChain(verify).filter(segment => scriptReferences(segment, scripts) === null);\n if (unrecognised.length > 0) {\n add('package.json', 'verification-command-form',\n `verify may only chain package scripts (npm run <script>, npm test, run-s, run-p); \"${unrecognised.join('\", \"')}\" is not recognised. Expected \"${BRANDLAB_EXPECTED_VERIFY_SCRIPT}\".`);\n }\n }\n const reachable = new Set<string>();\n const visit = (name: string) => {\n if (reachable.has(name)) return;\n reachable.add(name);\n for (const segment of splitCommandChain(scripts[name] ?? '')) {\n for (const reference of scriptReferences(segment, scripts) ?? []) visit(reference);\n }\n };\n visit('verify');\n for (const command of ENGINEERING_FAST_COMMANDS) {\n if (!reachable.has(command)) add('package.json', 'verification-wiring', `verify must execute ${command}. Expected \"${BRANDLAB_EXPECTED_VERIFY_SCRIPT}\".`);\n }\n if (reachable.has('build')) add('package.json', 'single-build', 'Keep the production build separate from fast verify; run it once for the final candidate.');\n}\n\n/** Split a shell command on its chaining operators. */\nexport function splitCommandChain(command: string): string[] {\n return command.split(/&&|\\|\\||[;|&]/).map(segment => segment.trim()).filter(Boolean);\n}\n\n/**\n * The package scripts one command segment runs, or null when the segment is\n * not a recognised script invocation (npm run, npm test, run-s, run-p, npm-run-all).\n */\nexport function scriptReferences(segment: string, scripts: Readonly<Record<string, string>>): string[] | null {\n const words = segment.split(/\\s+/).filter(Boolean);\n while (words[0] && /^[A-Z_][A-Z0-9_]*=/.test(words[0])) words.shift();\n const [tool, ...rest] = words;\n if (tool === 'npm') {\n const [subcommand, ...args] = rest;\n if (subcommand === 'test' || subcommand === 't') return ['test'];\n if (subcommand === 'start' || subcommand === 'stop' || subcommand === 'restart') return [subcommand];\n if (subcommand === 'run' || subcommand === 'run-script') {\n const name = args.find(arg => !arg.startsWith('-'));\n return name ? [name] : null;\n }\n return null;\n }\n if (tool === 'run-s' || tool === 'run-p' || tool === 'npm-run-all') {\n const patterns: string[] = [];\n for (const word of rest) {\n if (word === '--') break;\n if (!word.startsWith('-')) patterns.push(word.replace(/^['\"]|['\"]$/g, ''));\n }\n if (patterns.length === 0) return null;\n // npm-run-all globs: `*` stays within one `:` segment; a whole `**` segment spans several.\n return patterns.flatMap(pattern => pattern.includes('*') || pattern.includes('?') || pattern.includes('[')\n ? Object.keys(scripts).filter(name => globMatch(pattern, name, { separator: ':', globstar: true }))\n : [pattern]);\n }\n return null;\n}\n\n// --- dependencies (section 1) ------------------------------------------------\n\nfunction inspectDependencies(pkg: PackageManifest, add: Add) {\n if (pkg.type !== 'module') add('package.json', 'module-type', 'Declare \"type\": \"module\".');\n const dependencies = { ...pkg.dependencies, ...pkg.devDependencies };\n for (const tool of DEV_TOOLING) {\n const spec = pkg.devDependencies?.[tool];\n if (!spec || !SEMVER.test(spec)) add('package.json', 'dev-tooling', `Pin ${tool} exactly as a development dependency.`);\n }\n // Packed preflight binds the four Brandlab packages to local file: archives; the evaluator verifies those.\n const ranges = Object.entries(dependencies)\n .filter(([name, spec]) => !SEMVER.test(spec) && !(name.startsWith('@brandlab-digital/') && spec.startsWith('file:')))\n .map(([name, spec]) => `${name}@${spec}`);\n if (ranges.length > 0) add('package.json', 'exact-pins', `Pin every dependency to the exact locked version: ${ranges.sort().join(', ')}.`);\n const next = dependencies.next;\n for (const companion of ['eslint-config-next', '@next/mdx']) {\n const spec = dependencies[companion];\n if (spec && spec !== next) add('package.json', 'framework-companion-pin', `${companion} must equal the next version (${next ?? 'missing'}); found ${spec}.`);\n }\n if (!dependencies['eslint-config-next']) add('package.json', 'framework-companion-pin', 'Declare eslint-config-next at the exact next version for brandlab.configs.next.');\n if (pkg.dependencies?.sharp || pkg.devDependencies?.sharp) add('package.json', 'sharp-override-only', 'Remove the direct sharp dependency; the release-owned overrides.sharp pin is the only declaration.');\n}\n\n// --- layout and naming (section 2) --------------------------------------------\n\nfunction inspectLayout(root: string, capabilities: ReturnType<typeof describeCapabilities>, add: Add) {\n for (const path of ['src/app', 'src/config', 'src/data', 'src/lib', 'src/components', 'tests']) {\n if (!isDirectory(join(root, path))) add(path, 'source-organisation', `Place the corresponding implementation under ${path}.`);\n }\n for (const path of RETIRED_ROOT_DIRECTORIES) {\n if (existsSync(join(root, path))) add(path, 'retired-source-layout', 'Migrate consumers to the current src responsibilities and remove the superseded directory.');\n }\n const required = [\n 'src/config/site.ts', 'src/config/analytics.ts', 'src/data/business.ts', 'src/data/routes.ts', 'src/data/redirects.ts',\n 'src/lib/seo/metadata.ts', 'src/instrumentation-client.ts', 'src/app/layout.tsx', 'src/app/robots.ts', 'src/app/sitemap.xml/route.ts',\n 'src/data/businessEvidence.ts',\n ...(capabilities.contactEnabled ? ['src/config/contact.ts', CONTACT_RUNTIME, 'src/app/api/contact/route.ts'] : []),\n ...(capabilities.reviewsEnabled ? ['src/config/reviews.ts'] : []),\n ...(capabilities.locationsDeclared ? ['src/data/locations/estate.ts'] : []),\n ];\n for (const path of required) {\n if (!existsSync(join(root, path))) add(path, 'owner-file', `The 3.0 layout places this owner at ${path}.`);\n }\n for (const [path, message] of [\n ['src/config/env.ts', 'Remove the local environment parser; site configuration is a source constant.'],\n ['src/lib/analytics', 'Remove the local analytics layer; installBrandlabInstrumentation owns it.'],\n ['src/lib/contact/definition.ts', 'Remove the local contact definition; the contract lives in src/config/contact.ts.'],\n ['src/lib/contact/constants.ts', 'Remove the local contact constants; the contract lives in src/config/contact.ts.'],\n ['src/lib/contact/runtime.ts', 'Remove the local contact runtime; POST uses createBrandlabContactRouteHandler.'],\n ['src/components/analytics/GoogleTag.tsx', 'Render BrandlabGoogleTag directly in src/app/layout.tsx.'],\n ['src/components/analytics/CoreWebVitalsReporter.tsx', 'Remove the web-vitals reporter.'],\n ['src/lib/seo/sitemaps', 'Remove the local sitemap builders; the sitemap route uses createBrandlabSitemapRoute.'],\n ['src/lib/seo/sitemaps.ts', 'Remove the local sitemap builders; the sitemap route uses createBrandlabSitemapRoute.'],\n ['src/lib/seo/schema/sanitize.ts', 'Remove the local schema sanitiser; the packages own sanitising.'],\n ['src/lib/seo/schema/SchemaScript.tsx', 'Import SchemaScript from @brandlab-digital/site-next/schema.'],\n ['src/lib/seo/index.ts', 'Remove the SEO barrel and import each module directly.'],\n ] as const) {\n if (existsSync(join(root, path))) add(path, 'retired-file', message);\n }\n\n if (isDirectory(join(root, 'src'))) {\n for (const entry of readdirSync(join(root, 'src'), { withFileTypes: true })) {\n if (entry.name.startsWith('.')) continue;\n const path = `src/${entry.name}`;\n if (entry.isDirectory() && SRC_DIRECTORIES.has(entry.name)) {\n if (entry.name === 'types' && walkProjectFiles(root, path).some(file => !file.endsWith('.d.ts'))) {\n add(path, 'standard-layout', 'src/types may hold only ambient .d.ts declarations.');\n }\n continue;\n }\n if (entry.isFile() && SRC_ROOT_FILES.test(entry.name)) continue;\n add(path, 'standard-layout', `${path} is outside the standard layout (src/{app,config,data,content,lib,components}).`);\n }\n }\n if (isDirectory(join(root, 'src/components'))) {\n for (const entry of readdirSync(join(root, 'src/components'), { withFileTypes: true })) {\n if (entry.name.startsWith('.') || entry.name === 'templates') continue;\n if (!entry.isDirectory() || !COMPONENT_ROLES.has(entry.name)) {\n add(`src/components/${entry.name}`, 'component-role', 'Components belong to one role: layout, ui, sections, features or page-families.');\n }\n }\n }\n for (const path of walkProjectFiles(root, 'src')) inspectFileName(root, path, add);\n}\n\nfunction inspectFileName(root: string, path: string, add: Add) {\n const name = posix.basename(path);\n const directory = posix.dirname(path);\n if (directory === 'src' && SRC_ROOT_FILES.test(name)) return;\n if (name.endsWith('.module.css')) {\n const component = name.replace(/\\.module\\.css$/, '');\n // Exact names from the directory listing: existsSync is case-insensitive on macOS but not on the Linux CI\n // (a button.module.css beside Button.tsx passed locally and failed in CI).\n const siblings = directoryEntries(join(root, directory));\n if (!['tsx', 'ts', 'jsx'].some(extension => siblings.has(`${component}.${extension}`))) {\n add(path, 'file-naming', `Keep ${name} beside the ${component} component it styles (the file names must match exactly, including case).`);\n }\n return;\n }\n if (path.startsWith('src/app/')) {\n // Images, fonts and metadata assets are framework-consumed; only code and styles are placed.\n if (!CODE_OR_STYLE.test(name)) return;\n const segments = path.split('/');\n const privateFolder = segments.slice(2, -1).find(segment => segment.startsWith('_') && segment !== '_components');\n if (privateFolder) {\n add(path, 'route-local-code', `Route-local code belongs in src/app/<route>/_components/, not ${privateFolder}/.`);\n return;\n }\n if (!segments.includes('_components')) {\n if (NEXT_SPECIAL_FILE.test(name) || path === 'src/app/globals.css') return;\n add(path, 'route-local-code', 'Route-local code belongs in src/app/<route>/_components/; framework files keep their reserved names.');\n return;\n }\n }\n if (!/\\.(?:ts|tsx)$/.test(name) || path.startsWith('src/content/')) return;\n if (name.endsWith('.tsx') && !PASCAL_COMPONENT.test(name)) {\n add(path, 'file-naming', 'Components use PascalCase .tsx file names.');\n } else if (name.endsWith('.ts') && !CAMEL_MODULE.test(name)) {\n add(path, 'file-naming', 'Data and helper modules use camelCase .ts file names.');\n }\n if (path.startsWith('src/components/page-families/') && name.endsWith('.tsx') && !/^[A-Z][A-Za-z0-9]*Page\\.tsx$/.test(name)) {\n add(path, 'file-naming', 'Page families are named <RouteKind>Page.tsx.');\n }\n}\n\n// --- module structure: barrels, ui data imports, estate ----------------------\n\nfunction inspectSourceModules(root: string, source: BrandlabSourceIndex, add: Add) {\n const resolver = createBrandlabModuleResolver(root, new Set(source.byPath.keys()));\n for (const file of source.files.filter(candidate => candidate.path.startsWith('src/'))) {\n const references = listModuleReferences(file);\n const forwarding = forwardingExports(file);\n if (isBarrel(file)) {\n add(file.path, 'no-barrels', 'This module only re-exports other modules; import each owner directly.');\n } else {\n for (const line of forwarding) {\n add(file.path, 'no-forwarding-exports', 'This export forwards another module; import the owner directly.', { line });\n }\n }\n if (file.path.startsWith('src/components/ui/')) {\n for (const reference of references.filter(candidate => candidate.kind !== 'export')) {\n const resolved = resolver(file.path, reference.specifier);\n if (resolved?.startsWith('src/data/') || /^@\\/data(?:\\/|$)/.test(reference.specifier)) {\n add(file.path, 'ui-imports-data', 'UI primitives never import data modules; pass prepared props from a section or route.', { line: reference.line });\n }\n }\n }\n inspectRegistryDerivedEstate(file, add);\n }\n const estate = source.byPath.get('src/data/locations/estate.ts');\n if (estate) {\n inspectRetainedExclusions(estate, add);\n inspectSiteOwnedLocations(estate, add);\n }\n}\n\n// --- server-only boundaries (3.2.1) ------------------------------------------\n\n/**\n * What a browser bundle must never carry. The contact route's delivery options and\n * the business evidence live in server-only modules, alias hosts in next.config, and\n * no module a client component reaches imports a server-only module or holds an\n * evidence record. (Next's build also refuses a client import of `server-only`; this\n * names the chain before a build is needed.)\n */\nfunction inspectServerBoundaries(\n root: string,\n capabilities: ReturnType<typeof describeCapabilities>,\n source: BrandlabSourceIndex,\n add: Add,\n) {\n const contact = source.byPath.get('src/config/contact.ts');\n const runtime = source.byPath.get(CONTACT_RUNTIME);\n if (capabilities.contactEnabled && runtime) {\n if (!importsServerOnly(runtime)) {\n add(CONTACT_RUNTIME, 'server-only-module', `${CONTACT_RUNTIME} imports 'server-only', so no client component can bundle the delivery options.`);\n }\n if (!declaresName(runtime, 'contactRuntime')) {\n add(CONTACT_RUNTIME, 'contact-runtime', `${CONTACT_RUNTIME} exports contactRuntime (the labels, email style and attachment policy createBrandlabContactRouteHandler takes).`);\n }\n }\n const moved = contact ? declaresName(contact, 'contactRuntime') : undefined;\n if (contact && moved) {\n add('src/config/contact.ts', 'contact-runtime', `contactRuntime belongs in ${CONTACT_RUNTIME}: the contact form imports src/config/contact.ts, so everything contactRuntime reads (the site identity, business data) reaches the browser.`, { line: moved });\n }\n\n const evidence = source.byPath.get(BUSINESS_EVIDENCE);\n if (evidence) {\n if (!importsServerOnly(evidence)) {\n add(BUSINESS_EVIDENCE, 'server-only-module', `${BUSINESS_EVIDENCE} imports 'server-only', so no client component can bundle the evidence records.`);\n }\n if (findImportedCalls(evidence, /^@brandlab-digital\\/site-core\\/business$/, 'defineBrandlabBusiness').length === 0) {\n add(BUSINESS_EVIDENCE, 'business-evidence', `${BUSINESS_EVIDENCE} declares the business facts with defineBrandlabBusiness, each with its evidence.`);\n }\n }\n const values = source.byPath.get(BUSINESS_VALUES);\n if (values) {\n const call = BUSINESS_FACT_CALLS.exec(values.executable);\n const record = evidenceRecordLines(values)[0];\n if (call || record) {\n add(BUSINESS_VALUES, 'business-evidence', `${BUSINESS_VALUES} holds the display values only (businessFacts); defineBrandlabBusiness and the evidence belong in ${BUSINESS_EVIDENCE}, which stays on the server.`,\n { line: record ?? lineAtIndex(values.text, call!.index) });\n }\n }\n\n const site = source.byPath.get(SITE_IDENTITY);\n const aliasHosts = site ? declaredAliasHosts(site) : undefined;\n if (aliasHosts) {\n add(SITE_IDENTITY, 'alias-hosts', 'Declare the alias hosts in next.config.ts with defineBrandlabNextConfig({ aliasHosts }): client components import the site identity, so its alias hosts reach the browser.', { line: aliasHosts });\n }\n\n const resolver = createBrandlabModuleResolver(root, new Set(source.byPath.keys()));\n const reached = new Map<string, string | null>();\n const queue = source.files.filter(file => file.path.startsWith('src/') && (isClientModule(file) || /^src\\/instrumentation-client\\.[cm]?[jt]sx?$/.test(file.path)));\n for (const file of queue) reached.set(file.path, null);\n while (queue.length > 0) {\n const file = queue.shift()!;\n for (const reference of listModuleReferences(file)) {\n if (reference.typeOnly) continue;\n const target = resolver(file.path, reference.specifier);\n if (!target || reached.has(target)) continue;\n reached.set(target, file.path);\n const next = source.byPath.get(target);\n if (next) queue.push(next);\n }\n }\n const chain = (path: string) => {\n const steps: string[] = [];\n for (let at: string | null | undefined = path; at; at = reached.get(at)) steps.unshift(at);\n return steps.join(' → ');\n };\n for (const path of [...reached.keys()].sort()) {\n const file = source.byPath.get(path);\n if (!file) continue;\n if (importsServerOnly(file)) {\n add(path, 'client-bundle-boundary', `A client component imports this server-only module (${chain(path)}); pass what it needs as props from a server component.`);\n continue;\n }\n const record = evidenceRecordLines(file)[0];\n if (record) {\n add(path, 'client-bundle-boundary', `An evidence record (sourceKind, verifiedAt) reaches the browser (${chain(path)}); keep evidence in ${BUSINESS_EVIDENCE}.`, { line: record });\n }\n }\n}\n\n/** A module whose directive prologue says 'use client'. */\nfunction isClientModule(file: BrandlabSourceFile): boolean {\n for (const statement of parseBrandlabSourceFile(file).statements) {\n if (!ts.isExpressionStatement(statement) || !ts.isStringLiteral(statement.expression)) return false;\n if (statement.expression.text === 'use client') return true;\n }\n return false;\n}\n\n/** `import 'server-only'` at the top level. */\nfunction importsServerOnly(file: BrandlabSourceFile): boolean {\n return parseBrandlabSourceFile(file).statements.some(statement =>\n ts.isImportDeclaration(statement) && !statement.importClause &&\n ts.isStringLiteral(statement.moduleSpecifier) && statement.moduleSpecifier.text === 'server-only');\n}\n\n/** The line of a top-level declaration of `name`, if the module declares it. */\nfunction declaresName(file: BrandlabSourceFile, name: string): number | undefined {\n for (const statement of parseBrandlabSourceFile(file).statements) {\n if (ts.isVariableStatement(statement)) {\n for (const declaration of statement.declarationList.declarations) {\n if (ts.isIdentifier(declaration.name) && declaration.name.text === name) return lineOfNode(file, statement);\n }\n } else if ((ts.isFunctionDeclaration(statement) || ts.isClassDeclaration(statement)) && statement.name?.text === name) {\n return lineOfNode(file, statement);\n }\n }\n return undefined;\n}\n\n/** Lines of object literals that are evidence records: they name both sourceKind and verifiedAt. */\nfunction evidenceRecordLines(file: BrandlabSourceFile): number[] {\n const lines: number[] = [];\n const visit = (node: ts.Node) => {\n if (ts.isObjectLiteralExpression(node)) {\n const names = new Set(node.properties.map(property => property.name && (ts.isIdentifier(property.name) || ts.isStringLiteral(property.name)) ? property.name.text : ''));\n if (names.has('sourceKind') && names.has('verifiedAt')) lines.push(lineOfNode(file, node));\n }\n ts.forEachChild(node, visit);\n };\n visit(parseBrandlabSourceFile(file));\n return lines;\n}\n\n/** The line of a non-empty `aliasHosts` in the defineBrandlabSite call. */\nfunction declaredAliasHosts(file: BrandlabSourceFile): number | undefined {\n for (const call of findImportedCalls(file, /^@brandlab-digital\\/site-core\\/site$/, 'defineBrandlabSite')) {\n let definition: ts.Expression | undefined = call.arguments[0];\n while (definition && (ts.isAsExpression(definition) || ts.isSatisfiesExpression(definition) || ts.isParenthesizedExpression(definition))) {\n definition = definition.expression;\n }\n if (!definition || !ts.isObjectLiteralExpression(definition)) continue;\n const property = definition.properties.find(candidate =>\n (ts.isPropertyAssignment(candidate) || ts.isShorthandPropertyAssignment(candidate)) &&\n (ts.isIdentifier(candidate.name) || ts.isStringLiteral(candidate.name)) && candidate.name.text === 'aliasHosts');\n if (!property) continue;\n const array = ts.isPropertyAssignment(property)\n ? arrayLiteral(file, property.initializer)\n : ts.isShorthandPropertyAssignment(property) ? arrayLiteral(file, property.name) : undefined;\n if (array && array.elements.length === 0) continue;\n return lineOfNode(file, property);\n }\n return undefined;\n}\n\n/** Lines of `export ... from` statements and exports of names this module only imported. */\nfunction forwardingExports(file: BrandlabSourceFile): number[] {\n const source = parseBrandlabSourceFile(file);\n const imported = new Set(listModuleReferences(file).filter(reference => reference.kind === 'import').flatMap(reference => reference.bindings.map(binding => binding.local)));\n const lines: number[] = [];\n for (const statement of source.statements) {\n const forwards =\n (ts.isExportDeclaration(statement) && (statement.moduleSpecifier !== undefined ||\n (statement.exportClause !== undefined && ts.isNamedExports(statement.exportClause) &&\n statement.exportClause.elements.some(element => imported.has((element.propertyName ?? element.name).text))))) ||\n (ts.isExportAssignment(statement) && ts.isIdentifier(statement.expression) && imported.has(statement.expression.text));\n if (forwards) lines.push(lineOfNode(file, statement));\n }\n return lines;\n}\n\n/** A module with no declarations or statements of its own besides imports and exports. */\nfunction isBarrel(file: BrandlabSourceFile): boolean {\n const statements = parseBrandlabSourceFile(file).statements;\n return statements.length > 0 && forwardingExports(file).length > 0 &&\n statements.every(statement => ts.isImportDeclaration(statement) || ts.isExportDeclaration(statement) || ts.isExportAssignment(statement));\n}\n\nfunction inspectRegistryDerivedEstate(file: BrandlabSourceFile, add: Add) {\n const derived = listModuleReferences(file)\n .filter(reference => reference.kind === 'import' && /^@brandlab-digital\\/site-core\\//.test(reference.specifier))\n .flatMap(reference => reference.bindings.filter(binding => /WebsiteSuburbs$/.test(binding.imported)).map(binding => ({ ...binding, line: reference.line })));\n const namespaceUse = file.executable.match(/\\.\\s*([a-z][A-Za-z]*WebsiteSuburbs)\\b/);\n const first = derived[0] ?? (namespaceUse ? { imported: namespaceUse[1]!, line: lineAtIndex(file.text, namespaceUse.index ?? 0) } : null);\n if (!first) return;\n add(file.path, 'estate-registry-derived',\n `${first.imported} is a registry candidate list; the published estate in src/data/locations/estate.ts must be literal data, never derived from it.`, { line: first.line });\n}\n\nfunction inspectRetainedExclusions(file: BrandlabSourceFile, add: Add) {\n for (const call of findImportedCalls(file, /^@brandlab-digital\\/site-core\\/locations$/, 'defineLocationEstate')) {\n const retained = objectPropertyValue(call.arguments[0], 'retainedExclusions');\n if (!retained || !ts.isArrayLiteralExpression(retained) || retained.elements.length === 0) continue;\n const slugs = retained.elements.map(element => {\n if (ts.isStringLiteralLike(element)) return element.text;\n const slug = objectPropertyValue(element, 'slug');\n return slug && ts.isStringLiteralLike(slug) ? slug.text : null;\n }).filter((slug): slug is string => Boolean(slug));\n add(file.path, 'estate-retained-exclusions',\n `${retained.elements.length} policy-excluded location(s) stay published for a later SEO decision${slugs.length ? `: ${slugs.join(', ')}` : ''}.`,\n { severity: 'info', line: lineOfNode(file, retained) });\n }\n}\n\n/** An array literal, directly or through a top-level `const name = [...]` (optionally `as const`) in the same file. */\nfunction arrayLiteral(file: BrandlabSourceFile, node: ts.Expression | undefined): ts.ArrayLiteralExpression | undefined {\n const unwrap = (expression: ts.Expression | undefined): ts.Expression | undefined => {\n let current = expression;\n while (current && (ts.isAsExpression(current) || ts.isSatisfiesExpression(current) || ts.isParenthesizedExpression(current))) {\n current = current.expression;\n }\n return current;\n };\n const value = unwrap(node);\n if (value && ts.isArrayLiteralExpression(value)) return value;\n if (!value || !ts.isIdentifier(value)) return undefined;\n for (const statement of parseBrandlabSourceFile(file).statements) {\n if (!ts.isVariableStatement(statement)) continue;\n for (const declaration of statement.declarationList.declarations) {\n if (ts.isIdentifier(declaration.name) && declaration.name.text === value.text) {\n const initializer = unwrap(declaration.initializer);\n return initializer && ts.isArrayLiteralExpression(initializer) ? initializer : undefined;\n }\n }\n }\n return undefined;\n}\n\n/** Report the locations the site publishes outside the shared registry, with each group's reason. */\nfunction inspectSiteOwnedLocations(file: BrandlabSourceFile, add: Add) {\n for (const call of findImportedCalls(file, /^@brandlab-digital\\/site-core\\/locations$/, 'defineLocationEstate')) {\n const declared = objectPropertyValue(call.arguments[0], 'siteOwned');\n if (!declared) continue;\n const groups = arrayLiteral(file, declared);\n if (!groups) {\n add(file.path, 'estate-site-owned',\n 'siteOwned must be literal data in src/data/locations/estate.ts: [{ reason, slugs }], never derived.', { line: lineOfNode(file, declared) });\n continue;\n }\n if (groups.elements.length === 0) continue;\n let total = 0;\n const summaries = groups.elements.map(element => {\n const reason = objectPropertyValue(element, 'reason');\n const slugs = arrayLiteral(file, objectPropertyValue(element, 'slugs'));\n const count = slugs?.elements.length;\n total += count ?? 0;\n const label = reason && ts.isStringLiteralLike(reason) ? reason.text : 'a reason that is not a string literal';\n return `${count ?? 'an unknown number of'} for \"${label}\"`;\n });\n add(file.path, 'estate-site-owned',\n `${total} location(s) are published outside the shared geography registry, declared site-owned: ${summaries.join('; ')}.`,\n { severity: 'info', line: lineOfNode(file, groups) });\n }\n}\n\nfunction lineAtIndex(text: string, index: number): number {\n return text.slice(0, index).split('\\n').length;\n}\n\n// --- tests (sections 2 and 6) -------------------------------------------------\n\nfunction inspectTests(root: string, capabilities: ReturnType<typeof describeCapabilities>, add: Add) {\n if (!isDirectory(join(root, 'tests'))) return;\n for (const entry of readdirSync(join(root, 'tests'), { withFileTypes: true })) {\n if (entry.name.startsWith('.')) continue;\n if (!entry.isDirectory() || !TEST_DIRECTORIES.has(entry.name)) {\n add(`tests/${entry.name}`, 'test-layout', 'Tests live in tests/{config,data,lib,components,e2e,support}.');\n }\n }\n const required = [\n 'tests/data/routes.test.ts', 'tests/config/analytics.test.ts',\n 'tests/e2e/estate.spec.ts', 'tests/e2e/analytics.spec.ts', 'tests/e2e/families.spec.ts',\n ...(capabilities.contactEnabled ? ['tests/config/contact.test.ts', 'tests/e2e/contact.spec.ts'] : []),\n ];\n for (const path of required) {\n if (!existsSync(join(root, path))) add(path, 'shared-tests', `The shared 3.0 test set includes ${path}.`);\n }\n for (const path of walkProjectFiles(root, 'tests')) {\n if (/-darwin\\.png$/.test(path)) add(path, 'committed-snapshots', 'Delete committed darwin snapshots; rendered checks run against the CI build.');\n }\n}\n\n// --- dev presets (section 4) -------------------------------------------------\n\nfunction inspectToolPresets(root: string, add: Add) {\n const eslint = readOptional(join(root, 'eslint.config.mjs'));\n if (eslint === null) add('eslint.config.mjs', 'tool-preset', 'Add eslint.config.mjs: export default brandlab.configs.next.');\n else if (!/@brandlab-digital\\/eslint-plugin/.test(eslint) || !/export\\s+default\\s+[A-Za-z_$][\\w$]*\\.configs\\.next\\s*;?\\s*$/.test(eslint.trim())) {\n add('eslint.config.mjs', 'tool-preset', 'eslint.config.mjs is exactly `export default brandlab.configs.next` (imported from @brandlab-digital/eslint-plugin).');\n }\n const knip = readOptional(join(root, 'knip.ts'));\n if (knip === null) add('knip.ts', 'tool-preset', 'Add knip.ts: export default brandlabKnip({ mdx?, entry? }).');\n else if (!/@brandlab-digital\\/conformance\\/knip/.test(knip) || !/export\\s+default\\s+brandlabKnip\\s*\\(/.test(knip)) {\n add('knip.ts', 'tool-preset', 'knip.ts exports brandlabKnip({ mdx?, entry? }) from @brandlab-digital/conformance/knip.');\n }\n if (!['playwright.config.ts', 'playwright.config.mts'].some(name => existsSync(join(root, name)))) {\n add('playwright.config.ts', 'tool-preset', 'Add the Playwright configuration for the shared e2e specs.');\n }\n if (!['vitest.config.ts', 'vitest.config.mts'].some(name => existsSync(join(root, name)))) {\n add('vitest.config.ts', 'tool-preset', 'Add the Vitest configuration for the binding tests.');\n }\n}\n\n// --- CI, dependencies, Vercel and docs (section 6) ---------------------------\n\nfunction inspectDelivery(root: string, add: Add) {\n const workflowDirectory = join(root, '.github/workflows');\n const workflows = isDirectory(workflowDirectory) ? readdirSync(workflowDirectory).filter(name => /\\.ya?ml$/.test(name)).sort() : [];\n const callers = workflows.filter(name => /uses\\s*:\\s*['\"]?RomieDandan\\/brandlab\\/\\.github\\/workflows\\/verify-next\\.yml@/.test(readFileSync(join(workflowDirectory, name), 'utf8')));\n if (callers.length !== 1 || callers[0] !== 'verify.yml') {\n add('.github/workflows/verify.yml', 'ci-workflow', `Exactly one .github/workflows/verify.yml calls RomieDandan/brandlab/.github/workflows/verify-next.yml at the fleet SHA (found ${callers.length ? callers.join(', ') : 'none'}).`);\n }\n for (const path of ['.github/dependabot.yml', '.github/dependabot.yaml', 'renovate.json', 'renovate.json5', '.github/renovate.json', '.renovaterc', '.renovaterc.json']) {\n if (existsSync(join(root, path))) add(path, 'dependency-bots', 'Exact pins move with Brandlab releases; remove Dependabot/Renovate version updates.');\n }\n const vercel = readOptional(join(root, 'vercel.json'));\n let installCommand: unknown;\n try { installCommand = vercel === null ? undefined : JSON.parse(vercel).installCommand; } catch { installCommand = undefined; }\n if (installCommand !== 'npm ci') add('vercel.json', 'vercel-install', 'vercel.json sets installCommand to \"npm ci\".');\n let regions: unknown;\n try { regions = vercel === null ? undefined : JSON.parse(vercel).regions; } catch { regions = undefined; }\n if (!Array.isArray(regions) || regions.length !== 1 || regions[0] !== BRANDLAB_FUNCTION_REGION) {\n add('vercel.json', 'vercel-region', `vercel.json runs the server functions in Sydney: \"regions\": [\"${BRANDLAB_FUNCTION_REGION}\"] (found ${regions === undefined ? 'no regions' : JSON.stringify(regions)}). The visitors are in Australia; a Washington (iad1) function adds a Pacific round trip to every request it serves.`);\n }\n\n if (!existsSync(join(root, 'README.md'))) add('README.md', 'project-docs', 'Add the generated README.md (commands, architecture, environment names, deployment and rollback).');\n const agents = join(root, 'AGENTS.md');\n if (!existsSync(agents)) add('AGENTS.md', 'project-docs', 'Add AGENTS.md with the fixed sources of truth and guardrails.');\n else if (statSync(agents).size > 3_584) add('AGENTS.md', 'project-docs', `AGENTS.md is ${statSync(agents).size} bytes; keep it to about 3 KB and archive history to the control repo.`);\n const claude = readOptional(join(root, 'CLAUDE.md'));\n if (claude === null || claude.trim() !== '@AGENTS.md') add('CLAUDE.md', 'project-docs', 'CLAUDE.md is the single line @AGENTS.md.');\n}\n\nconst directoryListings = new Map<string, ReadonlySet<string>>();\n\n/** The exact file names in a directory (cached per check run). */\nfunction directoryEntries(path: string): ReadonlySet<string> {\n let entries = directoryListings.get(path);\n if (!entries) {\n try { entries = new Set(readdirSync(path)); } catch { entries = new Set(); }\n directoryListings.set(path, entries);\n }\n return entries;\n}\n\nfunction readOptional(path: string): string | null {\n return existsSync(path) ? readFileSync(path, 'utf8') : null;\n}\n"]}
@@ -186,6 +186,11 @@ export declare const BRANDLAB_STATIC_RULES: readonly [{
186
186
  readonly surface: "analytics";
187
187
  readonly checkId: "analytics-conversion";
188
188
  readonly summary: "Exactly one BrandlabGoogleTag, rendered by the root layout.";
189
+ }, {
190
+ readonly ruleId: "brandlab-analytics-google-tag-consent";
191
+ readonly surface: "analytics";
192
+ readonly checkId: "analytics-privacy";
193
+ readonly summary: "BrandlabGoogleTag takes its ad_user_data consent default from the analytics binding: no adUserData attribute.";
189
194
  }, {
190
195
  readonly ruleId: "brandlab-analytics-contract";
191
196
  readonly surface: "analytics";
@@ -1 +1 @@
1
- {"version":3,"file":"rule-registry.d.ts","sourceRoot":"","sources":["../src/rule-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AAE5E;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,2BAA2B,CAAC;IACrC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAwDgB,CAAC;AAEnD,6FAA6F;AAC7F,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAM3F"}
1
+ {"version":3,"file":"rule-registry.d.ts","sourceRoot":"","sources":["../src/rule-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AAE5E;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,2BAA2B,CAAC;IACrC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyDgB,CAAC;AAEnD,6FAA6F;AAC7F,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAM3F"}
@@ -34,6 +34,7 @@ export const BRANDLAB_STATIC_RULES = [
34
34
  { ruleId: "brandlab-source-retired-analytics-event", surface: "analytics", checkId: "analytics-conversion", summary: "Only current event names are sent: contact_form for accepted enquiries and phone_link_click as a tap diagnostic.", },
35
35
  { ruleId: "brandlab-source-local-google-tag-bootstrap", surface: "analytics", checkId: "analytics-conversion", summary: "The Google tag bootstrap is owned by the shared runtime.", },
36
36
  { ruleId: "brandlab-analytics-google-tag-owner", surface: "analytics", checkId: "analytics-conversion", summary: "Exactly one BrandlabGoogleTag, rendered by the root layout.", },
37
+ { ruleId: "brandlab-analytics-google-tag-consent", surface: "analytics", checkId: "analytics-privacy", summary: "BrandlabGoogleTag takes its ad_user_data consent default from the analytics binding: no adUserData attribute.", },
37
38
  { ruleId: "brandlab-analytics-contract", surface: "analytics", checkId: "analytics-conversion", summary: "Exactly one module declares the analytics binding with defineBrandlabAnalytics.", },
38
39
  { ruleId: "brandlab-analytics-instrumentation", surface: "analytics", checkId: "analytics-conversion", summary: "src/instrumentation-client.ts calls installBrandlabInstrumentation, which reports one phone_link_click per tap.", },
39
40
  { ruleId: "brandlab-analytics-retired-phone-api", surface: "analytics", checkId: "analytics-conversion", summary: "No trackPhoneCall; taps are reported once as phone_link_click.", },
@@ -1 +1 @@
1
- {"version":3,"file":"rule-registry.js","sourceRoot":"","sources":["../src/rule-registry.ts"],"names":[],"mappings":"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","sourcesContent":["import type { BrandlabVerificationCheckId } from \"./verification-policy.js\";\n\n/**\n * Every static rule the evaluator can run, the check it evaluates and what it\n * proves. `<placeholder>` segments stand for the concrete package, capability,\n * key or state named in each finding. The generated rule reference is built\n * from this list, and tests keep it identical to the evaluator.\n */\nexport interface BrandlabStaticRule {\n ruleId: string;\n surface: string;\n checkId: BrandlabVerificationCheckId;\n summary: string;\n}\n\nexport const BRANDLAB_STATIC_RULES = [\n { ruleId: \"brandlab-release-package-json-missing\", surface: \"release\", checkId: \"release-consistency\", summary: \"package.json is present and readable.\", },\n { ruleId: \"brandlab-release-installed-version-unresolved\", surface: \"release\", checkId: \"release-consistency\", summary: \"All four Brandlab packages are pinned to one exact release.\", },\n { ruleId: \"brandlab-release-unsupported\", surface: \"release\", checkId: \"release-consistency\", summary: \"The installed release is the one this checker certifies.\", },\n { ruleId: \"brandlab-release-declared-installed-mismatch\", surface: \"release\", checkId: \"release-consistency\", summary: \"The declared and detected releases agree.\", },\n { ruleId: \"brandlab-release-package-lock-<state>\", surface: \"release\", checkId: \"release-consistency\", summary: \"A valid npm lockfile v2 or v3 is committed.\", },\n { ruleId: \"brandlab-release-package-pin-mismatch\", surface: \"release\", checkId: \"release-consistency\", summary: \"Each package is declared once and locked at the exact release.\", },\n { ruleId: \"brandlab-release-package-resolution-mismatch\", surface: \"release\", checkId: \"release-consistency\", summary: \"The lockfile resolves each package from the canonical npm registry with integrity.\", },\n { ruleId: \"brandlab-release-package-integrity-mismatch\", surface: \"release\", checkId: \"release-consistency\", summary: \"With --release-manifest, lockfile integrity equals the immutable release record.\", },\n { ruleId: \"brandlab-runtime-<package>\", surface: \"runtime\", checkId: \"runtime-supported\", summary: \"next, react, react-dom and typescript use versions the release permits.\", },\n { ruleId: \"brandlab-runtime-react-pair\", surface: \"runtime\", checkId: \"runtime-supported\", summary: \"react and react-dom are declared and locked at the same version.\", },\n { ruleId: \"brandlab-runtime-node\", surface: \"runtime\", checkId: \"runtime-supported\", summary: \"engines.node matches the release in package.json and the lockfile.\", },\n { ruleId: \"brandlab-runtime-package-manager\", surface: \"runtime\", checkId: \"runtime-supported\", summary: \"packageManager is the release's npm version.\", },\n { ruleId: \"brandlab-runtime-sharp\", surface: \"runtime\", checkId: \"runtime-supported\", summary: \"Sharp is pinned only by overrides.sharp with one lockfile resolution.\", },\n { ruleId: \"brandlab-runtime-image-initialisation\", surface: \"runtime\", checkId: \"runtime-supported\", summary: \"next.config imports the shared image-runtime guard first.\", },\n { ruleId: \"brandlab-runtime-next-config\", surface: \"runtime\", checkId: \"runtime-supported\", summary: \"next.config exports defineBrandlabNextConfig, which owns headers, image formats and Preview noindex.\", },\n { ruleId: \"brandlab-environment-<capability>-<key>\", surface: \"environment\", checkId: \"runtime-supported\", summary: \".env.example documents each variable an enabled capability reads, including the contract's recipient key.\", },\n { ruleId: \"brandlab-environment-retired-contact-state\", surface: \"environment\", checkId: \"runtime-supported\", summary: \".env.example lists no retired contact state variables.\", },\n { ruleId: \"brandlab-source-dangerously-set-inner-html\", surface: \"security\", checkId: \"runtime-supported\", summary: \"No project-owned dangerouslySetInnerHTML; only SchemaScript and SafeRichText inject markup.\", },\n { ruleId: \"brandlab-source-public-secret\", surface: \"security\", checkId: \"runtime-supported\", summary: \"No API key, secret or token behind a NEXT_PUBLIC_ name.\", },\n { ruleId: \"brandlab-config-missing\", surface: \"routes\", checkId: \"route-identity\", summary: \"brandlab.config.ts exists.\", },\n { ruleId: \"brandlab-config-invalid\", surface: \"routes\", checkId: \"route-identity\", summary: \"brandlab.config.ts is a literal defineBrandlabProject with projectId.\", },\n { ruleId: \"brandlab-routes-catalogue\", surface: \"routes\", checkId: \"route-identity\", summary: \"Exactly one module declares the route catalogue with defineRouteCatalog.\", },\n { ruleId: \"brandlab-routes-location-estate\", surface: \"routes\", checkId: \"route-identity\", summary: \"A project that publishes locations declares them in src/data/locations/estate.ts with defineLocationEstate.\", },\n { ruleId: \"brandlab-redirects-table\", surface: \"routes\", checkId: \"route-identity\", summary: \"Exactly one module declares the redirect table with defineRedirects.\", },\n { ruleId: \"brandlab-contact-recipient-env\", surface: \"contact\", checkId: \"contact-runtime\", summary: \"The contact contract declares delivery.recipientEnv as a literal key.\", },\n { ruleId: \"brandlab-source-local-contact-delivery\", surface: \"contact\", checkId: \"contact-runtime\", summary: \"Email delivery is left to the shared contact runtime.\", },\n { ruleId: \"brandlab-source-local-contact-email-renderer\", surface: \"contact\", checkId: \"contact-runtime\", summary: \"Contact email rendering is left to the shared contact runtime.\", },\n { ruleId: \"brandlab-source-local-contact-attachments\", surface: \"contact\", checkId: \"contact-runtime\", summary: \"Attachment preparation is left to the shared contact runtime.\", },\n { ruleId: \"brandlab-source-contact-draft-persistence\", surface: \"contact\", checkId: \"contact-runtime\", summary: \"Contact details are never persisted in browser storage.\", },\n { ruleId: \"brandlab-source-retired-contact-state\", surface: \"contact\", checkId: \"contact-runtime\", summary: \"No retired contact state service variables in source.\", },\n { ruleId: \"brandlab-contact-provider-route\", surface: \"contact\", checkId: \"contact-provider-errors\", summary: \"POST /api/contact is created by the shared handler, so provider errors are handled by the runtime.\", },\n { ruleId: \"brandlab-analytics-pii-payload\", surface: \"analytics\", checkId: \"analytics-privacy\", summary: \"No lead fields, messages or attachment details in analytics payloads, and no project-set user_data.\", },\n { ruleId: \"brandlab-source-retired-analytics-event\", surface: \"analytics\", checkId: \"analytics-conversion\", summary: \"Only current event names are sent: contact_form for accepted enquiries and phone_link_click as a tap diagnostic.\", },\n { ruleId: \"brandlab-source-local-google-tag-bootstrap\", surface: \"analytics\", checkId: \"analytics-conversion\", summary: \"The Google tag bootstrap is owned by the shared runtime.\", },\n { ruleId: \"brandlab-analytics-google-tag-owner\", surface: \"analytics\", checkId: \"analytics-conversion\", summary: \"Exactly one BrandlabGoogleTag, rendered by the root layout.\", },\n { ruleId: \"brandlab-analytics-contract\", surface: \"analytics\", checkId: \"analytics-conversion\", summary: \"Exactly one module declares the analytics binding with defineBrandlabAnalytics.\", },\n { ruleId: \"brandlab-analytics-instrumentation\", surface: \"analytics\", checkId: \"analytics-conversion\", summary: \"src/instrumentation-client.ts calls installBrandlabInstrumentation, which reports one phone_link_click per tap.\", },\n { ruleId: \"brandlab-analytics-retired-phone-api\", surface: \"analytics\", checkId: \"analytics-conversion\", summary: \"No trackPhoneCall; taps are reported once as phone_link_click.\", },\n { ruleId: \"brandlab-analytics-web-vitals\", surface: \"analytics\", checkId: \"analytics-conversion\", summary: \"No web-vitals reporter, web_vital event or webVitals flag.\", },\n { ruleId: \"brandlab-robots-package-route\", surface: \"robots\", checkId: \"search-routing\", summary: \"robots is a thin binding of @brandlab-digital/site-next/robots with no static public/robots.txt.\", },\n { ruleId: \"brandlab-sitemap-package-route\", surface: \"sitemap\", checkId: \"search-routing\", summary: \"The sitemap route uses the shared sitemap API over the route catalogue, with no static public/sitemap.xml.\", },\n { ruleId: \"brandlab-sitemap-split-mode\", surface: \"sitemap\", checkId: \"search-routing\", summary: \"/sitemaps/[chunk] exists exactly when brandlab.config sets sitemap.mode: 'split'.\", },\n { ruleId: \"brandlab-metadata-route-builder\", surface: \"metadata\", checkId: \"search-routing\", summary: \"Page metadata comes from createRouteMetadataBuilder(site, routes).\", },\n { ruleId: \"brandlab-site-identity\", surface: \"metadata\", checkId: \"search-routing\", summary: \"Exactly one module declares the site identity (canonical URL, locale, titles) with defineBrandlabSite.\", },\n { ruleId: \"brandlab-source-raw-json-ld\", surface: \"schema\", checkId: \"structured-data\", summary: \"JSON-LD is rendered only by the shared schema component.\", },\n { ruleId: \"brandlab-source-self-serving-rating-schema\", surface: \"schema\", checkId: \"structured-data\", summary: \"No self-serving AggregateRating schema.\", },\n { ruleId: \"brandlab-source-synthetic-offer-schema\", surface: \"schema\", checkId: \"structured-data\", summary: \"No invented Offer markup.\", },\n { ruleId: \"brandlab-source-local-google-reviews-fetch\", surface: \"reviews\", checkId: \"structured-data\", summary: \"Google Places reviews are fetched only by the shared review runtime.\", },\n { ruleId: \"brandlab-business-facts\", surface: \"business\", checkId: \"business-identity\", summary: \"Exactly one module declares the business facts with defineBrandlabBusiness.\", },\n { ruleId: \"brandlab-content-implementation-wording\", surface: \"content\", checkId: \"public-output-safety\", summary: \"Everything that renders publicly (pages, components, metadata, schema, alt text, MDX, Markdown and JSON content) carries finished copy, not template, helper, scaffold or placeholder wording.\", },\n { ruleId: \"brandlab-source-root-missing\", surface: \"source\", checkId: \"source-safety\", summary: \"Project source sits under a recognised root so the source rules can run.\", },\n { ruleId: \"brandlab-source-platform-reimplementation\", surface: \"source\", checkId: \"source-safety\", summary: \"Protected platform surfaces (SchemaScript, SafeRichText, contact, sitemap, analytics APIs) are imported, not redeclared.\", },\n { ruleId: \"brandlab-source-retired-api\", surface: \"source\", checkId: \"source-safety\", summary: \"No API, option or configuration key removed in 3.0 (TrackedTelephoneLink, shouldIndexSite, buildRobotsMetadata, buildSeoMetadata and the duplicate metadata builders, isBrandlabProductionDeployment, resolveBrowserAnalyticsConfig, resolveBrandlabGoogleTagConfig, the contact submission controller and its lead-tracking helpers (use useBrandlabContactForm), header profiles and isProduction, xRobotsTag, contentSecurityPolicyMode, leadDiagnostics, ALLOW_INDEXING, NEXT_PUBLIC_SITE_URL, profile, routes.aliases).\", },\n { ruleId: \"brandlab-ci-workflow-pinned\", surface: \"project-verification\", checkId: \"project-build\", summary: \"Every reused workflow and action is pinned to a 40-character commit SHA.\", },\n { ruleId: \"brandlab-deployment-vercelignore-lockfile\", surface: \"deployment\", checkId: \"deployment-binding\", summary: \".vercelignore never excludes package.json or package-lock.json.\", },\n] as const satisfies readonly BrandlabStaticRule[];\n\n/** Whether a concrete rule ID (from a finding or evaluation) belongs to a registry entry. */\nexport function matchesBrandlabStaticRule(rule: BrandlabStaticRule, ruleId: string): boolean {\n if (rule.ruleId === ruleId) return true;\n if (!rule.ruleId.includes(\"<\")) return false;\n const stem = rule.ruleId.slice(0, rule.ruleId.indexOf(\"-<\"));\n const pattern = new RegExp(`^${rule.ruleId.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\").replace(/<[a-z]+>/g, \"[a-z0-9-]+\")}$`);\n return ruleId === stem || pattern.test(ruleId);\n}\n"]}
1
+ {"version":3,"file":"rule-registry.js","sourceRoot":"","sources":["../src/rule-registry.ts"],"names":[],"mappings":"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","sourcesContent":["import type { BrandlabVerificationCheckId } from \"./verification-policy.js\";\n\n/**\n * Every static rule the evaluator can run, the check it evaluates and what it\n * proves. `<placeholder>` segments stand for the concrete package, capability,\n * key or state named in each finding. The generated rule reference is built\n * from this list, and tests keep it identical to the evaluator.\n */\nexport interface BrandlabStaticRule {\n ruleId: string;\n surface: string;\n checkId: BrandlabVerificationCheckId;\n summary: string;\n}\n\nexport const BRANDLAB_STATIC_RULES = [\n { ruleId: \"brandlab-release-package-json-missing\", surface: \"release\", checkId: \"release-consistency\", summary: \"package.json is present and readable.\", },\n { ruleId: \"brandlab-release-installed-version-unresolved\", surface: \"release\", checkId: \"release-consistency\", summary: \"All four Brandlab packages are pinned to one exact release.\", },\n { ruleId: \"brandlab-release-unsupported\", surface: \"release\", checkId: \"release-consistency\", summary: \"The installed release is the one this checker certifies.\", },\n { ruleId: \"brandlab-release-declared-installed-mismatch\", surface: \"release\", checkId: \"release-consistency\", summary: \"The declared and detected releases agree.\", },\n { ruleId: \"brandlab-release-package-lock-<state>\", surface: \"release\", checkId: \"release-consistency\", summary: \"A valid npm lockfile v2 or v3 is committed.\", },\n { ruleId: \"brandlab-release-package-pin-mismatch\", surface: \"release\", checkId: \"release-consistency\", summary: \"Each package is declared once and locked at the exact release.\", },\n { ruleId: \"brandlab-release-package-resolution-mismatch\", surface: \"release\", checkId: \"release-consistency\", summary: \"The lockfile resolves each package from the canonical npm registry with integrity.\", },\n { ruleId: \"brandlab-release-package-integrity-mismatch\", surface: \"release\", checkId: \"release-consistency\", summary: \"With --release-manifest, lockfile integrity equals the immutable release record.\", },\n { ruleId: \"brandlab-runtime-<package>\", surface: \"runtime\", checkId: \"runtime-supported\", summary: \"next, react, react-dom and typescript use versions the release permits.\", },\n { ruleId: \"brandlab-runtime-react-pair\", surface: \"runtime\", checkId: \"runtime-supported\", summary: \"react and react-dom are declared and locked at the same version.\", },\n { ruleId: \"brandlab-runtime-node\", surface: \"runtime\", checkId: \"runtime-supported\", summary: \"engines.node matches the release in package.json and the lockfile.\", },\n { ruleId: \"brandlab-runtime-package-manager\", surface: \"runtime\", checkId: \"runtime-supported\", summary: \"packageManager is the release's npm version.\", },\n { ruleId: \"brandlab-runtime-sharp\", surface: \"runtime\", checkId: \"runtime-supported\", summary: \"Sharp is pinned only by overrides.sharp with one lockfile resolution.\", },\n { ruleId: \"brandlab-runtime-image-initialisation\", surface: \"runtime\", checkId: \"runtime-supported\", summary: \"next.config imports the shared image-runtime guard first.\", },\n { ruleId: \"brandlab-runtime-next-config\", surface: \"runtime\", checkId: \"runtime-supported\", summary: \"next.config exports defineBrandlabNextConfig, which owns headers, image formats and Preview noindex.\", },\n { ruleId: \"brandlab-environment-<capability>-<key>\", surface: \"environment\", checkId: \"runtime-supported\", summary: \".env.example documents each variable an enabled capability reads, including the contract's recipient key.\", },\n { ruleId: \"brandlab-environment-retired-contact-state\", surface: \"environment\", checkId: \"runtime-supported\", summary: \".env.example lists no retired contact state variables.\", },\n { ruleId: \"brandlab-source-dangerously-set-inner-html\", surface: \"security\", checkId: \"runtime-supported\", summary: \"No project-owned dangerouslySetInnerHTML; only SchemaScript and SafeRichText inject markup.\", },\n { ruleId: \"brandlab-source-public-secret\", surface: \"security\", checkId: \"runtime-supported\", summary: \"No API key, secret or token behind a NEXT_PUBLIC_ name.\", },\n { ruleId: \"brandlab-config-missing\", surface: \"routes\", checkId: \"route-identity\", summary: \"brandlab.config.ts exists.\", },\n { ruleId: \"brandlab-config-invalid\", surface: \"routes\", checkId: \"route-identity\", summary: \"brandlab.config.ts is a literal defineBrandlabProject with projectId.\", },\n { ruleId: \"brandlab-routes-catalogue\", surface: \"routes\", checkId: \"route-identity\", summary: \"Exactly one module declares the route catalogue with defineRouteCatalog.\", },\n { ruleId: \"brandlab-routes-location-estate\", surface: \"routes\", checkId: \"route-identity\", summary: \"A project that publishes locations declares them in src/data/locations/estate.ts with defineLocationEstate.\", },\n { ruleId: \"brandlab-redirects-table\", surface: \"routes\", checkId: \"route-identity\", summary: \"Exactly one module declares the redirect table with defineRedirects.\", },\n { ruleId: \"brandlab-contact-recipient-env\", surface: \"contact\", checkId: \"contact-runtime\", summary: \"The contact contract declares delivery.recipientEnv as a literal key.\", },\n { ruleId: \"brandlab-source-local-contact-delivery\", surface: \"contact\", checkId: \"contact-runtime\", summary: \"Email delivery is left to the shared contact runtime.\", },\n { ruleId: \"brandlab-source-local-contact-email-renderer\", surface: \"contact\", checkId: \"contact-runtime\", summary: \"Contact email rendering is left to the shared contact runtime.\", },\n { ruleId: \"brandlab-source-local-contact-attachments\", surface: \"contact\", checkId: \"contact-runtime\", summary: \"Attachment preparation is left to the shared contact runtime.\", },\n { ruleId: \"brandlab-source-contact-draft-persistence\", surface: \"contact\", checkId: \"contact-runtime\", summary: \"Contact details are never persisted in browser storage.\", },\n { ruleId: \"brandlab-source-retired-contact-state\", surface: \"contact\", checkId: \"contact-runtime\", summary: \"No retired contact state service variables in source.\", },\n { ruleId: \"brandlab-contact-provider-route\", surface: \"contact\", checkId: \"contact-provider-errors\", summary: \"POST /api/contact is created by the shared handler, so provider errors are handled by the runtime.\", },\n { ruleId: \"brandlab-analytics-pii-payload\", surface: \"analytics\", checkId: \"analytics-privacy\", summary: \"No lead fields, messages or attachment details in analytics payloads, and no project-set user_data.\", },\n { ruleId: \"brandlab-source-retired-analytics-event\", surface: \"analytics\", checkId: \"analytics-conversion\", summary: \"Only current event names are sent: contact_form for accepted enquiries and phone_link_click as a tap diagnostic.\", },\n { ruleId: \"brandlab-source-local-google-tag-bootstrap\", surface: \"analytics\", checkId: \"analytics-conversion\", summary: \"The Google tag bootstrap is owned by the shared runtime.\", },\n { ruleId: \"brandlab-analytics-google-tag-owner\", surface: \"analytics\", checkId: \"analytics-conversion\", summary: \"Exactly one BrandlabGoogleTag, rendered by the root layout.\", },\n { ruleId: \"brandlab-analytics-google-tag-consent\", surface: \"analytics\", checkId: \"analytics-privacy\", summary: \"BrandlabGoogleTag takes its ad_user_data consent default from the analytics binding: no adUserData attribute.\", },\n { ruleId: \"brandlab-analytics-contract\", surface: \"analytics\", checkId: \"analytics-conversion\", summary: \"Exactly one module declares the analytics binding with defineBrandlabAnalytics.\", },\n { ruleId: \"brandlab-analytics-instrumentation\", surface: \"analytics\", checkId: \"analytics-conversion\", summary: \"src/instrumentation-client.ts calls installBrandlabInstrumentation, which reports one phone_link_click per tap.\", },\n { ruleId: \"brandlab-analytics-retired-phone-api\", surface: \"analytics\", checkId: \"analytics-conversion\", summary: \"No trackPhoneCall; taps are reported once as phone_link_click.\", },\n { ruleId: \"brandlab-analytics-web-vitals\", surface: \"analytics\", checkId: \"analytics-conversion\", summary: \"No web-vitals reporter, web_vital event or webVitals flag.\", },\n { ruleId: \"brandlab-robots-package-route\", surface: \"robots\", checkId: \"search-routing\", summary: \"robots is a thin binding of @brandlab-digital/site-next/robots with no static public/robots.txt.\", },\n { ruleId: \"brandlab-sitemap-package-route\", surface: \"sitemap\", checkId: \"search-routing\", summary: \"The sitemap route uses the shared sitemap API over the route catalogue, with no static public/sitemap.xml.\", },\n { ruleId: \"brandlab-sitemap-split-mode\", surface: \"sitemap\", checkId: \"search-routing\", summary: \"/sitemaps/[chunk] exists exactly when brandlab.config sets sitemap.mode: 'split'.\", },\n { ruleId: \"brandlab-metadata-route-builder\", surface: \"metadata\", checkId: \"search-routing\", summary: \"Page metadata comes from createRouteMetadataBuilder(site, routes).\", },\n { ruleId: \"brandlab-site-identity\", surface: \"metadata\", checkId: \"search-routing\", summary: \"Exactly one module declares the site identity (canonical URL, locale, titles) with defineBrandlabSite.\", },\n { ruleId: \"brandlab-source-raw-json-ld\", surface: \"schema\", checkId: \"structured-data\", summary: \"JSON-LD is rendered only by the shared schema component.\", },\n { ruleId: \"brandlab-source-self-serving-rating-schema\", surface: \"schema\", checkId: \"structured-data\", summary: \"No self-serving AggregateRating schema.\", },\n { ruleId: \"brandlab-source-synthetic-offer-schema\", surface: \"schema\", checkId: \"structured-data\", summary: \"No invented Offer markup.\", },\n { ruleId: \"brandlab-source-local-google-reviews-fetch\", surface: \"reviews\", checkId: \"structured-data\", summary: \"Google Places reviews are fetched only by the shared review runtime.\", },\n { ruleId: \"brandlab-business-facts\", surface: \"business\", checkId: \"business-identity\", summary: \"Exactly one module declares the business facts with defineBrandlabBusiness.\", },\n { ruleId: \"brandlab-content-implementation-wording\", surface: \"content\", checkId: \"public-output-safety\", summary: \"Everything that renders publicly (pages, components, metadata, schema, alt text, MDX, Markdown and JSON content) carries finished copy, not template, helper, scaffold or placeholder wording.\", },\n { ruleId: \"brandlab-source-root-missing\", surface: \"source\", checkId: \"source-safety\", summary: \"Project source sits under a recognised root so the source rules can run.\", },\n { ruleId: \"brandlab-source-platform-reimplementation\", surface: \"source\", checkId: \"source-safety\", summary: \"Protected platform surfaces (SchemaScript, SafeRichText, contact, sitemap, analytics APIs) are imported, not redeclared.\", },\n { ruleId: \"brandlab-source-retired-api\", surface: \"source\", checkId: \"source-safety\", summary: \"No API, option or configuration key removed in 3.0 (TrackedTelephoneLink, shouldIndexSite, buildRobotsMetadata, buildSeoMetadata and the duplicate metadata builders, isBrandlabProductionDeployment, resolveBrowserAnalyticsConfig, resolveBrandlabGoogleTagConfig, the contact submission controller and its lead-tracking helpers (use useBrandlabContactForm), header profiles and isProduction, xRobotsTag, contentSecurityPolicyMode, leadDiagnostics, ALLOW_INDEXING, NEXT_PUBLIC_SITE_URL, profile, routes.aliases).\", },\n { ruleId: \"brandlab-ci-workflow-pinned\", surface: \"project-verification\", checkId: \"project-build\", summary: \"Every reused workflow and action is pinned to a 40-character commit SHA.\", },\n { ruleId: \"brandlab-deployment-vercelignore-lockfile\", surface: \"deployment\", checkId: \"deployment-binding\", summary: \".vercelignore never excludes package.json or package-lock.json.\", },\n] as const satisfies readonly BrandlabStaticRule[];\n\n/** Whether a concrete rule ID (from a finding or evaluation) belongs to a registry entry. */\nexport function matchesBrandlabStaticRule(rule: BrandlabStaticRule, ruleId: string): boolean {\n if (rule.ruleId === ruleId) return true;\n if (!rule.ruleId.includes(\"<\")) return false;\n const stem = rule.ruleId.slice(0, rule.ruleId.indexOf(\"-<\"));\n const pattern = new RegExp(`^${rule.ruleId.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\").replace(/<[a-z]+>/g, \"[a-z0-9-]+\")}$`);\n return ruleId === stem || pattern.test(ruleId);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"static-rules.d.ts","sourceRoot":"","sources":["../src/static-rules.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AASpD,OAAO,EAcL,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EAEzB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAOvE,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,mBAAmB,CAAC;IAC5B,2DAA2D;IAC3D,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,WAAW,EAAE,sBAAsB,EAAE,CAAC;CACvC;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,eAAe,CAAC,UAAU,CAAC,CAAC;CACxC,GAAG,eAAe,CAalB;AAED,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,sBAAsB,EAAE,EACrC,OAAO,EAAE,MAAM,EACf,GAAG,OAAO,EAAE,MAAM,EAAE,QAGrB;AAED,0FAA0F;AAC1F,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,iBAAiB,QAe5D;AAED,MAAM,WAAW,2BAA2B;IAC1C,cAAc,EAAE,OAAO,CAAC;IACxB,cAAc,EAAE,OAAO,CAAC;IACxB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,WAAW,EAAE,QAAQ,GAAG,OAAO,GAAG,IAAI,CAAC;CACxC;AAED,4FAA4F;AAC5F,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,2BAA2B,CAgBrG;AAmqBD,iFAAiF;AACjF,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAajE;AAID,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,yFAAyF;IACzF,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,sFAAsF;AACtF,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,mBAAmB,GAC1B,wBAAwB,EAAE,CAU5B;AA0BD,0EAA0E;AAC1E,wBAAgB,aAAa,CAAC,IAAI,EAAE,kBAAkB,GAAG,GAAG,CAAC,MAAM,CAAC,CAgBnE"}
1
+ {"version":3,"file":"static-rules.d.ts","sourceRoot":"","sources":["../src/static-rules.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AASpD,OAAO,EAcL,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EAEzB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAOvE,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,mBAAmB,CAAC;IAC5B,2DAA2D;IAC3D,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,WAAW,EAAE,sBAAsB,EAAE,CAAC;CACvC;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,eAAe,CAAC,UAAU,CAAC,CAAC;CACxC,GAAG,eAAe,CAalB;AAED,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,sBAAsB,EAAE,EACrC,OAAO,EAAE,MAAM,EACf,GAAG,OAAO,EAAE,MAAM,EAAE,QAGrB;AAED,0FAA0F;AAC1F,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,iBAAiB,QAgB5D;AAED,MAAM,WAAW,2BAA2B;IAC1C,cAAc,EAAE,OAAO,CAAC;IACxB,cAAc,EAAE,OAAO,CAAC;IACxB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,WAAW,EAAE,QAAQ,GAAG,OAAO,GAAG,IAAI,CAAC;CACxC;AAED,4FAA4F;AAC5F,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,2BAA2B,CAgBrG;AAssBD,iFAAiF;AACjF,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAajE;AAID,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,yFAAyF;IACzF,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,sFAAsF;AACtF,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,mBAAmB,GAC1B,wBAAwB,EAAE,CAU5B;AA0BD,0EAA0E;AAC1E,wBAAgB,aAAa,CAAC,IAAI,EAAE,kBAAkB,GAAG,GAAG,CAAC,MAAM,CAAC,CAgBnE"}
@@ -32,6 +32,7 @@ export function inspectStaticRules(context) {
32
32
  inspectContactProviderRoute(context, project);
33
33
  inspectAnalyticsPrivacy(context);
34
34
  inspectGoogleTagOwner(context);
35
+ inspectGoogleTagConsent(context);
35
36
  inspectSearchRouting(context, project);
36
37
  inspectBusinessFacts(context);
37
38
  inspectSharedBindings(context);
@@ -234,6 +235,39 @@ function inspectGoogleTagOwner(context) {
234
235
  remediation,
235
236
  }));
236
237
  }
238
+ // --- analytics-privacy: the Google tag's consent default follows the contract --
239
+ function inspectGoogleTagConsent(context) {
240
+ if (context.source.files.length === 0)
241
+ return;
242
+ const ruleId = "brandlab-analytics-google-tag-consent";
243
+ recordEvaluation(context.evaluations, "analytics", ruleId);
244
+ for (const file of context.source.files) {
245
+ const locals = new Set(importedLocalNames(file, SITE_NEXT_ANY, "BrandlabGoogleTag"));
246
+ if (locals.size === 0)
247
+ continue;
248
+ const visit = (node) => {
249
+ if ((ts.isJsxSelfClosingElement(node) || ts.isJsxOpeningElement(node)) &&
250
+ ts.isIdentifier(node.tagName) &&
251
+ locals.has(node.tagName.text)) {
252
+ for (const attribute of node.attributes.properties) {
253
+ if (!ts.isJsxAttribute(attribute) || !ts.isIdentifier(attribute.name) || attribute.name.text !== "adUserData")
254
+ continue;
255
+ context.findings.push(staticFinding({
256
+ ruleId,
257
+ surface: "analytics",
258
+ path: file.path,
259
+ line: lineOfNode(file, attribute),
260
+ expected: "BrandlabGoogleTag takes its ad_user_data consent default from the analytics binding ({...analytics.googleTag})",
261
+ actual: "BrandlabGoogleTag sets adUserData itself, so the Google tag's ad_user_data default no longer follows the analytics contract.",
262
+ remediation: "Remove the adUserData attribute. Only googleAds.enhancedConversions: { mode: 'disclosed' } in the analytics contract grants it by default, once the privacy policy discloses it.",
263
+ }));
264
+ }
265
+ }
266
+ ts.forEachChild(node, visit);
267
+ };
268
+ visit(parseBrandlabSourceFile(file));
269
+ }
270
+ }
237
271
  // --- search-routing ----------------------------------------------------------
238
272
  function inspectSearchRouting(context, project) {
239
273
  if (context.source.directoryRoots.length === 0)
@@ -1 +1 @@
1
- {"version":3,"file":"static-rules.js","sourceRoot":"","sources":["../src/static-rules.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync, readdirSync } from \"node:fs\";\nimport { join, posix } from \"node:path\";\nimport ts from \"typescript\";\nimport { globMatch } from \"./glob.js\";\nimport type { BrandlabFinding } from \"./project.js\";\nimport {\n findWordingInMarkdown,\n findWordingInSource,\n isPublicDocumentPath,\n isPublicModulePath,\n parseJsonSource,\n type PublicCopyFinding,\n} from \"./public-copy.js\";\nimport {\n BRANDLAB_SOURCE_ROOT_DIRECTORIES,\n createBrandlabModuleResolver,\n findImportedCalls,\n importedLocalNames,\n isDirectory,\n lineAt,\n stripCommentsPreservingLayout,\n lineOfNode,\n listModuleReferences,\n objectPropertyValue,\n parseBrandlabSourceFile,\n stringLiteralValue,\n type BrandlabModuleResolver,\n type BrandlabSourceFile,\n type BrandlabSourceIndex,\n walkProjectFiles,\n} from \"./source-files.js\";\nimport type { BrandlabRuleEvaluation } from \"./verification-policy.js\";\n\nconst SITE_CORE = (module: string) => new RegExp(`^@brandlab-digital/site-core/${module}$`);\nconst SITE_NEXT = (module: string) => new RegExp(`^@brandlab-digital/site-next/${module}$`);\nconst SITE_NEXT_ANY = /^@brandlab-digital\\/site-next(?:\\/|$)/;\nconst SOURCE_EXTENSIONS = [\"ts\", \"tsx\", \"js\", \"jsx\", \"mjs\"];\n\nexport interface StaticRuleContext {\n root: string;\n source: BrandlabSourceIndex;\n /** brandlab.config.ts text, or null when it is missing. */\n config: string | null;\n findings: BrandlabFinding[];\n evaluations: BrandlabRuleEvaluation[];\n}\n\nexport function staticFinding(options: {\n ruleId: string;\n surface: string;\n expected: string;\n actual: string;\n remediation: string;\n path?: string;\n line?: number;\n severity?: BrandlabFinding[\"severity\"];\n}): BrandlabFinding {\n return {\n ruleId: options.ruleId,\n surface: options.surface,\n severity: options.severity ?? \"blocker\",\n contract: { name: \"project\", version: \"current-only-v2\" },\n evidenceKind: \"static\",\n ...(options.path ? { path: options.path } : {}),\n ...(options.line ? { line: options.line } : {}),\n expected: options.expected,\n actual: options.actual,\n remediation: options.remediation,\n };\n}\n\nexport function recordEvaluation(\n evaluations: BrandlabRuleEvaluation[],\n surface: string,\n ...ruleIds: string[]\n) {\n for (const ruleId of ruleIds) evaluations.push({ ruleId, surface });\n}\n\n/** The minimal static rules behind the checks that previously passed without evidence. */\nexport function inspectStaticRules(context: StaticRuleContext) {\n const project = describeProject(context);\n inspectContactProviderRoute(context, project);\n inspectAnalyticsPrivacy(context);\n inspectGoogleTagOwner(context);\n inspectSearchRouting(context, project);\n inspectBusinessFacts(context);\n inspectSharedBindings(context);\n inspectRouteCatalogue(context, project);\n inspectLocationEstate(context, project);\n inspectImplementationWording(context);\n inspectPlatformReimplementation(context);\n inspectRetiredConfiguration(context);\n inspectWorkflowPins(context);\n inspectVercelIgnore(context);\n}\n\nexport interface BrandlabProjectCapabilities {\n contactEnabled: boolean;\n reviewsEnabled: boolean;\n locationsDeclared: boolean;\n sitemapMode: \"single\" | \"split\" | null;\n}\n\n/** Capabilities declared by brandlab.config.ts, the contact route and the location data. */\nexport function describeCapabilities(root: string, config: string | null): BrandlabProjectCapabilities {\n const text = config ?? \"\";\n const families = text.match(/\\bfamilies\\s*:\\s*\\[([^\\]]*)\\]/)?.[1] ?? \"\";\n const strategy = text.match(/\\blocations\\s*:\\s*\\{[^{}]*\\bstrategy\\s*:\\s*['\"]([a-z-]+)['\"]/)?.[1];\n return {\n contactEnabled:\n /\\bcontact\\s*:\\s*\\{/.test(text) ||\n routeCandidates(\"api/contact/route\").some((path) => existsSync(join(root, path))),\n reviewsEnabled: /\\breviews\\s*:\\s*\\{/.test(text),\n locationsDeclared:\n /['\"](?:locations|service-locations)['\"]/.test(families) ||\n (strategy !== undefined && strategy !== \"none\") ||\n isDirectory(join(root, \"src/data/locations\")),\n sitemapMode: (text.match(/\\bsitemap\\s*:\\s*\\{[^{}]*\\bmode\\s*:\\s*['\"](single|split)['\"]/)?.[1] ??\n null) as BrandlabProjectCapabilities[\"sitemapMode\"],\n };\n}\n\ninterface ProjectShape extends BrandlabProjectCapabilities {\n resolver: BrandlabModuleResolver;\n catalogueFiles: string[];\n}\n\nfunction describeProject(context: StaticRuleContext): ProjectShape {\n const capabilities = describeCapabilities(context.root, context.config);\n return {\n ...capabilities,\n contactEnabled: capabilities.contactEnabled || findContactContractRecipients(context.source).length > 0,\n resolver: createBrandlabModuleResolver(context.root, new Set(context.source.byPath.keys())),\n catalogueFiles: context.source.files\n .filter((file) => findImportedCalls(file, SITE_CORE(\"routes\"), \"defineRouteCatalog\").length > 0)\n .map((file) => file.path),\n };\n}\n\n// --- contact-provider-errors -------------------------------------------------\n\nfunction inspectContactProviderRoute(context: StaticRuleContext, project: ProjectShape) {\n if (!project.contactEnabled) return;\n const ruleId = \"brandlab-contact-provider-route\";\n recordEvaluation(context.evaluations, \"contact\", ruleId);\n const expected =\n \"POST /api/contact produced by the shared handler (createBrandlabContactRouteHandler, or createBrandlabContactRuntime during transition)\";\n const remediation =\n \"Export POST = createBrandlabContactRouteHandler({ contract, runtime }) from @brandlab-digital/site-next/contact/server.\";\n const route = firstExisting(context, routeCandidates(\"api/contact/route\"));\n if (!route) {\n context.findings.push(staticFinding({\n ruleId, surface: \"contact\", path: \"src/app/api/contact/route.ts\", expected, remediation,\n actual: \"The contact capability is enabled but src/app/api/contact/route.ts is missing.\",\n }));\n return;\n }\n const file = context.source.byPath.get(route);\n if (!file || !exportedNames(file).has(\"POST\")) {\n context.findings.push(staticFinding({\n ruleId, surface: \"contact\", path: route, expected, remediation,\n actual: \"The contact route does not export a POST handler.\",\n }));\n return;\n }\n const contactServer = SITE_NEXT(\"contact/server\");\n const direct = findImportedCalls(file, contactServer, \"createBrandlabContactRouteHandler\").length > 0;\n const runtimeModules = [file, ...localImports(context, project.resolver, file)];\n const transitional =\n /\\.contactRouteHandler\\b/.test(file.executable) &&\n runtimeModules.some((candidate) =>\n findImportedCalls(candidate, contactServer, \"createBrandlabContactRuntime\").length > 0);\n if (!direct && !transitional) {\n context.findings.push(staticFinding({\n ruleId, surface: \"contact\", path: route, expected, remediation,\n actual: \"The POST handler is not created by the shared contact runtime, so provider errors are project-owned.\",\n }));\n }\n}\n\n// --- analytics-privacy -------------------------------------------------------\n\nconst ANALYTICS_SINKS = new Set([\n \"gtag\", \"window.gtag\", \"globalThis.gtag\",\n \"dataLayer.push\", \"window.dataLayer.push\", \"globalThis.dataLayer.push\",\n \"sendGAEvent\", \"sendGTMEvent\", \"trackBrandlabBrowserEvent\", \"trackBrandlabEvent\", \"ReactGA.event\",\n]);\n\nconst PII_TOKENS = new Set([\n \"attachment\", \"attachment_name\", \"contact_email\", \"contact_name\", \"customer_name\", \"email\",\n \"email_address\", \"enquiry_message\", \"file_name\", \"filename\", \"first_name\", \"form_message\",\n \"full_name\", \"last_name\", \"message\", \"mobile\", \"mobile_number\", \"phone\", \"phone_number\",\n \"residential_address\", \"street_address\", \"user_email\", \"user_phone\",\n]);\n\nfunction inspectAnalyticsPrivacy(context: StaticRuleContext) {\n if (context.source.files.length === 0) return;\n const ruleId = \"brandlab-analytics-pii-payload\";\n recordEvaluation(context.evaluations, \"analytics\", ruleId);\n for (const file of context.source.files) {\n const visit = (node: ts.Node) => {\n if (ts.isCallExpression(node) && ANALYTICS_SINKS.has(memberPath(node.expression) ?? \"\")) {\n const userData = stringLiteralValue(node.arguments[0]) === \"set\" &&\n stringLiteralValue(node.arguments[1]) === \"user_data\" &&\n node.arguments[2] && !(ts.isObjectLiteralExpression(node.arguments[2]) && node.arguments[2].properties.length === 0);\n const piiNode = userData ? node.arguments[2] : node.arguments.map(findPiiNode).find(Boolean);\n if (piiNode) {\n context.findings.push(staticFinding({\n ruleId,\n surface: \"analytics\",\n path: file.path,\n line: lineOfNode(file, piiNode),\n expected: \"Analytics payloads carry only the shared allowlisted, non-identifying parameters\",\n actual: userData\n ? \"Project code sets Google user_data; enhanced conversion data is owned by the shared runtime.\"\n : \"A lead contact field, message or attachment detail reaches an analytics payload.\",\n remediation: \"Send events through the shared Brandlab analytics runtime without lead details.\",\n }));\n }\n }\n ts.forEachChild(node, visit);\n };\n visit(parseBrandlabSourceFile(file));\n }\n}\n\nfunction findPiiNode(node: ts.Node | undefined): ts.Node | undefined {\n if (!node) return undefined;\n if (ts.isObjectLiteralExpression(node)) {\n for (const property of node.properties) {\n if (ts.isShorthandPropertyAssignment(property) && isPiiToken(property.name.text)) return property;\n if (ts.isSpreadAssignment(property) && isPiiReference(property.expression)) return property;\n if (!ts.isPropertyAssignment(property)) continue;\n const key = ts.isIdentifier(property.name) || ts.isStringLiteralLike(property.name) ? property.name.text : null;\n if ((key && isPiiToken(key)) || isPiiReference(property.initializer)) return property;\n const nested = findPiiNode(property.initializer);\n if (nested) return nested;\n }\n return undefined;\n }\n if (ts.isArrayLiteralExpression(node)) return node.elements.map(findPiiNode).find(Boolean);\n return isPiiReference(node) ? node : undefined;\n}\n\nfunction isPiiReference(node: ts.Node): boolean {\n if (ts.isIdentifier(node)) return isPiiToken(node.text);\n if (ts.isPropertyAccessExpression(node)) return isPiiToken(node.name.text);\n if (ts.isTemplateExpression(node)) return node.templateSpans.some((span) => isPiiReference(span.expression));\n return false;\n}\n\nfunction isPiiToken(value: string): boolean {\n return PII_TOKENS.has(value.replace(/([a-z0-9])([A-Z])/g, \"$1_$2\").toLowerCase().replace(/[^a-z0-9]+/g, \"_\"));\n}\n\nfunction memberPath(node: ts.Expression): string | null {\n if (ts.isIdentifier(node)) return node.text;\n if (ts.isPropertyAccessExpression(node)) {\n const object = memberPath(node.expression);\n return object ? `${object}.${node.name.text}` : null;\n }\n return null;\n}\n\n// --- analytics-conversion: one Google tag owner ------------------------------\n\nfunction inspectGoogleTagOwner(context: StaticRuleContext) {\n if (context.source.files.length === 0) return;\n const ruleId = \"brandlab-analytics-google-tag-owner\";\n recordEvaluation(context.evaluations, \"analytics\", ruleId);\n const usages = context.source.files.flatMap((file) => {\n const locals = new Set(importedLocalNames(file, SITE_NEXT_ANY, \"BrandlabGoogleTag\"));\n if (locals.size === 0) return [];\n const found: { path: string; line: number }[] = [];\n const visit = (node: ts.Node) => {\n if (\n (ts.isJsxSelfClosingElement(node) || ts.isJsxOpeningElement(node)) &&\n ts.isIdentifier(node.tagName) &&\n locals.has(node.tagName.text)\n ) {\n found.push({ path: file.path, line: lineOfNode(file, node) });\n }\n ts.forEachChild(node, visit);\n };\n visit(parseBrandlabSourceFile(file));\n return found;\n });\n const rootLayouts = new Set(routeCandidates(\"layout\").filter((path) => context.source.byPath.has(path)));\n const expected = \"Exactly one <BrandlabGoogleTag /> rendered from the root layout (src/app/layout.tsx)\";\n const remediation = \"Render BrandlabGoogleTag once, directly in src/app/layout.tsx, and remove wrappers or duplicates.\";\n if (usages.length === 1 && rootLayouts.has(usages[0]!.path)) return;\n context.findings.push(staticFinding({\n ruleId,\n surface: \"analytics\",\n ...(usages[0] ? { path: usages[0].path, line: usages[0].line } : { path: \"src/app/layout.tsx\" }),\n expected,\n actual: usages.length === 0\n ? \"No BrandlabGoogleTag is rendered, so the shared tag and its events are absent.\"\n : usages.length > 1\n ? `BrandlabGoogleTag is rendered ${usages.length} times (${usages.map(({ path, line }) => `${path}:${line}`).join(\", \")}).`\n : \"BrandlabGoogleTag is rendered outside the root layout.\",\n remediation,\n }));\n}\n\n// --- search-routing ----------------------------------------------------------\n\nfunction inspectSearchRouting(context: StaticRuleContext, project: ProjectShape) {\n if (context.source.directoryRoots.length === 0) return;\n inspectPackageRoute(context, project, {\n ruleId: \"brandlab-robots-package-route\",\n surface: \"robots\",\n candidates: routeCandidates(\"robots\"),\n staticFile: \"public/robots.txt\",\n modules: [SITE_NEXT(\"robots\")],\n packageLabel: \"@brandlab-digital/site-next/robots\",\n needsCatalogue: false,\n });\n inspectPackageRoute(context, project, {\n ruleId: \"brandlab-sitemap-package-route\",\n surface: \"sitemap\",\n candidates: [...routeCandidates(\"sitemap.xml/route\"), ...routeCandidates(\"sitemap\")],\n staticFile: \"public/sitemap.xml\",\n modules: [SITE_NEXT(\"sitemaps\"), SITE_CORE(\"sitemaps\")],\n packageLabel: \"@brandlab-digital/site-next/sitemaps\",\n needsCatalogue: true,\n });\n inspectSitemapMode(context, project);\n inspectMetadataBuilder(context, project);\n}\n\nfunction inspectPackageRoute(\n context: StaticRuleContext,\n project: ProjectShape,\n rule: {\n ruleId: string;\n surface: string;\n candidates: string[];\n staticFile: string;\n modules: RegExp[];\n packageLabel: string;\n needsCatalogue: boolean;\n },\n) {\n recordEvaluation(context.evaluations, rule.surface, rule.ruleId);\n const expected = `The ${rule.surface} route is a thin binding of ${rule.packageLabel}${rule.needsCatalogue ? \" over the route catalogue\" : \"\"}`;\n const remediation = `Serve ${rule.surface} from ${rule.candidates[0]} using ${rule.packageLabel}${rule.needsCatalogue ? \" and the routes from src/data/routes.ts\" : \"\"}.`;\n const report = (actual: string, path: string) => context.findings.push(staticFinding({\n ruleId: rule.ruleId, surface: rule.surface, path, expected, actual, remediation,\n }));\n if (existsSync(join(context.root, rule.staticFile))) {\n report(`${rule.staticFile} bypasses the environment-aware shared ${rule.surface} output.`, rule.staticFile);\n }\n const route = firstExisting(context, rule.candidates);\n const file = route ? context.source.byPath.get(route) : undefined;\n if (!route || !file) {\n report(`No ${rule.surface} route was found.`, rule.candidates[0]!);\n return;\n }\n const references = listModuleReferences(file);\n if (!references.some((reference) => rule.modules.some((module) => module.test(reference.specifier)))) {\n report(`${route} does not use ${rule.packageLabel}.`, route);\n return;\n }\n if (rule.needsCatalogue && project.catalogueFiles.length > 0 && !reachesCatalogue(context, project, file)) {\n report(`${route} does not read the route catalogue.`, route);\n }\n}\n\nfunction inspectSitemapMode(context: StaticRuleContext, project: ProjectShape) {\n if (!project.sitemapMode) return;\n const ruleId = \"brandlab-sitemap-split-mode\";\n recordEvaluation(context.evaluations, \"sitemap\", ruleId);\n const chunkRoute = [\"src/app/sitemaps\", \"app/sitemaps\"].find((path) => isDirectory(join(context.root, path)));\n if (project.sitemapMode === \"split\" ? chunkRoute : !chunkRoute) return;\n context.findings.push(staticFinding({\n ruleId,\n surface: \"sitemap\",\n path: chunkRoute ?? \"brandlab.config.ts\",\n expected: \"/sitemaps/[chunk] exists only when brandlab.config sets sitemap.mode: 'split'\",\n actual: project.sitemapMode === \"split\"\n ? \"sitemap.mode is 'split' but no /sitemaps/[chunk] route exists.\"\n : `sitemap.mode is 'single' but ${chunkRoute} still serves sitemap chunks.`,\n remediation: \"Keep the sitemap routes and brandlab.config sitemap.mode in agreement.\",\n }));\n}\n\nfunction inspectMetadataBuilder(context: StaticRuleContext, project: ProjectShape) {\n const ruleId = \"brandlab-metadata-route-builder\";\n recordEvaluation(context.evaluations, \"metadata\", ruleId);\n const builders = context.source.files.filter((file) =>\n findImportedCalls(file, SITE_NEXT(\"metadata\"), \"createRouteMetadataBuilder\").length > 0);\n const expected = \"Page metadata built by createRouteMetadataBuilder(site, routes) from @brandlab-digital/site-next/metadata\";\n const remediation = \"Bind pageMetadata = createRouteMetadataBuilder(site, routes) in src/lib/seo/metadata.ts.\";\n if (builders.length === 0) {\n context.findings.push(staticFinding({\n ruleId, surface: \"metadata\", path: \"src/lib/seo/metadata.ts\", expected, remediation,\n actual: \"No module builds page metadata with createRouteMetadataBuilder.\",\n }));\n return;\n }\n if (project.catalogueFiles.length === 0) return;\n for (const builder of builders.filter((file) => !reachesCatalogue(context, project, file))) {\n context.findings.push(staticFinding({\n ruleId, surface: \"metadata\", path: builder.path, expected, remediation,\n actual: \"The metadata builder does not read the route catalogue.\",\n }));\n }\n}\n\nfunction reachesCatalogue(context: StaticRuleContext, project: ProjectShape, file: BrandlabSourceFile): boolean {\n const catalogues = new Set(project.catalogueFiles);\n const seen = new Set<string>([file.path]);\n let frontier = [file];\n for (let depth = 0; depth < 4 && frontier.length > 0; depth += 1) {\n const next: BrandlabSourceFile[] = [];\n for (const current of frontier) {\n for (const imported of localImports(context, project.resolver, current)) {\n if (catalogues.has(imported.path)) return true;\n if (seen.has(imported.path)) continue;\n seen.add(imported.path);\n next.push(imported);\n }\n }\n frontier = next;\n }\n return false;\n}\n\n// --- business-identity and route-identity ------------------------------------\n\nfunction inspectBusinessFacts(context: StaticRuleContext) {\n if (context.source.files.length === 0) return;\n exactlyOneDefinition(context, {\n ruleId: \"brandlab-business-facts\",\n surface: \"business\",\n module: SITE_CORE(\"business\"),\n name: \"defineBrandlabBusiness\",\n expectedPath: \"src/data/businessEvidence.ts\",\n subject: \"Business facts\",\n });\n}\n\n/** The one-owner 3.0 bindings: site identity, redirects, analytics, next.config and instrumentation. */\nfunction inspectSharedBindings(context: StaticRuleContext) {\n if (context.source.files.length === 0) return;\n exactlyOneDefinition(context, {\n ruleId: \"brandlab-site-identity\",\n surface: \"metadata\",\n module: SITE_CORE(\"site\"),\n name: \"defineBrandlabSite\",\n expectedPath: \"src/config/site.ts\",\n subject: \"The site identity\",\n });\n exactlyOneDefinition(context, {\n ruleId: \"brandlab-redirects-table\",\n surface: \"routes\",\n module: SITE_CORE(\"redirects\"),\n name: \"defineRedirects\",\n expectedPath: \"src/data/redirects.ts\",\n subject: \"The redirect table\",\n });\n exactlyOneDefinition(context, {\n ruleId: \"brandlab-analytics-contract\",\n surface: \"analytics\",\n module: SITE_NEXT(\"analytics\"),\n name: \"defineBrandlabAnalytics\",\n expectedPath: \"src/config/analytics.ts\",\n subject: \"The analytics contract\",\n });\n requireBindingCall(context, {\n ruleId: \"brandlab-runtime-next-config\",\n surface: \"runtime\",\n candidates: [\"next.config.ts\", \"next.config.mts\", \"next.config.mjs\", \"next.config.js\"],\n module: SITE_NEXT(\"next-config\"),\n name: \"defineBrandlabNextConfig\",\n expected: \"next.config exports defineBrandlabNextConfig({ site, redirects, ... }) from @brandlab-digital/site-next/next-config\",\n consequence: \"headers, image formats and Preview noindex are then project-owned\",\n });\n requireBindingCall(context, {\n ruleId: \"brandlab-analytics-instrumentation\",\n surface: \"analytics\",\n candidates: [\"src/instrumentation-client.ts\", \"src/instrumentation-client.js\", \"instrumentation-client.ts\", \"instrumentation-client.js\"],\n module: SITE_NEXT(\"instrumentation-client\"),\n name: \"installBrandlabInstrumentation\",\n expected: \"src/instrumentation-client.ts calls installBrandlabInstrumentation(analytics)\",\n consequence: \"telephone taps and the initial landing are not reported by the shared runtime\",\n });\n}\n\nfunction requireBindingCall(\n context: StaticRuleContext,\n rule: {\n ruleId: string;\n surface: string;\n candidates: readonly string[];\n module: RegExp;\n name: string;\n expected: string;\n consequence: string;\n },\n) {\n recordEvaluation(context.evaluations, rule.surface, rule.ruleId);\n const path = rule.candidates.find((candidate) => context.source.byPath.has(candidate));\n const file = path ? context.source.byPath.get(path) : undefined;\n if (file && findImportedCalls(file, rule.module, rule.name).length > 0) return;\n context.findings.push(staticFinding({\n ruleId: rule.ruleId,\n surface: rule.surface,\n path: path ?? rule.candidates[0]!,\n expected: rule.expected,\n actual: file\n ? `${path} does not call ${rule.name}, so ${rule.consequence}.`\n : `${rule.candidates[0]} is missing, so ${rule.consequence}.`,\n remediation: `Call ${rule.name} from the shared package in ${rule.candidates[0]}.`,\n }));\n}\n\nfunction inspectRouteCatalogue(context: StaticRuleContext, project: ProjectShape) {\n if (context.source.files.length === 0) return;\n exactlyOneDefinition(context, {\n ruleId: \"brandlab-routes-catalogue\",\n surface: \"routes\",\n module: SITE_CORE(\"routes\"),\n name: \"defineRouteCatalog\",\n expectedPath: \"src/data/routes.ts\",\n subject: \"The route catalogue\",\n known: project.catalogueFiles,\n });\n}\n\nfunction exactlyOneDefinition(\n context: StaticRuleContext,\n rule: {\n ruleId: string;\n surface: string;\n module: RegExp;\n name: string;\n expectedPath: string;\n subject: string;\n known?: string[];\n },\n) {\n recordEvaluation(context.evaluations, rule.surface, rule.ruleId);\n const owners = rule.known ?? context.source.files\n .filter((file) => findImportedCalls(file, rule.module, rule.name).length > 0)\n .map((file) => file.path);\n if (owners.length === 1) return;\n context.findings.push(staticFinding({\n ruleId: rule.ruleId,\n surface: rule.surface,\n path: owners[0] ?? rule.expectedPath,\n expected: `${rule.subject} declared once with ${rule.name}`,\n actual: owners.length === 0\n ? `No module calls ${rule.name}.`\n : `${rule.name} is called in ${owners.length} modules: ${owners.join(\", \")}.`,\n remediation: `Keep one ${rule.name} owner in ${rule.expectedPath} and import it everywhere else.`,\n }));\n}\n\nfunction inspectLocationEstate(context: StaticRuleContext, project: ProjectShape) {\n if (!project.locationsDeclared) return;\n const ruleId = \"brandlab-routes-location-estate\";\n recordEvaluation(context.evaluations, \"routes\", ruleId);\n const estate = firstExisting(context, SOURCE_EXTENSIONS.slice(0, 2).map((extension) => `src/data/locations/estate.${extension}`));\n const file = estate ? context.source.byPath.get(estate) : undefined;\n if (file && findImportedCalls(file, SITE_CORE(\"locations\"), \"defineLocationEstate\").length > 0) return;\n context.findings.push(staticFinding({\n ruleId,\n surface: \"routes\",\n path: estate ?? \"src/data/locations/estate.ts\",\n expected: \"The published location list declared once in src/data/locations/estate.ts with defineLocationEstate\",\n actual: file\n ? \"src/data/locations/estate.ts does not declare the estate with defineLocationEstate.\"\n : \"The project publishes locations but has no src/data/locations/estate.ts.\",\n remediation: \"Declare the published locations, retained exclusions and any site-owned locations with defineLocationEstate as literal data.\",\n }));\n}\n\n// --- public-output-safety ----------------------------------------------------\n\n/** Directories that can hold public content documents (MDX, Markdown and JSON data). */\nconst DOCUMENT_ROOTS = [...BRANDLAB_SOURCE_ROOT_DIRECTORIES, \"content\", \"posts\"];\n\n/**\n * Implementation wording in anything that can render publicly: JSX text, rendered\n * attributes (alt, title, aria-label and component copy props), copy-bearing string\n * literals in pages, components, metadata, schema, configuration and data, MDX and\n * Markdown content with its frontmatter, and JSON data. Class lists, styles, import\n * paths, keys, types, comparisons, errors and console output are code, not copy.\n */\nfunction inspectImplementationWording(context: StaticRuleContext) {\n const modules = context.source.files.filter((file) => isPublicModulePath(file.path));\n const documents = [...new Set(DOCUMENT_ROOTS)]\n .flatMap((directory) => walkProjectFiles(context.root, directory))\n .filter(isPublicDocumentPath);\n if (modules.length === 0 && documents.length === 0) return;\n const ruleId = \"brandlab-content-implementation-wording\";\n recordEvaluation(context.evaluations, \"content\", ruleId);\n const report = (path: string, finding: PublicCopyFinding) => {\n context.findings.push(staticFinding({\n ruleId,\n surface: \"content\",\n path,\n line: finding.line,\n expected: \"Publicly rendered copy is finished customer copy, not implementation wording\",\n actual: `Implementation-facing wording (${finding.pattern.source}) appears in ${finding.where}.`,\n remediation: \"Replace the wording with the finished customer copy before it can render publicly.\",\n }));\n };\n for (const file of modules) {\n for (const finding of findWordingInSource(parseBrandlabSourceFile(file))) report(file.path, finding);\n }\n for (const path of documents) {\n const text = readFileSync(join(context.root, path), \"utf8\");\n const findings = path.endsWith(\".json\")\n ? findWordingInSource(parseJsonSource(path, text))\n : findWordingInMarkdown(text);\n for (const finding of findings) report(path, finding);\n }\n}\n\n// --- source-safety -----------------------------------------------------------\n\n/** Shared platform surfaces a project must import rather than declare. */\nconst PROTECTED_PLATFORM_NAMES = new Set([\n \"BrandlabBreadcrumbs\", \"BrandlabGoogleTag\", \"ContactFormEmail\", \"SafeRichText\", \"SchemaScript\",\n \"buildBrandlabMetadata\", \"buildLocalBusinessSchema\", \"buildNextMetadata\", \"buildRobotsMetadata\",\n \"buildSchemaGraph\", \"buildSitemapEntries\", \"createBrandlabContactRouteHandler\",\n \"createBrandlabContactRuntime\", \"createBrandlabRobots\", \"createBrandlabSitemapRoute\",\n \"createNextMetadataBuilder\", \"createRouteAwareMdxBlogAdapter\", \"createRouteAwareStructuredBlogAdapter\",\n \"createRouteMetadataBuilder\", \"defineAnalyticsContract\", \"defineBrandlabAnalytics\",\n \"defineBrandlabBusiness\", \"defineBrandlabContact\", \"defineBrandlabNextConfig\", \"defineBrandlabProject\",\n \"defineBrandlabSite\", \"defineBreadcrumbTrail\", \"defineContactContract\", \"defineLocationEstate\",\n \"defineRedirects\", \"defineRouteCatalog\", \"installBrandlabInstrumentation\", \"installPhoneClickListener\",\n \"renderContactEmail\", \"sitemapIndexXmlResponse\", \"sitemapXmlResponse\", \"trackBrandlabBrowserEvent\",\n \"useBrandlabContactForm\",\n]);\n\n/** Package exports removed in 3.0.0 (web-vitals APIs are reported by the analytics rule). */\nconst RETIRED_PACKAGE_EXPORTS = [\n \"TrackedTelephoneLink\", \"shouldIndexSite\", \"buildRobotsMetadata\", \"buildSeoMetadata\", \"buildNextMetadata\",\n \"buildBrandlabNextMetadata\", \"createNextMetadataBuilder\", \"createBrandlabNextMetadataBuilder\",\n \"isBrandlabProductionDeployment\", \"resolveBrowserAnalyticsConfig\", \"resolveBrandlabGoogleTagConfig\",\n \"BRANDLAB_NEXT_HEADER_PROFILES\", \"createContactHttpSubmissionController\", \"trackDeliveredContactResult\",\n \"trackDeliveredContactWithEnhancedConversions\", \"trackDeliveredContact\", \"shouldTrackContactResult\",\n \"isTrackableContactActionResult\",\n];\n\n/** APIs, options and paths removed in 3.0.0; their presence means an unfinished migration. */\nconst RETIRED_SOURCE_APIS: readonly { pattern: RegExp; label: string }[] = [\n ...RETIRED_PACKAGE_EXPORTS.map((name) => ({ pattern: new RegExp(`\\\\b${name}\\\\b`), label: name })),\n { pattern: /\\bALLOW_INDEXING\\b/, label: \"the ALLOW_INDEXING override\" },\n { pattern: /\\bNEXT_PUBLIC_SITE_URL\\b/, label: \"NEXT_PUBLIC_SITE_URL\" },\n {\n pattern: /\\bbuildBrandlabHeaderRules\\s*\\(\\s*\\{[^}]*\\b(?:isProduction|profile)\\b/,\n label: \"buildBrandlabHeaderRules({ isProduction, profile }) (pass the deployment instead)\",\n },\n { pattern: /\\b(?:xRobotsTag|contentSecurityPolicyMode)\\s*:/, label: \"the xRobotsTag or contentSecurityPolicyMode header option\" },\n { pattern: /\\bleadDiagnostics\\s*:/, label: \"the leadDiagnostics flag (lead diagnostics are always sent)\" },\n];\n\nfunction inspectPlatformReimplementation(context: StaticRuleContext) {\n if (context.source.files.length === 0) return;\n const reimplementation = \"brandlab-source-platform-reimplementation\";\n const retired = \"brandlab-source-retired-api\";\n recordEvaluation(context.evaluations, \"source\", reimplementation, retired);\n for (const file of context.source.files) {\n const declared = declaredProtectedNames(file);\n if (declared) {\n context.findings.push(staticFinding({\n ruleId: reimplementation,\n surface: \"source\",\n path: file.path,\n line: declared.line,\n expected: \"Protected Brandlab platform surfaces are imported from the shared packages\",\n actual: `${declared.name} is declared locally instead of imported from the shared packages.`,\n remediation: `Import ${declared.name} from @brandlab-digital/site-core or site-next and remove the local copy.`,\n }));\n }\n for (const api of RETIRED_SOURCE_APIS) {\n const match = file.executable.match(api.pattern);\n if (!match || match.index === undefined) continue;\n context.findings.push(staticFinding({\n ruleId: retired,\n surface: \"source\",\n path: file.path,\n line: lineAt(file.text, match.index),\n expected: \"Only current 3.0 platform APIs\",\n actual: `The project still uses ${api.label}, which 3.0 removed.`,\n remediation: \"Migrate the caller to the current shared API and delete the retired path.\",\n }));\n }\n }\n}\n\nfunction declaredProtectedNames(file: BrandlabSourceFile): { name: string; line: number } | null {\n const source = parseBrandlabSourceFile(file);\n for (const statement of source.statements) {\n const names: { name: string; node: ts.Node }[] = [];\n if ((ts.isFunctionDeclaration(statement) || ts.isClassDeclaration(statement)) && statement.name) {\n names.push({ name: statement.name.text, node: statement.name });\n } else if (ts.isVariableStatement(statement)) {\n for (const declaration of statement.declarationList.declarations) {\n if (ts.isIdentifier(declaration.name)) names.push({ name: declaration.name.text, node: declaration.name });\n }\n }\n const protectedName = names.find(({ name }) => PROTECTED_PLATFORM_NAMES.has(name));\n if (protectedName) return { name: protectedName.name, line: lineOfNode(file, protectedName.node) };\n }\n return null;\n}\n\n/** Project configuration keys removed in 3.0.0. */\nconst RETIRED_CONFIG_KEYS: readonly { pattern: RegExp; key: string; label: string; remediation: string }[] = [\n {\n pattern: /\\broutes\\s*:\\s*\\{[^{}]*\\baliases\\s*:/,\n key: \"aliases\",\n label: \"routes.aliases\",\n remediation: \"Move each alias into the redirect table in src/data/redirects.ts.\",\n },\n {\n pattern: /\\bprofile\\s*:/,\n key: \"profile\",\n label: \"the profile field\",\n remediation: \"Delete the profile field; defineBrandlabProject rejects unknown keys.\",\n },\n];\n\nfunction inspectRetiredConfiguration(context: StaticRuleContext) {\n if (!context.config) return;\n const ruleId = \"brandlab-source-retired-api\";\n recordEvaluation(context.evaluations, \"source\", ruleId);\n const config = stripCommentsPreservingLayout(context.config);\n for (const retired of RETIRED_CONFIG_KEYS) {\n const match = config.match(retired.pattern);\n if (!match || match.index === undefined) continue;\n context.findings.push(staticFinding({\n ruleId,\n surface: \"source\",\n path: \"brandlab.config.ts\",\n line: lineAt(context.config, match.index + match[0].lastIndexOf(retired.key)),\n expected: \"Only current 3.0 platform APIs\",\n actual: `brandlab.config.ts still declares ${retired.label}, which 3.0 removed.`,\n remediation: retired.remediation,\n }));\n }\n}\n\n// --- structural: CI and deployment -------------------------------------------\n\nfunction inspectWorkflowPins(context: StaticRuleContext) {\n const directory = join(context.root, \".github/workflows\");\n if (!isDirectory(directory)) return;\n const workflows = readdirSync(directory).filter((name) => /\\.ya?ml$/.test(name)).sort();\n if (workflows.length === 0) return;\n const ruleId = \"brandlab-ci-workflow-pinned\";\n recordEvaluation(context.evaluations, \"project-verification\", ruleId);\n for (const name of workflows) {\n const path = `.github/workflows/${name}`;\n const text = readFileSync(join(context.root, path), \"utf8\");\n for (const match of text.matchAll(/^[ \\t]*-?[ \\t]*uses[ \\t]*:[ \\t]*['\"]?([^'\"\\s#]+)/gm)) {\n const reference = match[1]!;\n if (reference.startsWith(\"./\") || reference.startsWith(\"docker://\")) continue;\n if (/@[0-9a-f]{40}$/.test(reference)) continue;\n context.findings.push(staticFinding({\n ruleId,\n surface: \"project-verification\",\n path,\n line: lineAt(text, match.index ?? 0),\n expected: \"Every reused workflow and action pinned to a full 40-character commit SHA\",\n actual: `${reference} is not pinned to an immutable commit.`,\n remediation: \"Pin the reference to the fleet workflow SHA recorded in the control repo.\",\n }));\n }\n }\n}\n\nfunction inspectVercelIgnore(context: StaticRuleContext) {\n const text = readOptionalFile(join(context.root, \".vercelignore\"));\n if (text === null) return;\n const ruleId = \"brandlab-deployment-vercelignore-lockfile\";\n recordEvaluation(context.evaluations, \"deployment\", ruleId);\n const excluded = [\"package.json\", \"package-lock.json\"].filter((file) => isIgnored(text, file));\n if (excluded.length === 0) return;\n context.findings.push(staticFinding({\n ruleId,\n surface: \"deployment\",\n path: \".vercelignore\",\n expected: \".vercelignore never excludes package.json or package-lock.json\",\n actual: `.vercelignore excludes ${excluded.join(\" and \")}, so Vercel cannot install the exact locked release.`,\n remediation: \"Remove the package manifest and lockfile patterns from .vercelignore.\",\n }));\n}\n\n/** Evaluate gitignore-style patterns (last match wins) for a root-level file. */\nexport function isIgnored(patterns: string, file: string): boolean {\n let ignored = false;\n for (const rawLine of patterns.split(/\\r?\\n/)) {\n const line = rawLine.trim();\n if (!line || line.startsWith(\"#\")) continue;\n const negated = line.startsWith(\"!\");\n let pattern = negated ? line.slice(1) : line;\n if (pattern.endsWith(\"/\")) continue;\n pattern = pattern.replace(/^\\//, \"\").replace(/^\\*\\*\\//, \"\");\n if (pattern.includes(\"/\")) continue;\n if (globMatch(pattern, file)) ignored = !negated;\n }\n return ignored;\n}\n\n// --- shared helpers ----------------------------------------------------------\n\nexport interface ContactContractRecipient {\n path: string;\n line: number;\n /** The literal delivery.recipientEnv key, or null when it is not statically declared. */\n recipientEnv: string | null;\n}\n\n/** Every defineContactContract call and the recipient environment key it declares. */\nexport function findContactContractRecipients(\n source: BrandlabSourceIndex,\n): ContactContractRecipient[] {\n return source.files.flatMap((file) =>\n findImportedCalls(file, SITE_CORE(\"contact\"), \"defineContactContract\").map((call) => ({\n path: file.path,\n line: lineOfNode(file, call),\n recipientEnv: stringLiteralValue(\n objectPropertyValue(objectPropertyValue(call.arguments[0], \"delivery\"), \"recipientEnv\"),\n ),\n })),\n );\n}\n\n/** Framework route file candidates under src/app, then a legacy root app/. */\nfunction routeCandidates(name: string): string[] {\n return [\"src/app\", \"app\"].flatMap((directory) =>\n SOURCE_EXTENSIONS.map((extension) => posix.join(directory, `${name}.${extension}`)));\n}\n\nfunction firstExisting(context: StaticRuleContext, candidates: readonly string[]): string | null {\n return candidates.find((path) => context.source.byPath.has(path) || existsSync(join(context.root, path))) ?? null;\n}\n\nfunction localImports(\n context: StaticRuleContext,\n resolver: BrandlabModuleResolver,\n file: BrandlabSourceFile,\n): BrandlabSourceFile[] {\n return listModuleReferences(file)\n .filter((reference) => !reference.typeOnly)\n .flatMap((reference) => {\n const resolved = resolver(file.path, reference.specifier);\n const target = resolved ? context.source.byPath.get(resolved) : undefined;\n return target ? [target] : [];\n });\n}\n\n/** Names a module exports, including `export { local as POST }` forms. */\nexport function exportedNames(file: BrandlabSourceFile): Set<string> {\n const names = new Set<string>();\n for (const statement of parseBrandlabSourceFile(file).statements) {\n const exported = ts.canHaveModifiers(statement) &&\n ts.getModifiers(statement)?.some((modifier) => modifier.kind === ts.SyntaxKind.ExportKeyword);\n if (exported && (ts.isFunctionDeclaration(statement) || ts.isClassDeclaration(statement)) && statement.name) {\n names.add(statement.name.text);\n } else if (exported && ts.isVariableStatement(statement)) {\n for (const declaration of statement.declarationList.declarations) {\n if (ts.isIdentifier(declaration.name)) names.add(declaration.name.text);\n }\n } else if (ts.isExportDeclaration(statement) && statement.exportClause && ts.isNamedExports(statement.exportClause)) {\n for (const element of statement.exportClause.elements) names.add(element.name.text);\n }\n }\n return names;\n}\n\nfunction readOptionalFile(path: string): string | null {\n return existsSync(path) ? readFileSync(path, \"utf8\") : null;\n}\n"]}
1
+ {"version":3,"file":"static-rules.js","sourceRoot":"","sources":["../src/static-rules.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync, readdirSync } from \"node:fs\";\nimport { join, posix } from \"node:path\";\nimport ts from \"typescript\";\nimport { globMatch } from \"./glob.js\";\nimport type { BrandlabFinding } from \"./project.js\";\nimport {\n findWordingInMarkdown,\n findWordingInSource,\n isPublicDocumentPath,\n isPublicModulePath,\n parseJsonSource,\n type PublicCopyFinding,\n} from \"./public-copy.js\";\nimport {\n BRANDLAB_SOURCE_ROOT_DIRECTORIES,\n createBrandlabModuleResolver,\n findImportedCalls,\n importedLocalNames,\n isDirectory,\n lineAt,\n stripCommentsPreservingLayout,\n lineOfNode,\n listModuleReferences,\n objectPropertyValue,\n parseBrandlabSourceFile,\n stringLiteralValue,\n type BrandlabModuleResolver,\n type BrandlabSourceFile,\n type BrandlabSourceIndex,\n walkProjectFiles,\n} from \"./source-files.js\";\nimport type { BrandlabRuleEvaluation } from \"./verification-policy.js\";\n\nconst SITE_CORE = (module: string) => new RegExp(`^@brandlab-digital/site-core/${module}$`);\nconst SITE_NEXT = (module: string) => new RegExp(`^@brandlab-digital/site-next/${module}$`);\nconst SITE_NEXT_ANY = /^@brandlab-digital\\/site-next(?:\\/|$)/;\nconst SOURCE_EXTENSIONS = [\"ts\", \"tsx\", \"js\", \"jsx\", \"mjs\"];\n\nexport interface StaticRuleContext {\n root: string;\n source: BrandlabSourceIndex;\n /** brandlab.config.ts text, or null when it is missing. */\n config: string | null;\n findings: BrandlabFinding[];\n evaluations: BrandlabRuleEvaluation[];\n}\n\nexport function staticFinding(options: {\n ruleId: string;\n surface: string;\n expected: string;\n actual: string;\n remediation: string;\n path?: string;\n line?: number;\n severity?: BrandlabFinding[\"severity\"];\n}): BrandlabFinding {\n return {\n ruleId: options.ruleId,\n surface: options.surface,\n severity: options.severity ?? \"blocker\",\n contract: { name: \"project\", version: \"current-only-v2\" },\n evidenceKind: \"static\",\n ...(options.path ? { path: options.path } : {}),\n ...(options.line ? { line: options.line } : {}),\n expected: options.expected,\n actual: options.actual,\n remediation: options.remediation,\n };\n}\n\nexport function recordEvaluation(\n evaluations: BrandlabRuleEvaluation[],\n surface: string,\n ...ruleIds: string[]\n) {\n for (const ruleId of ruleIds) evaluations.push({ ruleId, surface });\n}\n\n/** The minimal static rules behind the checks that previously passed without evidence. */\nexport function inspectStaticRules(context: StaticRuleContext) {\n const project = describeProject(context);\n inspectContactProviderRoute(context, project);\n inspectAnalyticsPrivacy(context);\n inspectGoogleTagOwner(context);\n inspectGoogleTagConsent(context);\n inspectSearchRouting(context, project);\n inspectBusinessFacts(context);\n inspectSharedBindings(context);\n inspectRouteCatalogue(context, project);\n inspectLocationEstate(context, project);\n inspectImplementationWording(context);\n inspectPlatformReimplementation(context);\n inspectRetiredConfiguration(context);\n inspectWorkflowPins(context);\n inspectVercelIgnore(context);\n}\n\nexport interface BrandlabProjectCapabilities {\n contactEnabled: boolean;\n reviewsEnabled: boolean;\n locationsDeclared: boolean;\n sitemapMode: \"single\" | \"split\" | null;\n}\n\n/** Capabilities declared by brandlab.config.ts, the contact route and the location data. */\nexport function describeCapabilities(root: string, config: string | null): BrandlabProjectCapabilities {\n const text = config ?? \"\";\n const families = text.match(/\\bfamilies\\s*:\\s*\\[([^\\]]*)\\]/)?.[1] ?? \"\";\n const strategy = text.match(/\\blocations\\s*:\\s*\\{[^{}]*\\bstrategy\\s*:\\s*['\"]([a-z-]+)['\"]/)?.[1];\n return {\n contactEnabled:\n /\\bcontact\\s*:\\s*\\{/.test(text) ||\n routeCandidates(\"api/contact/route\").some((path) => existsSync(join(root, path))),\n reviewsEnabled: /\\breviews\\s*:\\s*\\{/.test(text),\n locationsDeclared:\n /['\"](?:locations|service-locations)['\"]/.test(families) ||\n (strategy !== undefined && strategy !== \"none\") ||\n isDirectory(join(root, \"src/data/locations\")),\n sitemapMode: (text.match(/\\bsitemap\\s*:\\s*\\{[^{}]*\\bmode\\s*:\\s*['\"](single|split)['\"]/)?.[1] ??\n null) as BrandlabProjectCapabilities[\"sitemapMode\"],\n };\n}\n\ninterface ProjectShape extends BrandlabProjectCapabilities {\n resolver: BrandlabModuleResolver;\n catalogueFiles: string[];\n}\n\nfunction describeProject(context: StaticRuleContext): ProjectShape {\n const capabilities = describeCapabilities(context.root, context.config);\n return {\n ...capabilities,\n contactEnabled: capabilities.contactEnabled || findContactContractRecipients(context.source).length > 0,\n resolver: createBrandlabModuleResolver(context.root, new Set(context.source.byPath.keys())),\n catalogueFiles: context.source.files\n .filter((file) => findImportedCalls(file, SITE_CORE(\"routes\"), \"defineRouteCatalog\").length > 0)\n .map((file) => file.path),\n };\n}\n\n// --- contact-provider-errors -------------------------------------------------\n\nfunction inspectContactProviderRoute(context: StaticRuleContext, project: ProjectShape) {\n if (!project.contactEnabled) return;\n const ruleId = \"brandlab-contact-provider-route\";\n recordEvaluation(context.evaluations, \"contact\", ruleId);\n const expected =\n \"POST /api/contact produced by the shared handler (createBrandlabContactRouteHandler, or createBrandlabContactRuntime during transition)\";\n const remediation =\n \"Export POST = createBrandlabContactRouteHandler({ contract, runtime }) from @brandlab-digital/site-next/contact/server.\";\n const route = firstExisting(context, routeCandidates(\"api/contact/route\"));\n if (!route) {\n context.findings.push(staticFinding({\n ruleId, surface: \"contact\", path: \"src/app/api/contact/route.ts\", expected, remediation,\n actual: \"The contact capability is enabled but src/app/api/contact/route.ts is missing.\",\n }));\n return;\n }\n const file = context.source.byPath.get(route);\n if (!file || !exportedNames(file).has(\"POST\")) {\n context.findings.push(staticFinding({\n ruleId, surface: \"contact\", path: route, expected, remediation,\n actual: \"The contact route does not export a POST handler.\",\n }));\n return;\n }\n const contactServer = SITE_NEXT(\"contact/server\");\n const direct = findImportedCalls(file, contactServer, \"createBrandlabContactRouteHandler\").length > 0;\n const runtimeModules = [file, ...localImports(context, project.resolver, file)];\n const transitional =\n /\\.contactRouteHandler\\b/.test(file.executable) &&\n runtimeModules.some((candidate) =>\n findImportedCalls(candidate, contactServer, \"createBrandlabContactRuntime\").length > 0);\n if (!direct && !transitional) {\n context.findings.push(staticFinding({\n ruleId, surface: \"contact\", path: route, expected, remediation,\n actual: \"The POST handler is not created by the shared contact runtime, so provider errors are project-owned.\",\n }));\n }\n}\n\n// --- analytics-privacy -------------------------------------------------------\n\nconst ANALYTICS_SINKS = new Set([\n \"gtag\", \"window.gtag\", \"globalThis.gtag\",\n \"dataLayer.push\", \"window.dataLayer.push\", \"globalThis.dataLayer.push\",\n \"sendGAEvent\", \"sendGTMEvent\", \"trackBrandlabBrowserEvent\", \"trackBrandlabEvent\", \"ReactGA.event\",\n]);\n\nconst PII_TOKENS = new Set([\n \"attachment\", \"attachment_name\", \"contact_email\", \"contact_name\", \"customer_name\", \"email\",\n \"email_address\", \"enquiry_message\", \"file_name\", \"filename\", \"first_name\", \"form_message\",\n \"full_name\", \"last_name\", \"message\", \"mobile\", \"mobile_number\", \"phone\", \"phone_number\",\n \"residential_address\", \"street_address\", \"user_email\", \"user_phone\",\n]);\n\nfunction inspectAnalyticsPrivacy(context: StaticRuleContext) {\n if (context.source.files.length === 0) return;\n const ruleId = \"brandlab-analytics-pii-payload\";\n recordEvaluation(context.evaluations, \"analytics\", ruleId);\n for (const file of context.source.files) {\n const visit = (node: ts.Node) => {\n if (ts.isCallExpression(node) && ANALYTICS_SINKS.has(memberPath(node.expression) ?? \"\")) {\n const userData = stringLiteralValue(node.arguments[0]) === \"set\" &&\n stringLiteralValue(node.arguments[1]) === \"user_data\" &&\n node.arguments[2] && !(ts.isObjectLiteralExpression(node.arguments[2]) && node.arguments[2].properties.length === 0);\n const piiNode = userData ? node.arguments[2] : node.arguments.map(findPiiNode).find(Boolean);\n if (piiNode) {\n context.findings.push(staticFinding({\n ruleId,\n surface: \"analytics\",\n path: file.path,\n line: lineOfNode(file, piiNode),\n expected: \"Analytics payloads carry only the shared allowlisted, non-identifying parameters\",\n actual: userData\n ? \"Project code sets Google user_data; enhanced conversion data is owned by the shared runtime.\"\n : \"A lead contact field, message or attachment detail reaches an analytics payload.\",\n remediation: \"Send events through the shared Brandlab analytics runtime without lead details.\",\n }));\n }\n }\n ts.forEachChild(node, visit);\n };\n visit(parseBrandlabSourceFile(file));\n }\n}\n\nfunction findPiiNode(node: ts.Node | undefined): ts.Node | undefined {\n if (!node) return undefined;\n if (ts.isObjectLiteralExpression(node)) {\n for (const property of node.properties) {\n if (ts.isShorthandPropertyAssignment(property) && isPiiToken(property.name.text)) return property;\n if (ts.isSpreadAssignment(property) && isPiiReference(property.expression)) return property;\n if (!ts.isPropertyAssignment(property)) continue;\n const key = ts.isIdentifier(property.name) || ts.isStringLiteralLike(property.name) ? property.name.text : null;\n if ((key && isPiiToken(key)) || isPiiReference(property.initializer)) return property;\n const nested = findPiiNode(property.initializer);\n if (nested) return nested;\n }\n return undefined;\n }\n if (ts.isArrayLiteralExpression(node)) return node.elements.map(findPiiNode).find(Boolean);\n return isPiiReference(node) ? node : undefined;\n}\n\nfunction isPiiReference(node: ts.Node): boolean {\n if (ts.isIdentifier(node)) return isPiiToken(node.text);\n if (ts.isPropertyAccessExpression(node)) return isPiiToken(node.name.text);\n if (ts.isTemplateExpression(node)) return node.templateSpans.some((span) => isPiiReference(span.expression));\n return false;\n}\n\nfunction isPiiToken(value: string): boolean {\n return PII_TOKENS.has(value.replace(/([a-z0-9])([A-Z])/g, \"$1_$2\").toLowerCase().replace(/[^a-z0-9]+/g, \"_\"));\n}\n\nfunction memberPath(node: ts.Expression): string | null {\n if (ts.isIdentifier(node)) return node.text;\n if (ts.isPropertyAccessExpression(node)) {\n const object = memberPath(node.expression);\n return object ? `${object}.${node.name.text}` : null;\n }\n return null;\n}\n\n// --- analytics-conversion: one Google tag owner ------------------------------\n\nfunction inspectGoogleTagOwner(context: StaticRuleContext) {\n if (context.source.files.length === 0) return;\n const ruleId = \"brandlab-analytics-google-tag-owner\";\n recordEvaluation(context.evaluations, \"analytics\", ruleId);\n const usages = context.source.files.flatMap((file) => {\n const locals = new Set(importedLocalNames(file, SITE_NEXT_ANY, \"BrandlabGoogleTag\"));\n if (locals.size === 0) return [];\n const found: { path: string; line: number }[] = [];\n const visit = (node: ts.Node) => {\n if (\n (ts.isJsxSelfClosingElement(node) || ts.isJsxOpeningElement(node)) &&\n ts.isIdentifier(node.tagName) &&\n locals.has(node.tagName.text)\n ) {\n found.push({ path: file.path, line: lineOfNode(file, node) });\n }\n ts.forEachChild(node, visit);\n };\n visit(parseBrandlabSourceFile(file));\n return found;\n });\n const rootLayouts = new Set(routeCandidates(\"layout\").filter((path) => context.source.byPath.has(path)));\n const expected = \"Exactly one <BrandlabGoogleTag /> rendered from the root layout (src/app/layout.tsx)\";\n const remediation = \"Render BrandlabGoogleTag once, directly in src/app/layout.tsx, and remove wrappers or duplicates.\";\n if (usages.length === 1 && rootLayouts.has(usages[0]!.path)) return;\n context.findings.push(staticFinding({\n ruleId,\n surface: \"analytics\",\n ...(usages[0] ? { path: usages[0].path, line: usages[0].line } : { path: \"src/app/layout.tsx\" }),\n expected,\n actual: usages.length === 0\n ? \"No BrandlabGoogleTag is rendered, so the shared tag and its events are absent.\"\n : usages.length > 1\n ? `BrandlabGoogleTag is rendered ${usages.length} times (${usages.map(({ path, line }) => `${path}:${line}`).join(\", \")}).`\n : \"BrandlabGoogleTag is rendered outside the root layout.\",\n remediation,\n }));\n}\n\n// --- analytics-privacy: the Google tag's consent default follows the contract --\n\nfunction inspectGoogleTagConsent(context: StaticRuleContext) {\n if (context.source.files.length === 0) return;\n const ruleId = \"brandlab-analytics-google-tag-consent\";\n recordEvaluation(context.evaluations, \"analytics\", ruleId);\n for (const file of context.source.files) {\n const locals = new Set(importedLocalNames(file, SITE_NEXT_ANY, \"BrandlabGoogleTag\"));\n if (locals.size === 0) continue;\n const visit = (node: ts.Node) => {\n if (\n (ts.isJsxSelfClosingElement(node) || ts.isJsxOpeningElement(node)) &&\n ts.isIdentifier(node.tagName) &&\n locals.has(node.tagName.text)\n ) {\n for (const attribute of node.attributes.properties) {\n if (!ts.isJsxAttribute(attribute) || !ts.isIdentifier(attribute.name) || attribute.name.text !== \"adUserData\") continue;\n context.findings.push(staticFinding({\n ruleId,\n surface: \"analytics\",\n path: file.path,\n line: lineOfNode(file, attribute),\n expected: \"BrandlabGoogleTag takes its ad_user_data consent default from the analytics binding ({...analytics.googleTag})\",\n actual: \"BrandlabGoogleTag sets adUserData itself, so the Google tag's ad_user_data default no longer follows the analytics contract.\",\n remediation:\n \"Remove the adUserData attribute. Only googleAds.enhancedConversions: { mode: 'disclosed' } in the analytics contract grants it by default, once the privacy policy discloses it.\",\n }));\n }\n }\n ts.forEachChild(node, visit);\n };\n visit(parseBrandlabSourceFile(file));\n }\n}\n\n// --- search-routing ----------------------------------------------------------\n\nfunction inspectSearchRouting(context: StaticRuleContext, project: ProjectShape) {\n if (context.source.directoryRoots.length === 0) return;\n inspectPackageRoute(context, project, {\n ruleId: \"brandlab-robots-package-route\",\n surface: \"robots\",\n candidates: routeCandidates(\"robots\"),\n staticFile: \"public/robots.txt\",\n modules: [SITE_NEXT(\"robots\")],\n packageLabel: \"@brandlab-digital/site-next/robots\",\n needsCatalogue: false,\n });\n inspectPackageRoute(context, project, {\n ruleId: \"brandlab-sitemap-package-route\",\n surface: \"sitemap\",\n candidates: [...routeCandidates(\"sitemap.xml/route\"), ...routeCandidates(\"sitemap\")],\n staticFile: \"public/sitemap.xml\",\n modules: [SITE_NEXT(\"sitemaps\"), SITE_CORE(\"sitemaps\")],\n packageLabel: \"@brandlab-digital/site-next/sitemaps\",\n needsCatalogue: true,\n });\n inspectSitemapMode(context, project);\n inspectMetadataBuilder(context, project);\n}\n\nfunction inspectPackageRoute(\n context: StaticRuleContext,\n project: ProjectShape,\n rule: {\n ruleId: string;\n surface: string;\n candidates: string[];\n staticFile: string;\n modules: RegExp[];\n packageLabel: string;\n needsCatalogue: boolean;\n },\n) {\n recordEvaluation(context.evaluations, rule.surface, rule.ruleId);\n const expected = `The ${rule.surface} route is a thin binding of ${rule.packageLabel}${rule.needsCatalogue ? \" over the route catalogue\" : \"\"}`;\n const remediation = `Serve ${rule.surface} from ${rule.candidates[0]} using ${rule.packageLabel}${rule.needsCatalogue ? \" and the routes from src/data/routes.ts\" : \"\"}.`;\n const report = (actual: string, path: string) => context.findings.push(staticFinding({\n ruleId: rule.ruleId, surface: rule.surface, path, expected, actual, remediation,\n }));\n if (existsSync(join(context.root, rule.staticFile))) {\n report(`${rule.staticFile} bypasses the environment-aware shared ${rule.surface} output.`, rule.staticFile);\n }\n const route = firstExisting(context, rule.candidates);\n const file = route ? context.source.byPath.get(route) : undefined;\n if (!route || !file) {\n report(`No ${rule.surface} route was found.`, rule.candidates[0]!);\n return;\n }\n const references = listModuleReferences(file);\n if (!references.some((reference) => rule.modules.some((module) => module.test(reference.specifier)))) {\n report(`${route} does not use ${rule.packageLabel}.`, route);\n return;\n }\n if (rule.needsCatalogue && project.catalogueFiles.length > 0 && !reachesCatalogue(context, project, file)) {\n report(`${route} does not read the route catalogue.`, route);\n }\n}\n\nfunction inspectSitemapMode(context: StaticRuleContext, project: ProjectShape) {\n if (!project.sitemapMode) return;\n const ruleId = \"brandlab-sitemap-split-mode\";\n recordEvaluation(context.evaluations, \"sitemap\", ruleId);\n const chunkRoute = [\"src/app/sitemaps\", \"app/sitemaps\"].find((path) => isDirectory(join(context.root, path)));\n if (project.sitemapMode === \"split\" ? chunkRoute : !chunkRoute) return;\n context.findings.push(staticFinding({\n ruleId,\n surface: \"sitemap\",\n path: chunkRoute ?? \"brandlab.config.ts\",\n expected: \"/sitemaps/[chunk] exists only when brandlab.config sets sitemap.mode: 'split'\",\n actual: project.sitemapMode === \"split\"\n ? \"sitemap.mode is 'split' but no /sitemaps/[chunk] route exists.\"\n : `sitemap.mode is 'single' but ${chunkRoute} still serves sitemap chunks.`,\n remediation: \"Keep the sitemap routes and brandlab.config sitemap.mode in agreement.\",\n }));\n}\n\nfunction inspectMetadataBuilder(context: StaticRuleContext, project: ProjectShape) {\n const ruleId = \"brandlab-metadata-route-builder\";\n recordEvaluation(context.evaluations, \"metadata\", ruleId);\n const builders = context.source.files.filter((file) =>\n findImportedCalls(file, SITE_NEXT(\"metadata\"), \"createRouteMetadataBuilder\").length > 0);\n const expected = \"Page metadata built by createRouteMetadataBuilder(site, routes) from @brandlab-digital/site-next/metadata\";\n const remediation = \"Bind pageMetadata = createRouteMetadataBuilder(site, routes) in src/lib/seo/metadata.ts.\";\n if (builders.length === 0) {\n context.findings.push(staticFinding({\n ruleId, surface: \"metadata\", path: \"src/lib/seo/metadata.ts\", expected, remediation,\n actual: \"No module builds page metadata with createRouteMetadataBuilder.\",\n }));\n return;\n }\n if (project.catalogueFiles.length === 0) return;\n for (const builder of builders.filter((file) => !reachesCatalogue(context, project, file))) {\n context.findings.push(staticFinding({\n ruleId, surface: \"metadata\", path: builder.path, expected, remediation,\n actual: \"The metadata builder does not read the route catalogue.\",\n }));\n }\n}\n\nfunction reachesCatalogue(context: StaticRuleContext, project: ProjectShape, file: BrandlabSourceFile): boolean {\n const catalogues = new Set(project.catalogueFiles);\n const seen = new Set<string>([file.path]);\n let frontier = [file];\n for (let depth = 0; depth < 4 && frontier.length > 0; depth += 1) {\n const next: BrandlabSourceFile[] = [];\n for (const current of frontier) {\n for (const imported of localImports(context, project.resolver, current)) {\n if (catalogues.has(imported.path)) return true;\n if (seen.has(imported.path)) continue;\n seen.add(imported.path);\n next.push(imported);\n }\n }\n frontier = next;\n }\n return false;\n}\n\n// --- business-identity and route-identity ------------------------------------\n\nfunction inspectBusinessFacts(context: StaticRuleContext) {\n if (context.source.files.length === 0) return;\n exactlyOneDefinition(context, {\n ruleId: \"brandlab-business-facts\",\n surface: \"business\",\n module: SITE_CORE(\"business\"),\n name: \"defineBrandlabBusiness\",\n expectedPath: \"src/data/businessEvidence.ts\",\n subject: \"Business facts\",\n });\n}\n\n/** The one-owner 3.0 bindings: site identity, redirects, analytics, next.config and instrumentation. */\nfunction inspectSharedBindings(context: StaticRuleContext) {\n if (context.source.files.length === 0) return;\n exactlyOneDefinition(context, {\n ruleId: \"brandlab-site-identity\",\n surface: \"metadata\",\n module: SITE_CORE(\"site\"),\n name: \"defineBrandlabSite\",\n expectedPath: \"src/config/site.ts\",\n subject: \"The site identity\",\n });\n exactlyOneDefinition(context, {\n ruleId: \"brandlab-redirects-table\",\n surface: \"routes\",\n module: SITE_CORE(\"redirects\"),\n name: \"defineRedirects\",\n expectedPath: \"src/data/redirects.ts\",\n subject: \"The redirect table\",\n });\n exactlyOneDefinition(context, {\n ruleId: \"brandlab-analytics-contract\",\n surface: \"analytics\",\n module: SITE_NEXT(\"analytics\"),\n name: \"defineBrandlabAnalytics\",\n expectedPath: \"src/config/analytics.ts\",\n subject: \"The analytics contract\",\n });\n requireBindingCall(context, {\n ruleId: \"brandlab-runtime-next-config\",\n surface: \"runtime\",\n candidates: [\"next.config.ts\", \"next.config.mts\", \"next.config.mjs\", \"next.config.js\"],\n module: SITE_NEXT(\"next-config\"),\n name: \"defineBrandlabNextConfig\",\n expected: \"next.config exports defineBrandlabNextConfig({ site, redirects, ... }) from @brandlab-digital/site-next/next-config\",\n consequence: \"headers, image formats and Preview noindex are then project-owned\",\n });\n requireBindingCall(context, {\n ruleId: \"brandlab-analytics-instrumentation\",\n surface: \"analytics\",\n candidates: [\"src/instrumentation-client.ts\", \"src/instrumentation-client.js\", \"instrumentation-client.ts\", \"instrumentation-client.js\"],\n module: SITE_NEXT(\"instrumentation-client\"),\n name: \"installBrandlabInstrumentation\",\n expected: \"src/instrumentation-client.ts calls installBrandlabInstrumentation(analytics)\",\n consequence: \"telephone taps and the initial landing are not reported by the shared runtime\",\n });\n}\n\nfunction requireBindingCall(\n context: StaticRuleContext,\n rule: {\n ruleId: string;\n surface: string;\n candidates: readonly string[];\n module: RegExp;\n name: string;\n expected: string;\n consequence: string;\n },\n) {\n recordEvaluation(context.evaluations, rule.surface, rule.ruleId);\n const path = rule.candidates.find((candidate) => context.source.byPath.has(candidate));\n const file = path ? context.source.byPath.get(path) : undefined;\n if (file && findImportedCalls(file, rule.module, rule.name).length > 0) return;\n context.findings.push(staticFinding({\n ruleId: rule.ruleId,\n surface: rule.surface,\n path: path ?? rule.candidates[0]!,\n expected: rule.expected,\n actual: file\n ? `${path} does not call ${rule.name}, so ${rule.consequence}.`\n : `${rule.candidates[0]} is missing, so ${rule.consequence}.`,\n remediation: `Call ${rule.name} from the shared package in ${rule.candidates[0]}.`,\n }));\n}\n\nfunction inspectRouteCatalogue(context: StaticRuleContext, project: ProjectShape) {\n if (context.source.files.length === 0) return;\n exactlyOneDefinition(context, {\n ruleId: \"brandlab-routes-catalogue\",\n surface: \"routes\",\n module: SITE_CORE(\"routes\"),\n name: \"defineRouteCatalog\",\n expectedPath: \"src/data/routes.ts\",\n subject: \"The route catalogue\",\n known: project.catalogueFiles,\n });\n}\n\nfunction exactlyOneDefinition(\n context: StaticRuleContext,\n rule: {\n ruleId: string;\n surface: string;\n module: RegExp;\n name: string;\n expectedPath: string;\n subject: string;\n known?: string[];\n },\n) {\n recordEvaluation(context.evaluations, rule.surface, rule.ruleId);\n const owners = rule.known ?? context.source.files\n .filter((file) => findImportedCalls(file, rule.module, rule.name).length > 0)\n .map((file) => file.path);\n if (owners.length === 1) return;\n context.findings.push(staticFinding({\n ruleId: rule.ruleId,\n surface: rule.surface,\n path: owners[0] ?? rule.expectedPath,\n expected: `${rule.subject} declared once with ${rule.name}`,\n actual: owners.length === 0\n ? `No module calls ${rule.name}.`\n : `${rule.name} is called in ${owners.length} modules: ${owners.join(\", \")}.`,\n remediation: `Keep one ${rule.name} owner in ${rule.expectedPath} and import it everywhere else.`,\n }));\n}\n\nfunction inspectLocationEstate(context: StaticRuleContext, project: ProjectShape) {\n if (!project.locationsDeclared) return;\n const ruleId = \"brandlab-routes-location-estate\";\n recordEvaluation(context.evaluations, \"routes\", ruleId);\n const estate = firstExisting(context, SOURCE_EXTENSIONS.slice(0, 2).map((extension) => `src/data/locations/estate.${extension}`));\n const file = estate ? context.source.byPath.get(estate) : undefined;\n if (file && findImportedCalls(file, SITE_CORE(\"locations\"), \"defineLocationEstate\").length > 0) return;\n context.findings.push(staticFinding({\n ruleId,\n surface: \"routes\",\n path: estate ?? \"src/data/locations/estate.ts\",\n expected: \"The published location list declared once in src/data/locations/estate.ts with defineLocationEstate\",\n actual: file\n ? \"src/data/locations/estate.ts does not declare the estate with defineLocationEstate.\"\n : \"The project publishes locations but has no src/data/locations/estate.ts.\",\n remediation: \"Declare the published locations, retained exclusions and any site-owned locations with defineLocationEstate as literal data.\",\n }));\n}\n\n// --- public-output-safety ----------------------------------------------------\n\n/** Directories that can hold public content documents (MDX, Markdown and JSON data). */\nconst DOCUMENT_ROOTS = [...BRANDLAB_SOURCE_ROOT_DIRECTORIES, \"content\", \"posts\"];\n\n/**\n * Implementation wording in anything that can render publicly: JSX text, rendered\n * attributes (alt, title, aria-label and component copy props), copy-bearing string\n * literals in pages, components, metadata, schema, configuration and data, MDX and\n * Markdown content with its frontmatter, and JSON data. Class lists, styles, import\n * paths, keys, types, comparisons, errors and console output are code, not copy.\n */\nfunction inspectImplementationWording(context: StaticRuleContext) {\n const modules = context.source.files.filter((file) => isPublicModulePath(file.path));\n const documents = [...new Set(DOCUMENT_ROOTS)]\n .flatMap((directory) => walkProjectFiles(context.root, directory))\n .filter(isPublicDocumentPath);\n if (modules.length === 0 && documents.length === 0) return;\n const ruleId = \"brandlab-content-implementation-wording\";\n recordEvaluation(context.evaluations, \"content\", ruleId);\n const report = (path: string, finding: PublicCopyFinding) => {\n context.findings.push(staticFinding({\n ruleId,\n surface: \"content\",\n path,\n line: finding.line,\n expected: \"Publicly rendered copy is finished customer copy, not implementation wording\",\n actual: `Implementation-facing wording (${finding.pattern.source}) appears in ${finding.where}.`,\n remediation: \"Replace the wording with the finished customer copy before it can render publicly.\",\n }));\n };\n for (const file of modules) {\n for (const finding of findWordingInSource(parseBrandlabSourceFile(file))) report(file.path, finding);\n }\n for (const path of documents) {\n const text = readFileSync(join(context.root, path), \"utf8\");\n const findings = path.endsWith(\".json\")\n ? findWordingInSource(parseJsonSource(path, text))\n : findWordingInMarkdown(text);\n for (const finding of findings) report(path, finding);\n }\n}\n\n// --- source-safety -----------------------------------------------------------\n\n/** Shared platform surfaces a project must import rather than declare. */\nconst PROTECTED_PLATFORM_NAMES = new Set([\n \"BrandlabBreadcrumbs\", \"BrandlabGoogleTag\", \"ContactFormEmail\", \"SafeRichText\", \"SchemaScript\",\n \"buildBrandlabMetadata\", \"buildLocalBusinessSchema\", \"buildNextMetadata\", \"buildRobotsMetadata\",\n \"buildSchemaGraph\", \"buildSitemapEntries\", \"createBrandlabContactRouteHandler\",\n \"createBrandlabContactRuntime\", \"createBrandlabRobots\", \"createBrandlabSitemapRoute\",\n \"createNextMetadataBuilder\", \"createRouteAwareMdxBlogAdapter\", \"createRouteAwareStructuredBlogAdapter\",\n \"createRouteMetadataBuilder\", \"defineAnalyticsContract\", \"defineBrandlabAnalytics\",\n \"defineBrandlabBusiness\", \"defineBrandlabContact\", \"defineBrandlabNextConfig\", \"defineBrandlabProject\",\n \"defineBrandlabSite\", \"defineBreadcrumbTrail\", \"defineContactContract\", \"defineLocationEstate\",\n \"defineRedirects\", \"defineRouteCatalog\", \"installBrandlabInstrumentation\", \"installPhoneClickListener\",\n \"renderContactEmail\", \"sitemapIndexXmlResponse\", \"sitemapXmlResponse\", \"trackBrandlabBrowserEvent\",\n \"useBrandlabContactForm\",\n]);\n\n/** Package exports removed in 3.0.0 (web-vitals APIs are reported by the analytics rule). */\nconst RETIRED_PACKAGE_EXPORTS = [\n \"TrackedTelephoneLink\", \"shouldIndexSite\", \"buildRobotsMetadata\", \"buildSeoMetadata\", \"buildNextMetadata\",\n \"buildBrandlabNextMetadata\", \"createNextMetadataBuilder\", \"createBrandlabNextMetadataBuilder\",\n \"isBrandlabProductionDeployment\", \"resolveBrowserAnalyticsConfig\", \"resolveBrandlabGoogleTagConfig\",\n \"BRANDLAB_NEXT_HEADER_PROFILES\", \"createContactHttpSubmissionController\", \"trackDeliveredContactResult\",\n \"trackDeliveredContactWithEnhancedConversions\", \"trackDeliveredContact\", \"shouldTrackContactResult\",\n \"isTrackableContactActionResult\",\n];\n\n/** APIs, options and paths removed in 3.0.0; their presence means an unfinished migration. */\nconst RETIRED_SOURCE_APIS: readonly { pattern: RegExp; label: string }[] = [\n ...RETIRED_PACKAGE_EXPORTS.map((name) => ({ pattern: new RegExp(`\\\\b${name}\\\\b`), label: name })),\n { pattern: /\\bALLOW_INDEXING\\b/, label: \"the ALLOW_INDEXING override\" },\n { pattern: /\\bNEXT_PUBLIC_SITE_URL\\b/, label: \"NEXT_PUBLIC_SITE_URL\" },\n {\n pattern: /\\bbuildBrandlabHeaderRules\\s*\\(\\s*\\{[^}]*\\b(?:isProduction|profile)\\b/,\n label: \"buildBrandlabHeaderRules({ isProduction, profile }) (pass the deployment instead)\",\n },\n { pattern: /\\b(?:xRobotsTag|contentSecurityPolicyMode)\\s*:/, label: \"the xRobotsTag or contentSecurityPolicyMode header option\" },\n { pattern: /\\bleadDiagnostics\\s*:/, label: \"the leadDiagnostics flag (lead diagnostics are always sent)\" },\n];\n\nfunction inspectPlatformReimplementation(context: StaticRuleContext) {\n if (context.source.files.length === 0) return;\n const reimplementation = \"brandlab-source-platform-reimplementation\";\n const retired = \"brandlab-source-retired-api\";\n recordEvaluation(context.evaluations, \"source\", reimplementation, retired);\n for (const file of context.source.files) {\n const declared = declaredProtectedNames(file);\n if (declared) {\n context.findings.push(staticFinding({\n ruleId: reimplementation,\n surface: \"source\",\n path: file.path,\n line: declared.line,\n expected: \"Protected Brandlab platform surfaces are imported from the shared packages\",\n actual: `${declared.name} is declared locally instead of imported from the shared packages.`,\n remediation: `Import ${declared.name} from @brandlab-digital/site-core or site-next and remove the local copy.`,\n }));\n }\n for (const api of RETIRED_SOURCE_APIS) {\n const match = file.executable.match(api.pattern);\n if (!match || match.index === undefined) continue;\n context.findings.push(staticFinding({\n ruleId: retired,\n surface: \"source\",\n path: file.path,\n line: lineAt(file.text, match.index),\n expected: \"Only current 3.0 platform APIs\",\n actual: `The project still uses ${api.label}, which 3.0 removed.`,\n remediation: \"Migrate the caller to the current shared API and delete the retired path.\",\n }));\n }\n }\n}\n\nfunction declaredProtectedNames(file: BrandlabSourceFile): { name: string; line: number } | null {\n const source = parseBrandlabSourceFile(file);\n for (const statement of source.statements) {\n const names: { name: string; node: ts.Node }[] = [];\n if ((ts.isFunctionDeclaration(statement) || ts.isClassDeclaration(statement)) && statement.name) {\n names.push({ name: statement.name.text, node: statement.name });\n } else if (ts.isVariableStatement(statement)) {\n for (const declaration of statement.declarationList.declarations) {\n if (ts.isIdentifier(declaration.name)) names.push({ name: declaration.name.text, node: declaration.name });\n }\n }\n const protectedName = names.find(({ name }) => PROTECTED_PLATFORM_NAMES.has(name));\n if (protectedName) return { name: protectedName.name, line: lineOfNode(file, protectedName.node) };\n }\n return null;\n}\n\n/** Project configuration keys removed in 3.0.0. */\nconst RETIRED_CONFIG_KEYS: readonly { pattern: RegExp; key: string; label: string; remediation: string }[] = [\n {\n pattern: /\\broutes\\s*:\\s*\\{[^{}]*\\baliases\\s*:/,\n key: \"aliases\",\n label: \"routes.aliases\",\n remediation: \"Move each alias into the redirect table in src/data/redirects.ts.\",\n },\n {\n pattern: /\\bprofile\\s*:/,\n key: \"profile\",\n label: \"the profile field\",\n remediation: \"Delete the profile field; defineBrandlabProject rejects unknown keys.\",\n },\n];\n\nfunction inspectRetiredConfiguration(context: StaticRuleContext) {\n if (!context.config) return;\n const ruleId = \"brandlab-source-retired-api\";\n recordEvaluation(context.evaluations, \"source\", ruleId);\n const config = stripCommentsPreservingLayout(context.config);\n for (const retired of RETIRED_CONFIG_KEYS) {\n const match = config.match(retired.pattern);\n if (!match || match.index === undefined) continue;\n context.findings.push(staticFinding({\n ruleId,\n surface: \"source\",\n path: \"brandlab.config.ts\",\n line: lineAt(context.config, match.index + match[0].lastIndexOf(retired.key)),\n expected: \"Only current 3.0 platform APIs\",\n actual: `brandlab.config.ts still declares ${retired.label}, which 3.0 removed.`,\n remediation: retired.remediation,\n }));\n }\n}\n\n// --- structural: CI and deployment -------------------------------------------\n\nfunction inspectWorkflowPins(context: StaticRuleContext) {\n const directory = join(context.root, \".github/workflows\");\n if (!isDirectory(directory)) return;\n const workflows = readdirSync(directory).filter((name) => /\\.ya?ml$/.test(name)).sort();\n if (workflows.length === 0) return;\n const ruleId = \"brandlab-ci-workflow-pinned\";\n recordEvaluation(context.evaluations, \"project-verification\", ruleId);\n for (const name of workflows) {\n const path = `.github/workflows/${name}`;\n const text = readFileSync(join(context.root, path), \"utf8\");\n for (const match of text.matchAll(/^[ \\t]*-?[ \\t]*uses[ \\t]*:[ \\t]*['\"]?([^'\"\\s#]+)/gm)) {\n const reference = match[1]!;\n if (reference.startsWith(\"./\") || reference.startsWith(\"docker://\")) continue;\n if (/@[0-9a-f]{40}$/.test(reference)) continue;\n context.findings.push(staticFinding({\n ruleId,\n surface: \"project-verification\",\n path,\n line: lineAt(text, match.index ?? 0),\n expected: \"Every reused workflow and action pinned to a full 40-character commit SHA\",\n actual: `${reference} is not pinned to an immutable commit.`,\n remediation: \"Pin the reference to the fleet workflow SHA recorded in the control repo.\",\n }));\n }\n }\n}\n\nfunction inspectVercelIgnore(context: StaticRuleContext) {\n const text = readOptionalFile(join(context.root, \".vercelignore\"));\n if (text === null) return;\n const ruleId = \"brandlab-deployment-vercelignore-lockfile\";\n recordEvaluation(context.evaluations, \"deployment\", ruleId);\n const excluded = [\"package.json\", \"package-lock.json\"].filter((file) => isIgnored(text, file));\n if (excluded.length === 0) return;\n context.findings.push(staticFinding({\n ruleId,\n surface: \"deployment\",\n path: \".vercelignore\",\n expected: \".vercelignore never excludes package.json or package-lock.json\",\n actual: `.vercelignore excludes ${excluded.join(\" and \")}, so Vercel cannot install the exact locked release.`,\n remediation: \"Remove the package manifest and lockfile patterns from .vercelignore.\",\n }));\n}\n\n/** Evaluate gitignore-style patterns (last match wins) for a root-level file. */\nexport function isIgnored(patterns: string, file: string): boolean {\n let ignored = false;\n for (const rawLine of patterns.split(/\\r?\\n/)) {\n const line = rawLine.trim();\n if (!line || line.startsWith(\"#\")) continue;\n const negated = line.startsWith(\"!\");\n let pattern = negated ? line.slice(1) : line;\n if (pattern.endsWith(\"/\")) continue;\n pattern = pattern.replace(/^\\//, \"\").replace(/^\\*\\*\\//, \"\");\n if (pattern.includes(\"/\")) continue;\n if (globMatch(pattern, file)) ignored = !negated;\n }\n return ignored;\n}\n\n// --- shared helpers ----------------------------------------------------------\n\nexport interface ContactContractRecipient {\n path: string;\n line: number;\n /** The literal delivery.recipientEnv key, or null when it is not statically declared. */\n recipientEnv: string | null;\n}\n\n/** Every defineContactContract call and the recipient environment key it declares. */\nexport function findContactContractRecipients(\n source: BrandlabSourceIndex,\n): ContactContractRecipient[] {\n return source.files.flatMap((file) =>\n findImportedCalls(file, SITE_CORE(\"contact\"), \"defineContactContract\").map((call) => ({\n path: file.path,\n line: lineOfNode(file, call),\n recipientEnv: stringLiteralValue(\n objectPropertyValue(objectPropertyValue(call.arguments[0], \"delivery\"), \"recipientEnv\"),\n ),\n })),\n );\n}\n\n/** Framework route file candidates under src/app, then a legacy root app/. */\nfunction routeCandidates(name: string): string[] {\n return [\"src/app\", \"app\"].flatMap((directory) =>\n SOURCE_EXTENSIONS.map((extension) => posix.join(directory, `${name}.${extension}`)));\n}\n\nfunction firstExisting(context: StaticRuleContext, candidates: readonly string[]): string | null {\n return candidates.find((path) => context.source.byPath.has(path) || existsSync(join(context.root, path))) ?? null;\n}\n\nfunction localImports(\n context: StaticRuleContext,\n resolver: BrandlabModuleResolver,\n file: BrandlabSourceFile,\n): BrandlabSourceFile[] {\n return listModuleReferences(file)\n .filter((reference) => !reference.typeOnly)\n .flatMap((reference) => {\n const resolved = resolver(file.path, reference.specifier);\n const target = resolved ? context.source.byPath.get(resolved) : undefined;\n return target ? [target] : [];\n });\n}\n\n/** Names a module exports, including `export { local as POST }` forms. */\nexport function exportedNames(file: BrandlabSourceFile): Set<string> {\n const names = new Set<string>();\n for (const statement of parseBrandlabSourceFile(file).statements) {\n const exported = ts.canHaveModifiers(statement) &&\n ts.getModifiers(statement)?.some((modifier) => modifier.kind === ts.SyntaxKind.ExportKeyword);\n if (exported && (ts.isFunctionDeclaration(statement) || ts.isClassDeclaration(statement)) && statement.name) {\n names.add(statement.name.text);\n } else if (exported && ts.isVariableStatement(statement)) {\n for (const declaration of statement.declarationList.declarations) {\n if (ts.isIdentifier(declaration.name)) names.add(declaration.name.text);\n }\n } else if (ts.isExportDeclaration(statement) && statement.exportClause && ts.isNamedExports(statement.exportClause)) {\n for (const element of statement.exportClause.elements) names.add(element.name.text);\n }\n }\n return names;\n}\n\nfunction readOptionalFile(path: string): string | null {\n return existsSync(path) ? readFileSync(path, \"utf8\") : null;\n}\n"]}
@@ -260,7 +260,7 @@ export function checkForRule(rule) {
260
260
  : "contact-runtime";
261
261
  }
262
262
  if (surface === "analytics") {
263
- return /\b(?:pii|privacy|email|phone-number|lead-diagnostic|public-env)\b/i.test(id)
263
+ return /\b(?:pii|privacy|consent|email|phone-number|lead-diagnostic|public-env)\b/i.test(id)
264
264
  ? "analytics-privacy"
265
265
  : "analytics-conversion";
266
266
  }
@@ -1 +1 @@
1
- {"version":3,"file":"verification-policy.js","sourceRoot":"","sources":["../src/verification-policy.ts"],"names":[],"mappings":"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","sourcesContent":["import type { BrandlabFinding, ConformanceSummary } from \"./project.js\";\n\nexport const BRANDLAB_VERIFICATION_POLICY_VERSION = \"simple-v2\";\n\nexport const BRANDLAB_VERIFICATION_FAMILIES = [\n {\n id: \"runtime-release\",\n title: \"Runtime and release\",\n purpose: \"Supported runtime and one reproducible Brandlab release.\",\n },\n {\n id: \"project-verification\",\n title: \"Project verification\",\n purpose: \"Typecheck, tests and production build complete successfully.\",\n },\n {\n id: \"contact-delivery\",\n title: \"Contact delivery\",\n purpose: \"Shared validation, delivery and provider-error handling.\",\n },\n {\n id: \"analytics\",\n title: \"Analytics\",\n purpose: \"Current events run once without lead PII; only accepted enquiries are conversions.\",\n },\n {\n id: \"search-output\",\n title: \"Search output\",\n purpose: \"Search routing and structured data are safe and consistent.\",\n },\n {\n id: \"business-data\",\n title: \"Business data\",\n purpose: \"Business visibility and route identity match declared facts.\",\n },\n {\n id: \"output-safety\",\n title: \"Output safety\",\n purpose: \"Public output and protected shared behaviour remain safe.\",\n },\n {\n id: \"accessibility\",\n title: \"Accessibility\",\n purpose: \"Representative browser routes have no serious accessibility failures.\",\n },\n {\n id: \"deployment-provenance\",\n title: \"Deployment provenance\",\n purpose: \"The reviewed source, package release and deployment agree.\",\n },\n] as const;\n\nexport type BrandlabVerificationFamilyId =\n (typeof BRANDLAB_VERIFICATION_FAMILIES)[number][\"id\"];\n\nexport const BRANDLAB_VERIFICATION_CHECKS = [\n {\n id: \"runtime-supported\",\n familyId: \"runtime-release\",\n title: \"Supported runtime\",\n staticEvidence: true,\n },\n {\n id: \"release-consistency\",\n familyId: \"runtime-release\",\n title: \"Release consistency\",\n staticEvidence: true,\n },\n {\n id: \"project-build\",\n familyId: \"project-verification\",\n title: \"Typecheck, tests and build\",\n staticEvidence: false,\n },\n {\n id: \"contact-runtime\",\n familyId: \"contact-delivery\",\n title: \"Shared contact runtime\",\n staticEvidence: true,\n },\n {\n id: \"contact-provider-errors\",\n familyId: \"contact-delivery\",\n title: \"Provider error handling\",\n staticEvidence: true,\n },\n {\n id: \"analytics-privacy\",\n familyId: \"analytics\",\n title: \"Analytics privacy\",\n staticEvidence: true,\n },\n {\n id: \"analytics-conversion\",\n familyId: \"analytics\",\n title: \"Current analytics events\",\n staticEvidence: true,\n },\n {\n id: \"search-routing\",\n familyId: \"search-output\",\n title: \"Canonical, robots and sitemap\",\n staticEvidence: true,\n },\n {\n id: \"structured-data\",\n familyId: \"search-output\",\n title: \"Structured data\",\n staticEvidence: true,\n },\n {\n id: \"business-identity\",\n familyId: \"business-data\",\n title: \"Business visibility\",\n staticEvidence: true,\n },\n {\n id: \"route-identity\",\n familyId: \"business-data\",\n title: \"Route identity\",\n staticEvidence: true,\n },\n {\n id: \"public-output-safety\",\n familyId: \"output-safety\",\n title: \"Public output hygiene\",\n staticEvidence: true,\n },\n {\n id: \"source-safety\",\n familyId: \"output-safety\",\n title: \"Protected source behaviour\",\n staticEvidence: true,\n },\n {\n id: \"browser-accessibility\",\n familyId: \"accessibility\",\n title: \"Browser accessibility\",\n staticEvidence: false,\n },\n {\n id: \"deployment-binding\",\n familyId: \"deployment-provenance\",\n title: \"Deployment binding\",\n staticEvidence: false,\n },\n] as const;\n\nexport type BrandlabVerificationCheckId =\n (typeof BRANDLAB_VERIFICATION_CHECKS)[number][\"id\"];\nexport type BrandlabVerificationStatus =\n | \"pass\"\n | \"warning\"\n | \"blocked\"\n | \"not_run\";\nexport type BrandlabVerificationEvidenceKind =\n | \"static\"\n | \"test\"\n | \"build\"\n | \"browser\"\n | \"deployment\";\n\nexport interface BrandlabVerificationEvidence {\n checkId: BrandlabVerificationCheckId;\n status: BrandlabVerificationStatus;\n evidenceKind: BrandlabVerificationEvidenceKind;\n message: string;\n sourceRuleIds: string[];\n}\n\n/** A static rule that ran against the project, whether or not it found a problem. */\nexport interface BrandlabRuleEvaluation {\n ruleId: string;\n surface: string;\n}\n\nexport interface BrandlabOperationalFinding extends BrandlabFinding {\n familyId: BrandlabVerificationFamilyId;\n checkId: BrandlabVerificationCheckId;\n}\n\nexport interface BrandlabVerificationCheckResult\n extends BrandlabVerificationEvidence {\n title: string;\n /** Static rules that evaluated this check; a static pass requires at least one. */\n evaluatedRuleIds: string[];\n blockers: number;\n warnings: number;\n info: number;\n}\n\nexport interface BrandlabVerificationFamilyResult {\n id: BrandlabVerificationFamilyId;\n title: string;\n purpose: string;\n status: BrandlabVerificationStatus;\n blockers: number;\n warnings: number;\n info: number;\n sourceRuleIds: string[];\n checkIds: BrandlabVerificationCheckId[];\n}\n\nexport interface BrandlabVerificationResult {\n policyVersion: typeof BRANDLAB_VERIFICATION_POLICY_VERSION;\n familyCount: typeof BRANDLAB_VERIFICATION_FAMILIES.length;\n checkCount: typeof BRANDLAB_VERIFICATION_CHECKS.length;\n status: BrandlabVerificationStatus;\n summary: ConformanceSummary;\n checks: BrandlabVerificationCheckResult[];\n families: BrandlabVerificationFamilyResult[];\n}\n\nexport function applyBrandlabVerificationPolicy(\n findings: readonly BrandlabFinding[],\n suppliedEvidence: readonly BrandlabVerificationEvidence[] = [],\n evaluations: readonly BrandlabRuleEvaluation[] = [],\n): {\n operationalFindings: BrandlabOperationalFinding[];\n verification: BrandlabVerificationResult;\n} {\n const operationalFindings = findings.map((finding) => {\n const checkId = checkForRule(finding);\n const familyId = familyForCheck(checkId);\n return { ...finding, familyId, checkId };\n });\n const evaluatedChecks = evaluations.map((evaluation) => ({\n ruleId: evaluation.ruleId,\n checkId: checkForRule(evaluation),\n }));\n\n const checks = BRANDLAB_VERIFICATION_CHECKS.map((definition) => {\n const scopedFindings = operationalFindings.filter(\n (finding) => finding.checkId === definition.id,\n );\n const scopedEvidence = suppliedEvidence.filter(\n (evidence) => evidence.checkId === definition.id,\n );\n const blockers =\n scopedFindings.filter((finding) => finding.severity === \"blocker\").length +\n scopedEvidence.filter((evidence) => evidence.status === \"blocked\").length;\n const warnings =\n scopedFindings.filter((finding) => finding.severity === \"warning\").length +\n scopedEvidence.filter((evidence) => evidence.status === \"warning\").length;\n const info = scopedFindings.filter((finding) => finding.severity === \"info\").length;\n const evaluatedRuleIds = [\n ...new Set([\n ...scopedFindings.map((finding) => finding.ruleId),\n ...evaluatedChecks\n .filter((evaluation) => evaluation.checkId === definition.id)\n .map((evaluation) => evaluation.ruleId),\n ]),\n ].sort();\n // Static evidence counts only when a rule actually ran; an empty project\n // surface stays not_run instead of passing by default.\n const staticPass = definition.staticEvidence && evaluatedRuleIds.length > 0;\n const sourceRuleIds = [\n ...new Set([\n ...scopedFindings.map((finding) => finding.ruleId),\n ...scopedEvidence.flatMap((evidence) => evidence.sourceRuleIds),\n ]),\n ].sort();\n const status: BrandlabVerificationStatus =\n blockers > 0\n ? \"blocked\"\n : warnings > 0\n ? \"warning\"\n : staticPass ||\n scopedEvidence.some((evidence) => evidence.status === \"pass\")\n ? \"pass\"\n : \"not_run\";\n const evidenceKind =\n scopedEvidence.at(-1)?.evidenceKind ??\n (definition.staticEvidence ? \"static\" : expectedEvidenceKind(definition.id));\n const message =\n blockers > 0\n ? `${blockers} blocking finding(s).`\n : warnings > 0\n ? `${warnings} warning finding(s).`\n : scopedEvidence.at(-1)?.message ??\n (staticPass\n ? `${evaluatedRuleIds.length} static rule(s) evaluated this check without an operational finding.`\n : definition.staticEvidence\n ? \"No static rule applied to this project, so this check was not run.\"\n : \"This check was not executed by the static evaluator.\");\n\n return {\n checkId: definition.id,\n title: definition.title,\n status,\n evidenceKind,\n message,\n sourceRuleIds,\n evaluatedRuleIds,\n blockers,\n warnings,\n info,\n } satisfies BrandlabVerificationCheckResult;\n });\n\n const families = BRANDLAB_VERIFICATION_FAMILIES.map((definition) => {\n const scoped = checks.filter((check) =>\n BRANDLAB_VERIFICATION_CHECKS.some(\n (candidate) =>\n candidate.id === check.checkId && candidate.familyId === definition.id,\n ),\n );\n const blockers = scoped.reduce((total, check) => total + check.blockers, 0);\n const warnings = scoped.reduce((total, check) => total + check.warnings, 0);\n const info = scoped.reduce((total, check) => total + check.info, 0);\n return {\n ...definition,\n status: aggregateStatus(scoped.map((check) => check.status)),\n blockers,\n warnings,\n info,\n sourceRuleIds: [...new Set(scoped.flatMap((check) => check.sourceRuleIds))].sort(),\n checkIds: scoped.map((check) => check.checkId),\n } satisfies BrandlabVerificationFamilyResult;\n });\n\n const summary = summarizeVerificationFindings(operationalFindings);\n\n return {\n operationalFindings,\n verification: {\n policyVersion: BRANDLAB_VERIFICATION_POLICY_VERSION,\n familyCount: BRANDLAB_VERIFICATION_FAMILIES.length,\n checkCount: BRANDLAB_VERIFICATION_CHECKS.length,\n status: aggregateStatus(families.map((family) => family.status)),\n summary,\n checks,\n families,\n },\n };\n}\n\nfunction familyForCheck(\n checkId: BrandlabVerificationCheckId,\n): BrandlabVerificationFamilyId {\n return BRANDLAB_VERIFICATION_CHECKS.find((check) => check.id === checkId)!\n .familyId;\n}\n\n/** The one operational check a rule (finding or evaluation) belongs to. */\nexport function checkForRule(\n rule: Pick<BrandlabFinding, \"ruleId\" | \"surface\">,\n): BrandlabVerificationCheckId {\n const id = rule.ruleId;\n const surface = rule.surface;\n\n if (surface === \"release\") return \"release-consistency\";\n if (\n surface === \"runtime\" ||\n surface === \"headers\" ||\n surface === \"security\" ||\n surface === \"environment\"\n ) {\n return \"runtime-supported\";\n }\n if (surface === \"project-verification\" || surface === \"build\") {\n return \"project-build\";\n }\n if (surface.startsWith(\"contact\")) {\n return /(?:provider|resend|returned-error|delivery-error)/i.test(id)\n ? \"contact-provider-errors\"\n : \"contact-runtime\";\n }\n if (surface === \"analytics\") {\n return /\\b(?:pii|privacy|email|phone-number|lead-diagnostic|public-env)\\b/i.test(id)\n ? \"analytics-privacy\"\n : \"analytics-conversion\";\n }\n if (\n surface === \"metadata\" ||\n surface === \"sitemap\" ||\n surface === \"sitemap-catalog\" ||\n surface === \"robots\" ||\n surface === \"breadcrumbs\" ||\n surface === \"search-certification\"\n ) {\n return \"search-routing\";\n }\n if (\n surface === \"schema\" ||\n surface === \"schema-graph\" ||\n surface === \"reviews\" ||\n surface === \"project-reviews\" ||\n surface.startsWith(\"google-reviews\")\n ) {\n return \"structured-data\";\n }\n if (surface === \"business\" || surface === \"location-proof\") {\n return \"business-identity\";\n }\n if (surface === \"routes\") return \"route-identity\";\n if (surface === \"accessibility\") return \"browser-accessibility\";\n if (surface === \"deployment\") return \"deployment-binding\";\n if (\n surface === \"content\" ||\n surface === \"location-quality\" ||\n id.includes(\"rendered-content\")\n ) {\n return \"public-output-safety\";\n }\n return \"source-safety\";\n}\n\nfunction expectedEvidenceKind(\n checkId: BrandlabVerificationCheckId,\n): BrandlabVerificationEvidenceKind {\n if (checkId === \"project-build\") return \"build\";\n if (checkId === \"browser-accessibility\") return \"browser\";\n if (checkId === \"deployment-binding\") return \"deployment\";\n return \"static\";\n}\n\nfunction aggregateStatus(\n statuses: readonly BrandlabVerificationStatus[],\n): BrandlabVerificationStatus {\n if (statuses.includes(\"blocked\")) return \"blocked\";\n if (statuses.includes(\"warning\")) return \"warning\";\n if (statuses.includes(\"not_run\")) return \"not_run\";\n return \"pass\";\n}\n\nexport function summarizeVerificationFindings(\n findings: readonly BrandlabFinding[],\n): ConformanceSummary {\n const blockers = findings.filter((finding) => finding.severity === \"blocker\").length;\n const warnings = findings.filter((finding) => finding.severity === \"warning\").length;\n const info = findings.filter((finding) => finding.severity === \"info\").length;\n return {\n status: blockers > 0 ? \"blocked\" : warnings > 0 ? \"warning\" : \"pass\",\n total: findings.length,\n blockers,\n warnings,\n info,\n };\n}\n"]}
1
+ {"version":3,"file":"verification-policy.js","sourceRoot":"","sources":["../src/verification-policy.ts"],"names":[],"mappings":"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","sourcesContent":["import type { BrandlabFinding, ConformanceSummary } from \"./project.js\";\n\nexport const BRANDLAB_VERIFICATION_POLICY_VERSION = \"simple-v2\";\n\nexport const BRANDLAB_VERIFICATION_FAMILIES = [\n {\n id: \"runtime-release\",\n title: \"Runtime and release\",\n purpose: \"Supported runtime and one reproducible Brandlab release.\",\n },\n {\n id: \"project-verification\",\n title: \"Project verification\",\n purpose: \"Typecheck, tests and production build complete successfully.\",\n },\n {\n id: \"contact-delivery\",\n title: \"Contact delivery\",\n purpose: \"Shared validation, delivery and provider-error handling.\",\n },\n {\n id: \"analytics\",\n title: \"Analytics\",\n purpose: \"Current events run once without lead PII; only accepted enquiries are conversions.\",\n },\n {\n id: \"search-output\",\n title: \"Search output\",\n purpose: \"Search routing and structured data are safe and consistent.\",\n },\n {\n id: \"business-data\",\n title: \"Business data\",\n purpose: \"Business visibility and route identity match declared facts.\",\n },\n {\n id: \"output-safety\",\n title: \"Output safety\",\n purpose: \"Public output and protected shared behaviour remain safe.\",\n },\n {\n id: \"accessibility\",\n title: \"Accessibility\",\n purpose: \"Representative browser routes have no serious accessibility failures.\",\n },\n {\n id: \"deployment-provenance\",\n title: \"Deployment provenance\",\n purpose: \"The reviewed source, package release and deployment agree.\",\n },\n] as const;\n\nexport type BrandlabVerificationFamilyId =\n (typeof BRANDLAB_VERIFICATION_FAMILIES)[number][\"id\"];\n\nexport const BRANDLAB_VERIFICATION_CHECKS = [\n {\n id: \"runtime-supported\",\n familyId: \"runtime-release\",\n title: \"Supported runtime\",\n staticEvidence: true,\n },\n {\n id: \"release-consistency\",\n familyId: \"runtime-release\",\n title: \"Release consistency\",\n staticEvidence: true,\n },\n {\n id: \"project-build\",\n familyId: \"project-verification\",\n title: \"Typecheck, tests and build\",\n staticEvidence: false,\n },\n {\n id: \"contact-runtime\",\n familyId: \"contact-delivery\",\n title: \"Shared contact runtime\",\n staticEvidence: true,\n },\n {\n id: \"contact-provider-errors\",\n familyId: \"contact-delivery\",\n title: \"Provider error handling\",\n staticEvidence: true,\n },\n {\n id: \"analytics-privacy\",\n familyId: \"analytics\",\n title: \"Analytics privacy\",\n staticEvidence: true,\n },\n {\n id: \"analytics-conversion\",\n familyId: \"analytics\",\n title: \"Current analytics events\",\n staticEvidence: true,\n },\n {\n id: \"search-routing\",\n familyId: \"search-output\",\n title: \"Canonical, robots and sitemap\",\n staticEvidence: true,\n },\n {\n id: \"structured-data\",\n familyId: \"search-output\",\n title: \"Structured data\",\n staticEvidence: true,\n },\n {\n id: \"business-identity\",\n familyId: \"business-data\",\n title: \"Business visibility\",\n staticEvidence: true,\n },\n {\n id: \"route-identity\",\n familyId: \"business-data\",\n title: \"Route identity\",\n staticEvidence: true,\n },\n {\n id: \"public-output-safety\",\n familyId: \"output-safety\",\n title: \"Public output hygiene\",\n staticEvidence: true,\n },\n {\n id: \"source-safety\",\n familyId: \"output-safety\",\n title: \"Protected source behaviour\",\n staticEvidence: true,\n },\n {\n id: \"browser-accessibility\",\n familyId: \"accessibility\",\n title: \"Browser accessibility\",\n staticEvidence: false,\n },\n {\n id: \"deployment-binding\",\n familyId: \"deployment-provenance\",\n title: \"Deployment binding\",\n staticEvidence: false,\n },\n] as const;\n\nexport type BrandlabVerificationCheckId =\n (typeof BRANDLAB_VERIFICATION_CHECKS)[number][\"id\"];\nexport type BrandlabVerificationStatus =\n | \"pass\"\n | \"warning\"\n | \"blocked\"\n | \"not_run\";\nexport type BrandlabVerificationEvidenceKind =\n | \"static\"\n | \"test\"\n | \"build\"\n | \"browser\"\n | \"deployment\";\n\nexport interface BrandlabVerificationEvidence {\n checkId: BrandlabVerificationCheckId;\n status: BrandlabVerificationStatus;\n evidenceKind: BrandlabVerificationEvidenceKind;\n message: string;\n sourceRuleIds: string[];\n}\n\n/** A static rule that ran against the project, whether or not it found a problem. */\nexport interface BrandlabRuleEvaluation {\n ruleId: string;\n surface: string;\n}\n\nexport interface BrandlabOperationalFinding extends BrandlabFinding {\n familyId: BrandlabVerificationFamilyId;\n checkId: BrandlabVerificationCheckId;\n}\n\nexport interface BrandlabVerificationCheckResult\n extends BrandlabVerificationEvidence {\n title: string;\n /** Static rules that evaluated this check; a static pass requires at least one. */\n evaluatedRuleIds: string[];\n blockers: number;\n warnings: number;\n info: number;\n}\n\nexport interface BrandlabVerificationFamilyResult {\n id: BrandlabVerificationFamilyId;\n title: string;\n purpose: string;\n status: BrandlabVerificationStatus;\n blockers: number;\n warnings: number;\n info: number;\n sourceRuleIds: string[];\n checkIds: BrandlabVerificationCheckId[];\n}\n\nexport interface BrandlabVerificationResult {\n policyVersion: typeof BRANDLAB_VERIFICATION_POLICY_VERSION;\n familyCount: typeof BRANDLAB_VERIFICATION_FAMILIES.length;\n checkCount: typeof BRANDLAB_VERIFICATION_CHECKS.length;\n status: BrandlabVerificationStatus;\n summary: ConformanceSummary;\n checks: BrandlabVerificationCheckResult[];\n families: BrandlabVerificationFamilyResult[];\n}\n\nexport function applyBrandlabVerificationPolicy(\n findings: readonly BrandlabFinding[],\n suppliedEvidence: readonly BrandlabVerificationEvidence[] = [],\n evaluations: readonly BrandlabRuleEvaluation[] = [],\n): {\n operationalFindings: BrandlabOperationalFinding[];\n verification: BrandlabVerificationResult;\n} {\n const operationalFindings = findings.map((finding) => {\n const checkId = checkForRule(finding);\n const familyId = familyForCheck(checkId);\n return { ...finding, familyId, checkId };\n });\n const evaluatedChecks = evaluations.map((evaluation) => ({\n ruleId: evaluation.ruleId,\n checkId: checkForRule(evaluation),\n }));\n\n const checks = BRANDLAB_VERIFICATION_CHECKS.map((definition) => {\n const scopedFindings = operationalFindings.filter(\n (finding) => finding.checkId === definition.id,\n );\n const scopedEvidence = suppliedEvidence.filter(\n (evidence) => evidence.checkId === definition.id,\n );\n const blockers =\n scopedFindings.filter((finding) => finding.severity === \"blocker\").length +\n scopedEvidence.filter((evidence) => evidence.status === \"blocked\").length;\n const warnings =\n scopedFindings.filter((finding) => finding.severity === \"warning\").length +\n scopedEvidence.filter((evidence) => evidence.status === \"warning\").length;\n const info = scopedFindings.filter((finding) => finding.severity === \"info\").length;\n const evaluatedRuleIds = [\n ...new Set([\n ...scopedFindings.map((finding) => finding.ruleId),\n ...evaluatedChecks\n .filter((evaluation) => evaluation.checkId === definition.id)\n .map((evaluation) => evaluation.ruleId),\n ]),\n ].sort();\n // Static evidence counts only when a rule actually ran; an empty project\n // surface stays not_run instead of passing by default.\n const staticPass = definition.staticEvidence && evaluatedRuleIds.length > 0;\n const sourceRuleIds = [\n ...new Set([\n ...scopedFindings.map((finding) => finding.ruleId),\n ...scopedEvidence.flatMap((evidence) => evidence.sourceRuleIds),\n ]),\n ].sort();\n const status: BrandlabVerificationStatus =\n blockers > 0\n ? \"blocked\"\n : warnings > 0\n ? \"warning\"\n : staticPass ||\n scopedEvidence.some((evidence) => evidence.status === \"pass\")\n ? \"pass\"\n : \"not_run\";\n const evidenceKind =\n scopedEvidence.at(-1)?.evidenceKind ??\n (definition.staticEvidence ? \"static\" : expectedEvidenceKind(definition.id));\n const message =\n blockers > 0\n ? `${blockers} blocking finding(s).`\n : warnings > 0\n ? `${warnings} warning finding(s).`\n : scopedEvidence.at(-1)?.message ??\n (staticPass\n ? `${evaluatedRuleIds.length} static rule(s) evaluated this check without an operational finding.`\n : definition.staticEvidence\n ? \"No static rule applied to this project, so this check was not run.\"\n : \"This check was not executed by the static evaluator.\");\n\n return {\n checkId: definition.id,\n title: definition.title,\n status,\n evidenceKind,\n message,\n sourceRuleIds,\n evaluatedRuleIds,\n blockers,\n warnings,\n info,\n } satisfies BrandlabVerificationCheckResult;\n });\n\n const families = BRANDLAB_VERIFICATION_FAMILIES.map((definition) => {\n const scoped = checks.filter((check) =>\n BRANDLAB_VERIFICATION_CHECKS.some(\n (candidate) =>\n candidate.id === check.checkId && candidate.familyId === definition.id,\n ),\n );\n const blockers = scoped.reduce((total, check) => total + check.blockers, 0);\n const warnings = scoped.reduce((total, check) => total + check.warnings, 0);\n const info = scoped.reduce((total, check) => total + check.info, 0);\n return {\n ...definition,\n status: aggregateStatus(scoped.map((check) => check.status)),\n blockers,\n warnings,\n info,\n sourceRuleIds: [...new Set(scoped.flatMap((check) => check.sourceRuleIds))].sort(),\n checkIds: scoped.map((check) => check.checkId),\n } satisfies BrandlabVerificationFamilyResult;\n });\n\n const summary = summarizeVerificationFindings(operationalFindings);\n\n return {\n operationalFindings,\n verification: {\n policyVersion: BRANDLAB_VERIFICATION_POLICY_VERSION,\n familyCount: BRANDLAB_VERIFICATION_FAMILIES.length,\n checkCount: BRANDLAB_VERIFICATION_CHECKS.length,\n status: aggregateStatus(families.map((family) => family.status)),\n summary,\n checks,\n families,\n },\n };\n}\n\nfunction familyForCheck(\n checkId: BrandlabVerificationCheckId,\n): BrandlabVerificationFamilyId {\n return BRANDLAB_VERIFICATION_CHECKS.find((check) => check.id === checkId)!\n .familyId;\n}\n\n/** The one operational check a rule (finding or evaluation) belongs to. */\nexport function checkForRule(\n rule: Pick<BrandlabFinding, \"ruleId\" | \"surface\">,\n): BrandlabVerificationCheckId {\n const id = rule.ruleId;\n const surface = rule.surface;\n\n if (surface === \"release\") return \"release-consistency\";\n if (\n surface === \"runtime\" ||\n surface === \"headers\" ||\n surface === \"security\" ||\n surface === \"environment\"\n ) {\n return \"runtime-supported\";\n }\n if (surface === \"project-verification\" || surface === \"build\") {\n return \"project-build\";\n }\n if (surface.startsWith(\"contact\")) {\n return /(?:provider|resend|returned-error|delivery-error)/i.test(id)\n ? \"contact-provider-errors\"\n : \"contact-runtime\";\n }\n if (surface === \"analytics\") {\n return /\\b(?:pii|privacy|consent|email|phone-number|lead-diagnostic|public-env)\\b/i.test(id)\n ? \"analytics-privacy\"\n : \"analytics-conversion\";\n }\n if (\n surface === \"metadata\" ||\n surface === \"sitemap\" ||\n surface === \"sitemap-catalog\" ||\n surface === \"robots\" ||\n surface === \"breadcrumbs\" ||\n surface === \"search-certification\"\n ) {\n return \"search-routing\";\n }\n if (\n surface === \"schema\" ||\n surface === \"schema-graph\" ||\n surface === \"reviews\" ||\n surface === \"project-reviews\" ||\n surface.startsWith(\"google-reviews\")\n ) {\n return \"structured-data\";\n }\n if (surface === \"business\" || surface === \"location-proof\") {\n return \"business-identity\";\n }\n if (surface === \"routes\") return \"route-identity\";\n if (surface === \"accessibility\") return \"browser-accessibility\";\n if (surface === \"deployment\") return \"deployment-binding\";\n if (\n surface === \"content\" ||\n surface === \"location-quality\" ||\n id.includes(\"rendered-content\")\n ) {\n return \"public-output-safety\";\n }\n return \"source-safety\";\n}\n\nfunction expectedEvidenceKind(\n checkId: BrandlabVerificationCheckId,\n): BrandlabVerificationEvidenceKind {\n if (checkId === \"project-build\") return \"build\";\n if (checkId === \"browser-accessibility\") return \"browser\";\n if (checkId === \"deployment-binding\") return \"deployment\";\n return \"static\";\n}\n\nfunction aggregateStatus(\n statuses: readonly BrandlabVerificationStatus[],\n): BrandlabVerificationStatus {\n if (statuses.includes(\"blocked\")) return \"blocked\";\n if (statuses.includes(\"warning\")) return \"warning\";\n if (statuses.includes(\"not_run\")) return \"not_run\";\n return \"pass\";\n}\n\nexport function summarizeVerificationFindings(\n findings: readonly BrandlabFinding[],\n): ConformanceSummary {\n const blockers = findings.filter((finding) => finding.severity === \"blocker\").length;\n const warnings = findings.filter((finding) => finding.severity === \"warning\").length;\n const info = findings.filter((finding) => finding.severity === \"info\").length;\n return {\n status: blockers > 0 ? \"blocked\" : warnings > 0 ? \"warning\" : \"pass\",\n total: findings.length,\n blockers,\n warnings,\n info,\n };\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "name": "@brandlab-digital/conformance",
3
- "version": "3.2.1",
3
+ "version": "3.3.1",
4
+ "license": "UNLICENSED",
4
5
  "repository": {
5
6
  "type": "git",
6
7
  "url": "git+https://github.com/RomieDandan/brandlab.git",
@@ -15,6 +16,9 @@
15
16
  "files": [
16
17
  "dist"
17
18
  ],
19
+ "publishConfig": {
20
+ "access": "public"
21
+ },
18
22
  "scripts": {
19
23
  "build": "rm -rf dist && tsc -p tsconfig.json && chmod +x dist/cli.js",
20
24
  "test": "vitest run",