@brandlab-digital/conformance 3.8.0 → 3.10.0

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.
Files changed (99) hide show
  1. package/dist/current-release.js +5 -5
  2. package/dist/current-release.js.map +1 -1
  3. package/dist/engineering.js +4 -2
  4. package/dist/engineering.js.map +1 -1
  5. package/dist/site-system/checks.d.ts +1 -1
  6. package/dist/site-system/checks.js +1 -1
  7. package/dist/site-system/checks.js.map +1 -1
  8. package/dist/site-system/rule-modules.d.ts.map +1 -1
  9. package/dist/site-system/rule-modules.js +22 -1
  10. package/dist/site-system/rule-modules.js.map +1 -1
  11. package/dist/site-system/rules/form/c11-contact-route.d.ts +5 -0
  12. package/dist/site-system/rules/form/c11-contact-route.d.ts.map +1 -0
  13. package/dist/site-system/rules/form/c11-contact-route.js +132 -0
  14. package/dist/site-system/rules/form/c11-contact-route.js.map +1 -0
  15. package/dist/site-system/rules/form/c7-thank-you.d.ts +20 -0
  16. package/dist/site-system/rules/form/c7-thank-you.d.ts.map +1 -0
  17. package/dist/site-system/rules/form/c7-thank-you.js +67 -0
  18. package/dist/site-system/rules/form/c7-thank-you.js.map +1 -0
  19. package/dist/site-system/rules/form/c8-forgiving-form.d.ts +19 -0
  20. package/dist/site-system/rules/form/c8-forgiving-form.d.ts.map +1 -0
  21. package/dist/site-system/rules/form/c8-forgiving-form.js +128 -0
  22. package/dist/site-system/rules/form/c8-forgiving-form.js.map +1 -0
  23. package/dist/site-system/rules/form/index.d.ts +14 -0
  24. package/dist/site-system/rules/form/index.d.ts.map +1 -0
  25. package/dist/site-system/rules/form/index.js +13 -0
  26. package/dist/site-system/rules/form/index.js.map +1 -0
  27. package/dist/site-system/rules/library/common.d.ts +36 -0
  28. package/dist/site-system/rules/library/common.d.ts.map +1 -0
  29. package/dist/site-system/rules/library/common.js +70 -0
  30. package/dist/site-system/rules/library/common.js.map +1 -0
  31. package/dist/site-system/rules/library/index.d.ts +16 -0
  32. package/dist/site-system/rules/library/index.d.ts.map +1 -0
  33. package/dist/site-system/rules/library/index.js +19 -0
  34. package/dist/site-system/rules/library/index.js.map +1 -0
  35. package/dist/site-system/rules/library/k1-shared-components.d.ts +29 -0
  36. package/dist/site-system/rules/library/k1-shared-components.d.ts.map +1 -0
  37. package/dist/site-system/rules/library/k1-shared-components.js +97 -0
  38. package/dist/site-system/rules/library/k1-shared-components.js.map +1 -0
  39. package/dist/site-system/rules/navigation/extract.d.ts +50 -0
  40. package/dist/site-system/rules/navigation/extract.d.ts.map +1 -0
  41. package/dist/site-system/rules/navigation/extract.js +220 -0
  42. package/dist/site-system/rules/navigation/extract.js.map +1 -0
  43. package/dist/site-system/rules/navigation/html.d.ts +23 -0
  44. package/dist/site-system/rules/navigation/html.d.ts.map +1 -0
  45. package/dist/site-system/rules/navigation/html.js +219 -0
  46. package/dist/site-system/rules/navigation/html.js.map +1 -0
  47. package/dist/site-system/rules/navigation/index.d.ts +37 -0
  48. package/dist/site-system/rules/navigation/index.d.ts.map +1 -0
  49. package/dist/site-system/rules/navigation/index.js +163 -0
  50. package/dist/site-system/rules/navigation/index.js.map +1 -0
  51. package/dist/site-system/rules/navigation/record.d.ts +8 -0
  52. package/dist/site-system/rules/navigation/record.d.ts.map +1 -0
  53. package/dist/site-system/rules/navigation/record.js +39 -0
  54. package/dist/site-system/rules/navigation/record.js.map +1 -0
  55. package/dist/site-system/rules/sections/exif.d.ts +22 -0
  56. package/dist/site-system/rules/sections/exif.d.ts.map +1 -0
  57. package/dist/site-system/rules/sections/exif.js +218 -0
  58. package/dist/site-system/rules/sections/exif.js.map +1 -0
  59. package/dist/site-system/rules/sections/images.d.ts +31 -0
  60. package/dist/site-system/rules/sections/images.d.ts.map +1 -0
  61. package/dist/site-system/rules/sections/images.js +96 -0
  62. package/dist/site-system/rules/sections/images.js.map +1 -0
  63. package/dist/site-system/rules/sections/index.d.ts +20 -0
  64. package/dist/site-system/rules/sections/index.d.ts.map +1 -0
  65. package/dist/site-system/rules/sections/index.js +34 -0
  66. package/dist/site-system/rules/sections/index.js.map +1 -0
  67. package/dist/site-system/rules/sections/k11-density.d.ts +23 -0
  68. package/dist/site-system/rules/sections/k11-density.d.ts.map +1 -0
  69. package/dist/site-system/rules/sections/k11-density.js +88 -0
  70. package/dist/site-system/rules/sections/k11-density.js.map +1 -0
  71. package/dist/site-system/rules/sections/k12-contact.d.ts +13 -0
  72. package/dist/site-system/rules/sections/k12-contact.d.ts.map +1 -0
  73. package/dist/site-system/rules/sections/k12-contact.js +70 -0
  74. package/dist/site-system/rules/sections/k12-contact.js.map +1 -0
  75. package/dist/site-system/rules/sections/k2-skin-coverage.d.ts +11 -0
  76. package/dist/site-system/rules/sections/k2-skin-coverage.d.ts.map +1 -0
  77. package/dist/site-system/rules/sections/k2-skin-coverage.js +126 -0
  78. package/dist/site-system/rules/sections/k2-skin-coverage.js.map +1 -0
  79. package/dist/site-system/rules/sections/n9-footer.d.ts +40 -0
  80. package/dist/site-system/rules/sections/n9-footer.d.ts.map +1 -0
  81. package/dist/site-system/rules/sections/n9-footer.js +186 -0
  82. package/dist/site-system/rules/sections/n9-footer.js.map +1 -0
  83. package/dist/site-system/rules/sections/t6-media-entries.d.ts +14 -0
  84. package/dist/site-system/rules/sections/t6-media-entries.d.ts.map +1 -0
  85. package/dist/site-system/rules/sections/t6-media-entries.js +96 -0
  86. package/dist/site-system/rules/sections/t6-media-entries.js.map +1 -0
  87. package/dist/site-system/rules/sections/t7-main-images.d.ts +13 -0
  88. package/dist/site-system/rules/sections/t7-main-images.d.ts.map +1 -0
  89. package/dist/site-system/rules/sections/t7-main-images.js +41 -0
  90. package/dist/site-system/rules/sections/t7-main-images.js.map +1 -0
  91. package/dist/site-system/rules/sections/t8-prices.d.ts +13 -0
  92. package/dist/site-system/rules/sections/t8-prices.d.ts.map +1 -0
  93. package/dist/site-system/rules/sections/t8-prices.js +92 -0
  94. package/dist/site-system/rules/sections/t8-prices.js.map +1 -0
  95. package/dist/site-system/rules/sections/t9-location-metadata.d.ts +3 -0
  96. package/dist/site-system/rules/sections/t9-location-metadata.d.ts.map +1 -0
  97. package/dist/site-system/rules/sections/t9-location-metadata.js +54 -0
  98. package/dist/site-system/rules/sections/t9-location-metadata.js.map +1 -0
  99. package/package.json +2 -2
@@ -23,19 +23,19 @@ 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.8.0"
26
+ "version": "3.10.0"
27
27
  },
28
28
  "@brandlab-digital/eslint-plugin": {
29
- "version": "3.8.0"
29
+ "version": "3.10.0"
30
30
  },
31
31
  "@brandlab-digital/site-core": {
32
- "version": "3.8.0"
32
+ "version": "3.10.0"
33
33
  },
34
34
  "@brandlab-digital/site-next": {
35
- "version": "3.8.0"
35
+ "version": "3.10.0"
36
36
  }
37
37
  },
38
- "releaseVersion": "3.8.0",
38
+ "releaseVersion": "3.10.0",
39
39
  "runtime": {
40
40
  "bundler": "turbopack",
41
41
  "cacheComponents": false,
@@ -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.8.0\"\n },\n \"@brandlab-digital/eslint-plugin\": {\n \"version\": \"3.8.0\"\n },\n \"@brandlab-digital/site-core\": {\n \"version\": \"3.8.0\"\n },\n \"@brandlab-digital/site-next\": {\n \"version\": \"3.8.0\"\n }\n },\n \"releaseVersion\": \"3.8.0\",\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"]}
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,QAAQ;SACpB;QACD,iCAAiC,EAAE;YACjC,SAAS,EAAE,QAAQ;SACpB;QACD,6BAA6B,EAAE;YAC7B,SAAS,EAAE,QAAQ;SACpB;QACD,6BAA6B,EAAE;YAC7B,SAAS,EAAE,QAAQ;SACpB;KACF;IACD,gBAAgB,EAAE,QAAQ;IAC1B,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.10.0\"\n },\n \"@brandlab-digital/eslint-plugin\": {\n \"version\": \"3.10.0\"\n },\n \"@brandlab-digital/site-core\": {\n \"version\": \"3.10.0\"\n },\n \"@brandlab-digital/site-next\": {\n \"version\": \"3.10.0\"\n }\n },\n \"releaseVersion\": \"3.10.0\",\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"]}
@@ -614,12 +614,14 @@ function inspectTests(root, capabilities, add) {
614
614
  }
615
615
  }
616
616
  // --- dev presets (section 4) -------------------------------------------------
617
+ /** The two accepted default exports: the plain preset, or the preset plus the Site System rules (same identifier twice). */
618
+ const ESLINT_PRESET_EXPORT = /export\s+default\s+(?:([A-Za-z_$][\w$]*)\.configs\.next|\[\s*\.\.\.\s*([A-Za-z_$][\w$]*)\.configs\.next\s*,\s*\2\.configs\[\s*(['"])site-system\3\s*\]\s*,?\s*\])\s*;?\s*$/;
617
619
  function inspectToolPresets(root, add) {
618
620
  const eslint = readOptional(join(root, 'eslint.config.mjs'));
619
621
  if (eslint === null)
620
622
  add('eslint.config.mjs', 'tool-preset', 'Add eslint.config.mjs: export default brandlab.configs.next.');
621
- else if (!/@brandlab-digital\/eslint-plugin/.test(eslint) || !/export\s+default\s+[A-Za-z_$][\w$]*\.configs\.next\s*;?\s*$/.test(eslint.trim())) {
622
- add('eslint.config.mjs', 'tool-preset', 'eslint.config.mjs is exactly `export default brandlab.configs.next` (imported from @brandlab-digital/eslint-plugin).');
623
+ else if (!/@brandlab-digital\/eslint-plugin/.test(eslint) || !ESLINT_PRESET_EXPORT.test(eslint.trim())) {
624
+ add('eslint.config.mjs', 'tool-preset', "eslint.config.mjs is exactly `export default brandlab.configs.next`, or, for a site that declares a siteSystem tier, `export default [...brandlab.configs.next, brandlab.configs['site-system']]` (imported from @brandlab-digital/eslint-plugin).");
623
625
  }
624
626
  const knip = readOptional(join(root, 'knip.ts'));
625
627
  if (knip === null)
@@ -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/**\n * The Vercel ignored build step of every Brandlab site (3.3.3). Exit 0 skips a deployment, anything else builds it:\n * a production deployment is skipped only when git shows every change since the last successful production\n * deployment is in .github/, docs/ or a root Markdown file. Previews, a redeploy of the same commit, a missing or\n * unknown previous commit and any git error all build. brandlab-migrate S10 writes the same command.\n */\nexport const BRANDLAB_VERCEL_IGNORE_COMMAND =\n `[ \"$VERCEL_ENV\" = production ] && [ \"$VERCEL_GIT_PREVIOUS_SHA\" != \"$VERCEL_GIT_COMMIT_SHA\" ] && git diff --quiet \"$VERCEL_GIT_PREVIOUS_SHA\" HEAD -- . ':!.github' ':!docs' ':(exclude,glob)*.md' && exit 0 || exit 1`;\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*\\(/;\nconst GEOGRAPHY_ENTRY = '@brandlab-digital/site-core/geography';\n/**\n * Package entries a browser bundle cannot resolve from 3.3.3 (their exports map `browser` to null): the geography\n * registries and website-location policies, which the location estate reads, and the server halves of contact and reviews\n * (3.5.0 adds the Business Profile reviews feed client).\n */\nconst SERVER_PACKAGE_ENTRIES: ReadonlyMap<string, string> = new Map([\n [GEOGRAPHY_ENTRY, 'The Brandlab geography registry and website-location policy (server data, about 190 KB)'],\n ['@brandlab-digital/site-next/contact/server', 'The contact route runtime'],\n ['@brandlab-digital/site-next/google-reviews/server', 'The Google reviews route runtime'],\n ['@brandlab-digital/site-next/google-business-reviews/server', 'The Business Profile reviews feed client (it reads the feed token)'],\n]);\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.) From 3.3.3 no module a client component\n * reaches imports the geography registry (site-core/geography, which the location\n * estate reads) or a package server entry: a browser bundle cannot resolve them.\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 serverEntry = listModuleReferences(file).find(reference => !reference.typeOnly && SERVER_PACKAGE_ENTRIES.has(reference.specifier));\n if (serverEntry) {\n add(path, 'client-bundle-boundary', `${SERVER_PACKAGE_ENTRIES.get(serverEntry.specifier)} reaches the browser (${chain(path)} → ${serverEntry.specifier}), and from 3.3.3 a browser bundle cannot resolve it, so the build fails. ${serverEntry.specifier === GEOGRAPHY_ENTRY ? 'Build the location lists a client component shows (navigation, service areas) in a server component and pass them as plain props; keep error pages and the analytics binding free of location data.' : 'Keep it in server components and route handlers.'}`, { line: serverEntry.line });\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 let ignoreCommand: unknown;\n try { ignoreCommand = vercel === null ? undefined : JSON.parse(vercel).ignoreCommand; } catch { ignoreCommand = undefined; }\n if (ignoreCommand !== BRANDLAB_VERCEL_IGNORE_COMMAND) {\n add('vercel.json', 'vercel-ignore-build', `vercel.json skips a production build only when a push changes nothing but .github/, docs/ or root Markdown files: \"ignoreCommand\": ${JSON.stringify(BRANDLAB_VERCEL_IGNORE_COMMAND)} (found ${ignoreCommand === undefined ? 'none' : JSON.stringify(ignoreCommand)}). A CI-only change otherwise rebuilds production and empties its CDN cache; previews and anything git cannot compare still build.`);\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/**\n * The Vercel ignored build step of every Brandlab site (3.3.3). Exit 0 skips a deployment, anything else builds it:\n * a production deployment is skipped only when git shows every change since the last successful production\n * deployment is in .github/, docs/ or a root Markdown file. Previews, a redeploy of the same commit, a missing or\n * unknown previous commit and any git error all build. brandlab-migrate S10 writes the same command.\n */\nexport const BRANDLAB_VERCEL_IGNORE_COMMAND =\n `[ \"$VERCEL_ENV\" = production ] && [ \"$VERCEL_GIT_PREVIOUS_SHA\" != \"$VERCEL_GIT_COMMIT_SHA\" ] && git diff --quiet \"$VERCEL_GIT_PREVIOUS_SHA\" HEAD -- . ':!.github' ':!docs' ':(exclude,glob)*.md' && exit 0 || exit 1`;\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*\\(/;\nconst GEOGRAPHY_ENTRY = '@brandlab-digital/site-core/geography';\n/**\n * Package entries a browser bundle cannot resolve from 3.3.3 (their exports map `browser` to null): the geography\n * registries and website-location policies, which the location estate reads, and the server halves of contact and reviews\n * (3.5.0 adds the Business Profile reviews feed client).\n */\nconst SERVER_PACKAGE_ENTRIES: ReadonlyMap<string, string> = new Map([\n [GEOGRAPHY_ENTRY, 'The Brandlab geography registry and website-location policy (server data, about 190 KB)'],\n ['@brandlab-digital/site-next/contact/server', 'The contact route runtime'],\n ['@brandlab-digital/site-next/google-reviews/server', 'The Google reviews route runtime'],\n ['@brandlab-digital/site-next/google-business-reviews/server', 'The Business Profile reviews feed client (it reads the feed token)'],\n]);\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.) From 3.3.3 no module a client component\n * reaches imports the geography registry (site-core/geography, which the location\n * estate reads) or a package server entry: a browser bundle cannot resolve them.\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 serverEntry = listModuleReferences(file).find(reference => !reference.typeOnly && SERVER_PACKAGE_ENTRIES.has(reference.specifier));\n if (serverEntry) {\n add(path, 'client-bundle-boundary', `${SERVER_PACKAGE_ENTRIES.get(serverEntry.specifier)} reaches the browser (${chain(path)} → ${serverEntry.specifier}), and from 3.3.3 a browser bundle cannot resolve it, so the build fails. ${serverEntry.specifier === GEOGRAPHY_ENTRY ? 'Build the location lists a client component shows (navigation, service areas) in a server component and pass them as plain props; keep error pages and the analytics binding free of location data.' : 'Keep it in server components and route handlers.'}`, { line: serverEntry.line });\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\n/** The two accepted default exports: the plain preset, or the preset plus the Site System rules (same identifier twice). */\nconst ESLINT_PRESET_EXPORT = /export\\s+default\\s+(?:([A-Za-z_$][\\w$]*)\\.configs\\.next|\\[\\s*\\.\\.\\.\\s*([A-Za-z_$][\\w$]*)\\.configs\\.next\\s*,\\s*\\2\\.configs\\[\\s*(['\"])site-system\\3\\s*\\]\\s*,?\\s*\\])\\s*;?\\s*$/;\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) || !ESLINT_PRESET_EXPORT.test(eslint.trim())) {\n add('eslint.config.mjs', 'tool-preset', \"eslint.config.mjs is exactly `export default brandlab.configs.next`, or, for a site that declares a siteSystem tier, `export default [...brandlab.configs.next, brandlab.configs['site-system']]` (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 let ignoreCommand: unknown;\n try { ignoreCommand = vercel === null ? undefined : JSON.parse(vercel).ignoreCommand; } catch { ignoreCommand = undefined; }\n if (ignoreCommand !== BRANDLAB_VERCEL_IGNORE_COMMAND) {\n add('vercel.json', 'vercel-ignore-build', `vercel.json skips a production build only when a push changes nothing but .github/, docs/ or root Markdown files: \"ignoreCommand\": ${JSON.stringify(BRANDLAB_VERCEL_IGNORE_COMMAND)} (found ${ignoreCommand === undefined ? 'none' : JSON.stringify(ignoreCommand)}). A CI-only change otherwise rebuilds production and empties its CDN cache; previews and anything git cannot compare still build.`);\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"]}
@@ -30,7 +30,7 @@ export declare const SITE_SYSTEM_CHECKS: readonly [{
30
30
  readonly id: "N1";
31
31
  readonly tier: "shell";
32
32
  readonly from: "3.9.0";
33
- readonly kind: "static";
33
+ readonly kind: "rendered";
34
34
  readonly summary: "Required nav links, About in the first two, services before Areas, Contact last, labels from the closed list, recorded orders kept.";
35
35
  }, {
36
36
  readonly id: "N2";
@@ -16,7 +16,7 @@
16
16
  export const SITE_SYSTEM_TIERS = ["shell", "enquiry", "full"];
17
17
  export const SITE_SYSTEM_CHECKS = [
18
18
  // shell: header, nav, call bar, placements, crawlable links, contrast and targets, call links, budgets, legal
19
- { id: "N1", tier: "shell", from: "3.9.0", kind: "static", summary: "Required nav links, About in the first two, services before Areas, Contact last, labels from the closed list, recorded orders kept." },
19
+ { id: "N1", tier: "shell", from: "3.9.0", kind: "rendered", summary: "Required nav links, About in the first two, services before Areas, Contact last, labels from the closed list, recorded orders kept." },
20
20
  { id: "N2", tier: "shell", from: "3.8.0", kind: "rendered", summary: "Every dropdown link and hub link is an <a href> in the server HTML." },
21
21
  { id: "N3", tier: "shell", from: "3.8.0", kind: "journey", summary: "Hover opens after a short delay and a diagonal path stays open; mouse-out closes; nothing sticks open." },
22
22
  { id: "N4", tier: "shell", from: "3.8.0", kind: "journey", summary: "A chevron click after hover keeps the panel open; a link click closes it; click, Enter and outside click work." },
@@ -1 +1 @@
1
- {"version":3,"file":"checks.js","sourceRoot":"","sources":["../../src/site-system/checks.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * The Site System v2 ready gate: every check, the adoption tier it blocks at and the release that brings it.\n *\n * A site declares `siteSystem: { tier }` in brandlab.config.ts. Checks of that tier and the tiers below it block;\n * checks of higher tiers report without blocking. A check blocks only from the release named here, so new checks\n * arrive with version bumps and never turn the fleet red at once. Holdouts use the project's Romie-owned\n * `exceptions` record. D6 (leave reviews as they are) removes every review-exclusion clause; D7 (no call tracking)\n * means no number-swap check.\n *\n * `kind` says where a check runs:\n * - `journey`: the Playwright site-system journeys (`defineBrandlabSiteSystemTests`), in the site's e2e run;\n * - `rendered`: rules over the built site's server HTML and assets (`brandlab-ready` reads them);\n * - `static`: source and data rules (`brandlab-verify` and `brandlab-ready`);\n * - `record`: launch-day and human steps recorded with `brandlab-ready record <id> --evidence <ref>`.\n */\n\nexport const SITE_SYSTEM_TIERS = [\"shell\", \"enquiry\", \"full\"] as const;\nexport type SiteSystemTier = (typeof SITE_SYSTEM_TIERS)[number];\n\n/** The design check D4 blocks every new build and redesign, whatever its tier. */\nexport type SiteSystemCheckScope = SiteSystemTier | \"new-build\";\n\nexport type SiteSystemCheckKind = \"journey\" | \"rendered\" | \"static\" | \"record\";\n\nexport interface SiteSystemCheck {\n readonly id: string;\n readonly tier: SiteSystemCheckScope;\n /** The first release in which the check blocks at its tier. */\n readonly from: `3.${number}.0`;\n readonly kind: SiteSystemCheckKind;\n readonly summary: string;\n}\n\nexport const SITE_SYSTEM_CHECKS = [\n // shell: header, nav, call bar, placements, crawlable links, contrast and targets, call links, budgets, legal\n { id: \"N1\", tier: \"shell\", from: \"3.9.0\", kind: \"static\", summary: \"Required nav links, About in the first two, services before Areas, Contact last, labels from the closed list, recorded orders kept.\" },\n { id: \"N2\", tier: \"shell\", from: \"3.8.0\", kind: \"rendered\", summary: \"Every dropdown link and hub link is an <a href> in the server HTML.\" },\n { id: \"N3\", tier: \"shell\", from: \"3.8.0\", kind: \"journey\", summary: \"Hover opens after a short delay and a diagonal path stays open; mouse-out closes; nothing sticks open.\" },\n { id: \"N4\", tier: \"shell\", from: \"3.8.0\", kind: \"journey\", summary: \"A chevron click after hover keeps the panel open; a link click closes it; click, Enter and outside click work.\" },\n { id: \"N5\", tier: \"shell\", from: \"3.8.0\", kind: \"journey\", summary: \"Keyboard and ARIA: aria-expanded follows the panel, Arrow keys move, Escape closes and returns focus; axe passes open and closed.\" },\n { id: \"N6\", tier: \"shell\", from: \"3.8.0\", kind: \"journey\", summary: \"The header stays at the top with the phone and quote visible at every desktop width; the compact band shows them from 1024 to 1279 px.\" },\n { id: \"N8\", tier: \"shell\", from: \"3.9.0\", kind: \"journey\", summary: \"The drawer is a modal dialog that traps focus and resets; the call bar uses placement fab; back-to-top appears (from 3.11.0).\" },\n { id: \"K1\", tier: \"shell\", from: \"3.9.0\", kind: \"rendered\", summary: \"Shared components in use for the parts the tier covers (data-bl present); no literal tel: outside PhoneLink.\" },\n { id: \"K3\", tier: \"shell\", from: \"3.8.0\", kind: \"journey\", summary: \"Text contrast 4.5:1 and non-text 3:1 in the browser.\" },\n { id: \"K4\", tier: \"shell\", from: \"3.8.0\", kind: \"journey\", summary: \"Targets at least 24 px, and 44 px for primary actions (call, quote, menu).\" },\n { id: \"K5\", tier: \"shell\", from: \"3.8.0\", kind: \"journey\", summary: \"Focus is never fully hidden by the sticky header or call bar at 390 px, in Chromium and WebKit.\" },\n { id: \"K6\", tier: \"shell\", from: \"3.8.0\", kind: \"journey\", summary: \"Phone and quote in the same relative order on every page, in the header, hero and call bar.\" },\n { id: \"K7\", tier: \"shell\", from: \"3.8.0\", kind: \"rendered\", summary: \"Dropdown links, accordion and tab panels and full review text are in the server HTML.\" },\n { id: \"K10\", tier: \"shell\", from: \"3.8.0\", kind: \"record\", summary: \"Adoption parity in the lenient harness: no section, link or text lost against the baseline.\" },\n { id: \"C4\", tier: \"shell\", from: \"3.8.0\", kind: \"journey\", summary: \"Phone taps report an allowed placement (header, footer, hero, cta, fab, contact, location, page).\" },\n { id: \"C5\", tier: \"shell\", from: \"3.8.0\", kind: \"rendered\", summary: \"Call-to-action labels come from the closed list or a recorded label.\" },\n { id: \"C9\", tier: \"shell\", from: \"3.8.0\", kind: \"rendered\", summary: \"No interstitial overlay in the first screen.\" },\n { id: \"C10\", tier: \"shell\", from: \"3.8.0\", kind: \"rendered\", summary: \"Every tel: href is E.164 (national digits for 13, 1300 and 1800) and matches the evidence-file phone.\" },\n { id: \"E1\", tier: \"shell\", from: \"3.8.0\", kind: \"static\", summary: \"Title patterns on new or changed URLs; recorded titles unchanged.\" },\n { id: \"E2\", tier: \"shell\", from: \"3.8.0\", kind: \"rendered\", summary: \"Exactly one H1 on every page, rendered once.\" },\n { id: \"E8\", tier: \"shell\", from: \"3.8.0\", kind: \"rendered\", summary: \"No banned phrase from any of the three layers, environmental claims included.\" },\n { id: \"T3\", tier: \"shell\", from: \"3.8.0\", kind: \"rendered\", summary: \"A licence line renders wherever licensed work is advertised, with the licensee where it differs.\" },\n { id: \"T4\", tier: \"shell\", from: \"3.8.0\", kind: \"rendered\", summary: \"No hard-coded rating or review numbers; proof claims resolve to renderable evidence.\" },\n { id: \"T11\", tier: \"shell\", from: \"3.8.0\", kind: \"static\", summary: \"No page for work over $5,000 outside the licence classes held; licence conditions carried.\" },\n { id: \"X1\", tier: \"shell\", from: \"3.8.0\", kind: \"record\", summary: \"Legacy URLs answer 200 or one redirect hop; earning-URL depth, titles and dollar figures kept.\" },\n { id: \"B1\", tier: \"shell\", from: \"3.8.0\", kind: \"rendered\", summary: \"Lab budgets: JavaScript, third-party requests, hero image and HTML within budget; no unrecorded chat widget, pixel, heatmap or tag manager.\" },\n { id: \"L10-hero\", tier: \"shell\", from: \"3.8.0\", kind: \"rendered\", summary: 'No kilometre figures, \"km from\" or \"based in\" in hero copy.' },\n\n // enquiry: the form, thank-you page, reviews, proof strip, footer, CTA band, contact page, prices, media, density\n { id: \"C1\", tier: \"enquiry\", from: \"3.8.0\", kind: \"journey\", summary: \"Money pages: the form in the first section; at 390 x 844 the H1, a call and a quote action in the first viewport; at 1440 x 900 the form.\" },\n { id: \"C2\", tier: \"enquiry\", from: \"3.8.0\", kind: \"rendered\", summary: 'Form layout and labels; phone and email required; no helper or reassurance lines, no \"(required)\", no job select.' },\n { id: \"E9\", tier: \"enquiry\", from: \"3.8.0\", kind: \"rendered\", summary: \"Every cost guide carries at least 8 dollar figures in a renderable price state.\" },\n { id: \"T5\", tier: \"enquiry\", from: \"3.8.0\", kind: \"rendered\", summary: \"Reviews from the feed, with Google's rating, count and link beside any selection; none on the contact page; no empty reviews section.\" },\n { id: \"K8\", tier: \"enquiry\", from: \"3.8.0\", kind: \"rendered\", summary: \"Section contract: no empty section, one H2 each, at most one band tone, neighbours differ, proof within the first five sections.\" },\n { id: \"C7\", tier: \"enquiry\", from: \"3.10.0\", kind: \"rendered\", summary: \"Thank-you page: a reply time, a tel: link and noindex, follow.\" },\n { id: \"C8\", tier: \"enquiry\", from: \"3.10.0\", kind: \"rendered\", summary: \"Forgiving form: tolerant phone input (13, 1300 and 1800 too), autocomplete tokens, no capture on the photo input.\" },\n { id: \"C11\", tier: \"enquiry\", from: \"3.10.0\", kind: \"static\", summary: \"The test marker is stripped before delivery and reporting; /api/contact is rate-limited.\" },\n { id: \"N9\", tier: \"enquiry\", from: \"3.11.0\", kind: \"rendered\", summary: 'Footer content: column 1 brand, licences, socials and contact; services, areas and company columns; © name, ABN and legal links; no CTA, \"based in\", hours or guides column.' },\n { id: \"K2\", tier: \"enquiry\", from: \"3.11.0\", kind: \"rendered\", summary: \"Every rendered shared component has a skin entry; no reference-skin class ships.\" },\n { id: \"K11\", tier: \"enquiry\", from: \"3.11.0\", kind: \"rendered\", summary: \"Density: no section with more than one H2, more than 8 cards or more than 2 calls to action; measure and section padding within limits.\" },\n { id: \"K12-contact\", tier: \"enquiry\", from: \"3.11.0\", kind: \"rendered\", summary: \"The contact page is the page header, then the contact block, and nothing else.\" },\n { id: \"T6\", tier: \"enquiry\", from: \"3.11.0\", kind: \"static\", summary: \"Every image has a media.ts entry with provenance.\" },\n { id: \"T7\", tier: \"enquiry\", from: \"3.11.0\", kind: \"rendered\", summary: \"No image is the main image of two pages.\" },\n { id: \"T8\", tier: \"enquiry\", from: \"3.11.0\", kind: \"rendered\", summary: 'Prices: GST flag set; no \"+ GST\" or \"from $X\" teasers on cards and menus; one band per job site-wide.' },\n { id: \"T9\", tier: \"enquiry\", from: \"3.11.0\", kind: \"static\", summary: \"No image in /public carries location metadata.\" },\n\n // full: page families, location estates, section manifests, links and the data contract\n { id: \"K12\", tier: \"full\", from: \"3.12.0\", kind: \"rendered\", summary: \"Section manifest: every required section rendered or skipped with a data-backed reason; conditional sections render when their data exists; canonical or recorded order.\" },\n { id: \"E5\", tier: \"full\", from: \"3.12.0\", kind: \"static\", summary: \"No orphan indexable pages, from the route catalogue and link data.\" },\n { id: \"E10\", tier: \"full\", from: \"3.12.0\", kind: \"static\", summary: \"Phrase-owner uniqueness in strategy data; no service-in-suburb page for the suburb page phrase; no service-region hub for the main trade.\" },\n { id: \"L3\", tier: \"full\", from: \"3.12.0\", kind: \"static\", summary: \"Neighbours by real distance.\" },\n { id: \"L4\", tier: \"full\", from: \"3.12.0\", kind: \"rendered\", summary: \"No copy rotated by page address, no name-swapped FAQs, no other suburb's job without the nearby label.\" },\n { id: \"L6\", tier: \"full\", from: \"3.12.0\", kind: \"static\", summary: \"Location pages have 6 or more inbound links from 3 or more page types.\" },\n { id: \"L7\", tier: \"full\", from: \"3.12.0\", kind: \"static\", summary: \"Location pages are 3 clicks or fewer from home.\" },\n { id: \"L8\", tier: \"full\", from: \"3.12.0\", kind: \"static\", summary: \"A hub per family per region.\" },\n { id: \"L9\", tier: \"full\", from: \"3.12.0\", kind: \"rendered\", summary: \"Data contract on service-location pages: price or cost-guide link, reviews or fallback, local facts; the nearby job card or none.\" },\n { id: \"L10\", tier: \"full\", from: \"3.12.0\", kind: \"rendered\", summary: 'No kilometre figures, \"km from\", \"based in\" or year stamps as local detail in location copy.' },\n { id: \"S4\", tier: \"full\", from: \"3.12.0\", kind: \"static\", summary: \"No hand-written per-service or per-suburb files; no dynamic route with zero pages.\" },\n { id: \"LOC-INDEX\", tier: \"full\", from: \"3.12.0\", kind: \"static\", summary: \"No location route is noindex or left out of the sitemap unless the recorded wave schedule dates it (Romie's 20 Oct decision: every suburb page stays indexed).\" },\n\n // new builds and redesigns\n { id: \"D4\", tier: \"new-build\", from: \"3.8.0\", kind: \"static\", summary: \"Same-trade distinctness: at least four of seven look levers differ from every listed competitor (advisory in 3.8.0, blocking from 3.9.0).\" },\n] as const satisfies readonly SiteSystemCheck[];\n\nexport type SiteSystemCheckId = (typeof SITE_SYSTEM_CHECKS)[number][\"id\"];\n\nconst TIER_RANK: Record<SiteSystemTier, number> = { shell: 0, enquiry: 1, full: 2 };\n\n/** A release as one comparable number: \"3.8.0\" < \"3.10.0\". */\nexport function siteSystemReleaseRank(version: string): number {\n const [major = 0, minor = 0, patch = 0] = version.split(/[.-]/).map((part) => Number.parseInt(part, 10) || 0);\n return major * 1_000_000 + minor * 1_000 + patch;\n}\n\n/**\n * Whether a check blocks for a site at `tier` on `release`. Checks of higher tiers, and checks newer than the\n * installed release, report without blocking. D4 blocks new builds and redesigns from 3.9.0 whatever their tier.\n */\nexport function siteSystemCheckBlocks(\n check: Pick<SiteSystemCheck, \"id\" | \"tier\" | \"from\">,\n site: { tier: SiteSystemTier; release: string; newBuild?: boolean },\n): boolean {\n if (check.tier === \"new-build\") return site.newBuild === true && siteSystemReleaseRank(site.release) >= siteSystemReleaseRank(\"3.9.0\");\n if (siteSystemReleaseRank(site.release) < siteSystemReleaseRank(check.from)) return false;\n return TIER_RANK[check.tier] <= TIER_RANK[site.tier];\n}\n\n/** One result of one check, from any runner. `brandlab-ready` merges them into the ready report. */\nexport interface SiteSystemFinding {\n readonly checkId: SiteSystemCheckId;\n readonly status: \"pass\" | \"fail\" | \"not-applicable\";\n /** The page path or file the result is about, when it is about one. */\n readonly target?: string;\n /** One plain sentence: what passed or what is wrong and where. */\n readonly message: string;\n /** A warning never blocks: the check still passes and the report shows \"pass (warning)\". */\n readonly severity?: \"warning\";\n}\n"]}
1
+ {"version":3,"file":"checks.js","sourceRoot":"","sources":["../../src/site-system/checks.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * The Site System v2 ready gate: every check, the adoption tier it blocks at and the release that brings it.\n *\n * A site declares `siteSystem: { tier }` in brandlab.config.ts. Checks of that tier and the tiers below it block;\n * checks of higher tiers report without blocking. A check blocks only from the release named here, so new checks\n * arrive with version bumps and never turn the fleet red at once. Holdouts use the project's Romie-owned\n * `exceptions` record. D6 (leave reviews as they are) removes every review-exclusion clause; D7 (no call tracking)\n * means no number-swap check.\n *\n * `kind` says where a check runs:\n * - `journey`: the Playwright site-system journeys (`defineBrandlabSiteSystemTests`), in the site's e2e run;\n * - `rendered`: rules over the built site's server HTML and assets (`brandlab-ready` reads them);\n * - `static`: source and data rules (`brandlab-verify` and `brandlab-ready`);\n * - `record`: launch-day and human steps recorded with `brandlab-ready record <id> --evidence <ref>`.\n */\n\nexport const SITE_SYSTEM_TIERS = [\"shell\", \"enquiry\", \"full\"] as const;\nexport type SiteSystemTier = (typeof SITE_SYSTEM_TIERS)[number];\n\n/** The design check D4 blocks every new build and redesign, whatever its tier. */\nexport type SiteSystemCheckScope = SiteSystemTier | \"new-build\";\n\nexport type SiteSystemCheckKind = \"journey\" | \"rendered\" | \"static\" | \"record\";\n\nexport interface SiteSystemCheck {\n readonly id: string;\n readonly tier: SiteSystemCheckScope;\n /** The first release in which the check blocks at its tier. */\n readonly from: `3.${number}.0`;\n readonly kind: SiteSystemCheckKind;\n readonly summary: string;\n}\n\nexport const SITE_SYSTEM_CHECKS = [\n // shell: header, nav, call bar, placements, crawlable links, contrast and targets, call links, budgets, legal\n { id: \"N1\", tier: \"shell\", from: \"3.9.0\", kind: \"rendered\", summary: \"Required nav links, About in the first two, services before Areas, Contact last, labels from the closed list, recorded orders kept.\" },\n { id: \"N2\", tier: \"shell\", from: \"3.8.0\", kind: \"rendered\", summary: \"Every dropdown link and hub link is an <a href> in the server HTML.\" },\n { id: \"N3\", tier: \"shell\", from: \"3.8.0\", kind: \"journey\", summary: \"Hover opens after a short delay and a diagonal path stays open; mouse-out closes; nothing sticks open.\" },\n { id: \"N4\", tier: \"shell\", from: \"3.8.0\", kind: \"journey\", summary: \"A chevron click after hover keeps the panel open; a link click closes it; click, Enter and outside click work.\" },\n { id: \"N5\", tier: \"shell\", from: \"3.8.0\", kind: \"journey\", summary: \"Keyboard and ARIA: aria-expanded follows the panel, Arrow keys move, Escape closes and returns focus; axe passes open and closed.\" },\n { id: \"N6\", tier: \"shell\", from: \"3.8.0\", kind: \"journey\", summary: \"The header stays at the top with the phone and quote visible at every desktop width; the compact band shows them from 1024 to 1279 px.\" },\n { id: \"N8\", tier: \"shell\", from: \"3.9.0\", kind: \"journey\", summary: \"The drawer is a modal dialog that traps focus and resets; the call bar uses placement fab; back-to-top appears (from 3.11.0).\" },\n { id: \"K1\", tier: \"shell\", from: \"3.9.0\", kind: \"rendered\", summary: \"Shared components in use for the parts the tier covers (data-bl present); no literal tel: outside PhoneLink.\" },\n { id: \"K3\", tier: \"shell\", from: \"3.8.0\", kind: \"journey\", summary: \"Text contrast 4.5:1 and non-text 3:1 in the browser.\" },\n { id: \"K4\", tier: \"shell\", from: \"3.8.0\", kind: \"journey\", summary: \"Targets at least 24 px, and 44 px for primary actions (call, quote, menu).\" },\n { id: \"K5\", tier: \"shell\", from: \"3.8.0\", kind: \"journey\", summary: \"Focus is never fully hidden by the sticky header or call bar at 390 px, in Chromium and WebKit.\" },\n { id: \"K6\", tier: \"shell\", from: \"3.8.0\", kind: \"journey\", summary: \"Phone and quote in the same relative order on every page, in the header, hero and call bar.\" },\n { id: \"K7\", tier: \"shell\", from: \"3.8.0\", kind: \"rendered\", summary: \"Dropdown links, accordion and tab panels and full review text are in the server HTML.\" },\n { id: \"K10\", tier: \"shell\", from: \"3.8.0\", kind: \"record\", summary: \"Adoption parity in the lenient harness: no section, link or text lost against the baseline.\" },\n { id: \"C4\", tier: \"shell\", from: \"3.8.0\", kind: \"journey\", summary: \"Phone taps report an allowed placement (header, footer, hero, cta, fab, contact, location, page).\" },\n { id: \"C5\", tier: \"shell\", from: \"3.8.0\", kind: \"rendered\", summary: \"Call-to-action labels come from the closed list or a recorded label.\" },\n { id: \"C9\", tier: \"shell\", from: \"3.8.0\", kind: \"rendered\", summary: \"No interstitial overlay in the first screen.\" },\n { id: \"C10\", tier: \"shell\", from: \"3.8.0\", kind: \"rendered\", summary: \"Every tel: href is E.164 (national digits for 13, 1300 and 1800) and matches the evidence-file phone.\" },\n { id: \"E1\", tier: \"shell\", from: \"3.8.0\", kind: \"static\", summary: \"Title patterns on new or changed URLs; recorded titles unchanged.\" },\n { id: \"E2\", tier: \"shell\", from: \"3.8.0\", kind: \"rendered\", summary: \"Exactly one H1 on every page, rendered once.\" },\n { id: \"E8\", tier: \"shell\", from: \"3.8.0\", kind: \"rendered\", summary: \"No banned phrase from any of the three layers, environmental claims included.\" },\n { id: \"T3\", tier: \"shell\", from: \"3.8.0\", kind: \"rendered\", summary: \"A licence line renders wherever licensed work is advertised, with the licensee where it differs.\" },\n { id: \"T4\", tier: \"shell\", from: \"3.8.0\", kind: \"rendered\", summary: \"No hard-coded rating or review numbers; proof claims resolve to renderable evidence.\" },\n { id: \"T11\", tier: \"shell\", from: \"3.8.0\", kind: \"static\", summary: \"No page for work over $5,000 outside the licence classes held; licence conditions carried.\" },\n { id: \"X1\", tier: \"shell\", from: \"3.8.0\", kind: \"record\", summary: \"Legacy URLs answer 200 or one redirect hop; earning-URL depth, titles and dollar figures kept.\" },\n { id: \"B1\", tier: \"shell\", from: \"3.8.0\", kind: \"rendered\", summary: \"Lab budgets: JavaScript, third-party requests, hero image and HTML within budget; no unrecorded chat widget, pixel, heatmap or tag manager.\" },\n { id: \"L10-hero\", tier: \"shell\", from: \"3.8.0\", kind: \"rendered\", summary: 'No kilometre figures, \"km from\" or \"based in\" in hero copy.' },\n\n // enquiry: the form, thank-you page, reviews, proof strip, footer, CTA band, contact page, prices, media, density\n { id: \"C1\", tier: \"enquiry\", from: \"3.8.0\", kind: \"journey\", summary: \"Money pages: the form in the first section; at 390 x 844 the H1, a call and a quote action in the first viewport; at 1440 x 900 the form.\" },\n { id: \"C2\", tier: \"enquiry\", from: \"3.8.0\", kind: \"rendered\", summary: 'Form layout and labels; phone and email required; no helper or reassurance lines, no \"(required)\", no job select.' },\n { id: \"E9\", tier: \"enquiry\", from: \"3.8.0\", kind: \"rendered\", summary: \"Every cost guide carries at least 8 dollar figures in a renderable price state.\" },\n { id: \"T5\", tier: \"enquiry\", from: \"3.8.0\", kind: \"rendered\", summary: \"Reviews from the feed, with Google's rating, count and link beside any selection; none on the contact page; no empty reviews section.\" },\n { id: \"K8\", tier: \"enquiry\", from: \"3.8.0\", kind: \"rendered\", summary: \"Section contract: no empty section, one H2 each, at most one band tone, neighbours differ, proof within the first five sections.\" },\n { id: \"C7\", tier: \"enquiry\", from: \"3.10.0\", kind: \"rendered\", summary: \"Thank-you page: a reply time, a tel: link and noindex, follow.\" },\n { id: \"C8\", tier: \"enquiry\", from: \"3.10.0\", kind: \"rendered\", summary: \"Forgiving form: tolerant phone input (13, 1300 and 1800 too), autocomplete tokens, no capture on the photo input.\" },\n { id: \"C11\", tier: \"enquiry\", from: \"3.10.0\", kind: \"static\", summary: \"The test marker is stripped before delivery and reporting; /api/contact is rate-limited.\" },\n { id: \"N9\", tier: \"enquiry\", from: \"3.11.0\", kind: \"rendered\", summary: 'Footer content: column 1 brand, licences, socials and contact; services, areas and company columns; © name, ABN and legal links; no CTA, \"based in\", hours or guides column.' },\n { id: \"K2\", tier: \"enquiry\", from: \"3.11.0\", kind: \"rendered\", summary: \"Every rendered shared component has a skin entry; no reference-skin class ships.\" },\n { id: \"K11\", tier: \"enquiry\", from: \"3.11.0\", kind: \"rendered\", summary: \"Density: no section with more than one H2, more than 8 cards or more than 2 calls to action; measure and section padding within limits.\" },\n { id: \"K12-contact\", tier: \"enquiry\", from: \"3.11.0\", kind: \"rendered\", summary: \"The contact page is the page header, then the contact block, and nothing else.\" },\n { id: \"T6\", tier: \"enquiry\", from: \"3.11.0\", kind: \"static\", summary: \"Every image has a media.ts entry with provenance.\" },\n { id: \"T7\", tier: \"enquiry\", from: \"3.11.0\", kind: \"rendered\", summary: \"No image is the main image of two pages.\" },\n { id: \"T8\", tier: \"enquiry\", from: \"3.11.0\", kind: \"rendered\", summary: 'Prices: GST flag set; no \"+ GST\" or \"from $X\" teasers on cards and menus; one band per job site-wide.' },\n { id: \"T9\", tier: \"enquiry\", from: \"3.11.0\", kind: \"static\", summary: \"No image in /public carries location metadata.\" },\n\n // full: page families, location estates, section manifests, links and the data contract\n { id: \"K12\", tier: \"full\", from: \"3.12.0\", kind: \"rendered\", summary: \"Section manifest: every required section rendered or skipped with a data-backed reason; conditional sections render when their data exists; canonical or recorded order.\" },\n { id: \"E5\", tier: \"full\", from: \"3.12.0\", kind: \"static\", summary: \"No orphan indexable pages, from the route catalogue and link data.\" },\n { id: \"E10\", tier: \"full\", from: \"3.12.0\", kind: \"static\", summary: \"Phrase-owner uniqueness in strategy data; no service-in-suburb page for the suburb page phrase; no service-region hub for the main trade.\" },\n { id: \"L3\", tier: \"full\", from: \"3.12.0\", kind: \"static\", summary: \"Neighbours by real distance.\" },\n { id: \"L4\", tier: \"full\", from: \"3.12.0\", kind: \"rendered\", summary: \"No copy rotated by page address, no name-swapped FAQs, no other suburb's job without the nearby label.\" },\n { id: \"L6\", tier: \"full\", from: \"3.12.0\", kind: \"static\", summary: \"Location pages have 6 or more inbound links from 3 or more page types.\" },\n { id: \"L7\", tier: \"full\", from: \"3.12.0\", kind: \"static\", summary: \"Location pages are 3 clicks or fewer from home.\" },\n { id: \"L8\", tier: \"full\", from: \"3.12.0\", kind: \"static\", summary: \"A hub per family per region.\" },\n { id: \"L9\", tier: \"full\", from: \"3.12.0\", kind: \"rendered\", summary: \"Data contract on service-location pages: price or cost-guide link, reviews or fallback, local facts; the nearby job card or none.\" },\n { id: \"L10\", tier: \"full\", from: \"3.12.0\", kind: \"rendered\", summary: 'No kilometre figures, \"km from\", \"based in\" or year stamps as local detail in location copy.' },\n { id: \"S4\", tier: \"full\", from: \"3.12.0\", kind: \"static\", summary: \"No hand-written per-service or per-suburb files; no dynamic route with zero pages.\" },\n { id: \"LOC-INDEX\", tier: \"full\", from: \"3.12.0\", kind: \"static\", summary: \"No location route is noindex or left out of the sitemap unless the recorded wave schedule dates it (Romie's 20 Oct decision: every suburb page stays indexed).\" },\n\n // new builds and redesigns\n { id: \"D4\", tier: \"new-build\", from: \"3.8.0\", kind: \"static\", summary: \"Same-trade distinctness: at least four of seven look levers differ from every listed competitor (advisory in 3.8.0, blocking from 3.9.0).\" },\n] as const satisfies readonly SiteSystemCheck[];\n\nexport type SiteSystemCheckId = (typeof SITE_SYSTEM_CHECKS)[number][\"id\"];\n\nconst TIER_RANK: Record<SiteSystemTier, number> = { shell: 0, enquiry: 1, full: 2 };\n\n/** A release as one comparable number: \"3.8.0\" < \"3.10.0\". */\nexport function siteSystemReleaseRank(version: string): number {\n const [major = 0, minor = 0, patch = 0] = version.split(/[.-]/).map((part) => Number.parseInt(part, 10) || 0);\n return major * 1_000_000 + minor * 1_000 + patch;\n}\n\n/**\n * Whether a check blocks for a site at `tier` on `release`. Checks of higher tiers, and checks newer than the\n * installed release, report without blocking. D4 blocks new builds and redesigns from 3.9.0 whatever their tier.\n */\nexport function siteSystemCheckBlocks(\n check: Pick<SiteSystemCheck, \"id\" | \"tier\" | \"from\">,\n site: { tier: SiteSystemTier; release: string; newBuild?: boolean },\n): boolean {\n if (check.tier === \"new-build\") return site.newBuild === true && siteSystemReleaseRank(site.release) >= siteSystemReleaseRank(\"3.9.0\");\n if (siteSystemReleaseRank(site.release) < siteSystemReleaseRank(check.from)) return false;\n return TIER_RANK[check.tier] <= TIER_RANK[site.tier];\n}\n\n/** One result of one check, from any runner. `brandlab-ready` merges them into the ready report. */\nexport interface SiteSystemFinding {\n readonly checkId: SiteSystemCheckId;\n readonly status: \"pass\" | \"fail\" | \"not-applicable\";\n /** The page path or file the result is about, when it is about one. */\n readonly target?: string;\n /** One plain sentence: what passed or what is wrong and where. */\n readonly message: string;\n /** A warning never blocks: the check still passes and the report shows \"pass (warning)\". */\n readonly severity?: \"warning\";\n}\n"]}