@brandlab-digital/conformance 1.0.0-rc.2 → 1.0.0-rc.21

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 (48) hide show
  1. package/dist/analytics-contract.d.ts +20 -0
  2. package/dist/analytics-contract.d.ts.map +1 -0
  3. package/dist/analytics-contract.js +211 -0
  4. package/dist/analytics-contract.js.map +1 -0
  5. package/dist/cli.d.ts +3 -0
  6. package/dist/cli.d.ts.map +1 -1
  7. package/dist/cli.js +91 -20
  8. package/dist/cli.js.map +1 -1
  9. package/dist/project-config-v3.d.ts +9 -1
  10. package/dist/project-config-v3.d.ts.map +1 -1
  11. package/dist/project-config-v3.js +246 -37
  12. package/dist/project-config-v3.js.map +1 -1
  13. package/dist/project-config.d.ts +1 -1
  14. package/dist/project-config.d.ts.map +1 -1
  15. package/dist/project-config.js +1 -1
  16. package/dist/project-config.js.map +1 -1
  17. package/dist/project-documentation.d.ts +28 -0
  18. package/dist/project-documentation.d.ts.map +1 -0
  19. package/dist/project-documentation.js +398 -0
  20. package/dist/project-documentation.js.map +1 -0
  21. package/dist/project.d.ts +9 -2
  22. package/dist/project.d.ts.map +1 -1
  23. package/dist/project.js +290 -44
  24. package/dist/project.js.map +1 -1
  25. package/dist/release-catalog.d.ts.map +1 -1
  26. package/dist/release-catalog.js +1405 -0
  27. package/dist/release-catalog.js.map +1 -1
  28. package/dist/release-contract-compatibility.d.ts +133 -0
  29. package/dist/release-contract-compatibility.d.ts.map +1 -1
  30. package/dist/release-contract-compatibility.js +133 -0
  31. package/dist/release-contract-compatibility.js.map +1 -1
  32. package/dist/release-manifest.d.ts +1 -0
  33. package/dist/release-manifest.d.ts.map +1 -1
  34. package/dist/release-manifest.js +7 -0
  35. package/dist/release-manifest.js.map +1 -1
  36. package/dist/rendered-content.d.ts +38 -0
  37. package/dist/rendered-content.d.ts.map +1 -0
  38. package/dist/rendered-content.js +149 -0
  39. package/dist/rendered-content.js.map +1 -0
  40. package/dist/source-safety-contracts.d.ts +1 -1
  41. package/dist/source-safety-contracts.d.ts.map +1 -1
  42. package/dist/source-safety-contracts.js +5 -1
  43. package/dist/source-safety-contracts.js.map +1 -1
  44. package/dist/verification-policy.d.ts +99 -0
  45. package/dist/verification-policy.d.ts.map +1 -0
  46. package/dist/verification-policy.js +219 -0
  47. package/dist/verification-policy.js.map +1 -0
  48. package/package.json +20 -2
@@ -0,0 +1,149 @@
1
+ function normalizedWords(value) {
2
+ return value
3
+ .normalize('NFKC')
4
+ .toLowerCase()
5
+ .replace(/[\p{P}\p{S}]+/gu, ' ')
6
+ .split(/\s+/)
7
+ .filter(Boolean);
8
+ }
9
+ export function normalizeRenderedContent(value) {
10
+ return normalizedWords(value).join(' ');
11
+ }
12
+ function assertUniqueSampleIds(samples) {
13
+ const duplicateId = samples.find((sample, index) => samples.slice(0, index).some((candidate) => candidate.id === sample.id));
14
+ if (duplicateId) {
15
+ throw new Error(`Rendered-content sample ID "${duplicateId.id}" is duplicated.`);
16
+ }
17
+ }
18
+ function normalizeWithoutVariationTokens(sample) {
19
+ let normalized = normalizeRenderedContent(sample.mainText);
20
+ const tokens = [...(sample.variationTokens ?? [])]
21
+ .map(normalizeRenderedContent)
22
+ .filter(Boolean)
23
+ .sort((left, right) => right.length - left.length);
24
+ for (const token of tokens) {
25
+ const escaped = token.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
26
+ normalized = normalized.replace(new RegExp(`(?:^|\\s)${escaped}(?=\\s|$)`, 'g'), ' location');
27
+ }
28
+ return normalized.trim().replace(/\s+/g, ' ');
29
+ }
30
+ /**
31
+ * Operational duplicate protection. This deliberately blocks only exact
32
+ * copied output and explicit location-token substitutions.
33
+ */
34
+ export function evaluateRenderedContentDuplicates(samples) {
35
+ assertUniqueSampleIds(samples);
36
+ const prepared = samples.map((sample) => ({
37
+ ...sample,
38
+ normalized: normalizeRenderedContent(sample.mainText),
39
+ withoutVariationTokens: normalizeWithoutVariationTokens(sample),
40
+ }));
41
+ const findings = [];
42
+ for (let leftIndex = 0; leftIndex < prepared.length; leftIndex += 1) {
43
+ const left = prepared[leftIndex];
44
+ if (!left.normalized)
45
+ continue;
46
+ for (let rightIndex = leftIndex + 1; rightIndex < prepared.length; rightIndex += 1) {
47
+ const right = prepared[rightIndex];
48
+ if (!right.normalized)
49
+ continue;
50
+ if (left.normalized === right.normalized) {
51
+ findings.push({
52
+ leftId: left.id,
53
+ rightId: right.id,
54
+ kind: 'exact-duplicate',
55
+ severity: 'blocker',
56
+ });
57
+ continue;
58
+ }
59
+ if (left.variationTokens?.length &&
60
+ right.variationTokens?.length &&
61
+ left.withoutVariationTokens === right.withoutVariationTokens) {
62
+ findings.push({
63
+ leftId: left.id,
64
+ rightId: right.id,
65
+ kind: 'token-substitution',
66
+ severity: 'blocker',
67
+ });
68
+ }
69
+ }
70
+ }
71
+ return findings.sort((left, right) => left.leftId.localeCompare(right.leftId) ||
72
+ left.rightId.localeCompare(right.rightId));
73
+ }
74
+ function shingles(value, size) {
75
+ const words = normalizedWords(value);
76
+ const values = new Set();
77
+ for (let index = 0; index <= words.length - size; index += 1) {
78
+ values.add(words.slice(index, index + size).join(' '));
79
+ }
80
+ return values;
81
+ }
82
+ export function fiveWordShingleSimilarity(left, right) {
83
+ const leftShingles = shingles(left, 5);
84
+ const rightShingles = shingles(right, 5);
85
+ if (leftShingles.size === 0 && rightShingles.size === 0)
86
+ return 1;
87
+ if (leftShingles.size === 0 || rightShingles.size === 0)
88
+ return 0;
89
+ let intersection = 0;
90
+ for (const shingle of leftShingles) {
91
+ if (rightShingles.has(shingle))
92
+ intersection += 1;
93
+ }
94
+ const union = leftShingles.size + rightShingles.size - intersection;
95
+ return union === 0 ? 0 : intersection / union;
96
+ }
97
+ export function evaluateRenderedContentSimilarity(samples, options = {}) {
98
+ const warningThreshold = options.warningThreshold ?? 0.55;
99
+ const blockerThreshold = options.blockerThreshold ?? 0.7;
100
+ const shingleSize = options.shingleSize ?? 5;
101
+ const sampleLimit = options.sampleLimit ?? 100;
102
+ if (warningThreshold < 0 ||
103
+ blockerThreshold > 1 ||
104
+ warningThreshold >= blockerThreshold) {
105
+ throw new Error('Rendered-content thresholds must be ordered between zero and one.');
106
+ }
107
+ if (!Number.isInteger(shingleSize) || shingleSize < 2 || shingleSize > 10) {
108
+ throw new Error('Rendered-content shingleSize must be an integer from 2 to 10.');
109
+ }
110
+ if (!Number.isInteger(sampleLimit) || sampleLimit < 2) {
111
+ throw new Error('Rendered-content sampleLimit must be an integer of at least two.');
112
+ }
113
+ assertUniqueSampleIds(samples);
114
+ const prepared = [...samples]
115
+ .sort((left, right) => left.id.localeCompare(right.id))
116
+ .slice(0, sampleLimit)
117
+ .map((sample) => ({
118
+ ...sample,
119
+ shingleSet: shingles(sample.mainText, shingleSize),
120
+ }));
121
+ const findings = [];
122
+ for (let leftIndex = 0; leftIndex < prepared.length; leftIndex += 1) {
123
+ const left = prepared[leftIndex];
124
+ for (let rightIndex = leftIndex + 1; rightIndex < prepared.length; rightIndex += 1) {
125
+ const right = prepared[rightIndex];
126
+ if (left.shingleSet.size === 0 || right.shingleSet.size === 0)
127
+ continue;
128
+ let intersection = 0;
129
+ for (const shingle of left.shingleSet) {
130
+ if (right.shingleSet.has(shingle))
131
+ intersection += 1;
132
+ }
133
+ const union = left.shingleSet.size + right.shingleSet.size - intersection;
134
+ const score = union === 0 ? 0 : intersection / union;
135
+ if (score < warningThreshold)
136
+ continue;
137
+ findings.push({
138
+ leftId: left.id,
139
+ rightId: right.id,
140
+ score,
141
+ severity: 'warning',
142
+ });
143
+ }
144
+ }
145
+ return findings.sort((left, right) => right.score - left.score ||
146
+ left.leftId.localeCompare(right.leftId) ||
147
+ left.rightId.localeCompare(right.rightId));
148
+ }
149
+ //# sourceMappingURL=rendered-content.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rendered-content.js","sourceRoot":"","sources":["../src/rendered-content.ts"],"names":[],"mappings":"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"}
@@ -9,7 +9,7 @@ export declare const BRANDLAB_SOURCE_SAFETY_V1_PATTERNS: readonly {
9
9
  name: string;
10
10
  pattern: RegExp;
11
11
  }[];
12
- /** Alpha.18 through RC.2 source-safety rules, bound to Alpha.18 source. */
12
+ /** Alpha.18 and later source-safety rules, bound to Alpha.18 source. */
13
13
  export declare const BRANDLAB_SOURCE_SAFETY_V2_RULESET_ID = "source-safety-v2@2c15e22f547dbdb98b233358f3934723659e73b5";
14
14
  export declare const BRANDLAB_SOURCE_SAFETY_V2_PATTERNS: readonly {
15
15
  name: string;
@@ -1 +1 @@
1
- {"version":3,"file":"source-safety-contracts.d.ts","sourceRoot":"","sources":["../src/source-safety-contracts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,WAAW,2BAA2B;IAC1C,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,SAAS,aAAa,EAAE,CAAC;CACpC;AAED,2EAA2E;AAC3E,eAAO,MAAM,oCAAoC,8DACY,CAAC;AAE9D,eAAO,MAAM,kCAAkC;;;GAiBV,CAAC;AAEtC,2EAA2E;AAC3E,eAAO,MAAM,oCAAoC,8DACY,CAAC;AAE9D,eAAO,MAAM,kCAAkC;;;GAMV,CAAC;AAqBtC,wBAAgB,kCAAkC,CAChD,oBAAoB,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC9C,2BAA2B,GAAG,IAAI,CAOpC;AAED,wBAAgB,8BAA8B,CAC5C,SAAS,EAAE,2BAA2B,GAAG,IAAI,EAC7C,MAAM,EAAE,2BAA2B,GAClC,SAAS,aAAa,EAAE,CAO1B"}
1
+ {"version":3,"file":"source-safety-contracts.d.ts","sourceRoot":"","sources":["../src/source-safety-contracts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,WAAW,2BAA2B;IAC1C,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,SAAS,aAAa,EAAE,CAAC;CACpC;AAED,2EAA2E;AAC3E,eAAO,MAAM,oCAAoC,8DACY,CAAC;AAE9D,eAAO,MAAM,kCAAkC;;;GAiBV,CAAC;AAEtC,wEAAwE;AACxE,eAAO,MAAM,oCAAoC,8DACY,CAAC;AAE9D,eAAO,MAAM,kCAAkC;;;GAMV,CAAC;AAyBtC,wBAAgB,kCAAkC,CAChD,oBAAoB,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC9C,2BAA2B,GAAG,IAAI,CAOpC;AAED,wBAAgB,8BAA8B,CAC5C,SAAS,EAAE,2BAA2B,GAAG,IAAI,EAC7C,MAAM,EAAE,2BAA2B,GAClC,SAAS,aAAa,EAAE,CAO1B"}
@@ -18,7 +18,7 @@ export const BRANDLAB_SOURCE_SAFETY_V1_PATTERNS = Object.freeze([
18
18
  pattern: /\bfs\.statSync\b|\.mtime\b|\bmtime\b/,
19
19
  },
20
20
  ]);
21
- /** Alpha.18 through RC.2 source-safety rules, bound to Alpha.18 source. */
21
+ /** Alpha.18 and later source-safety rules, bound to Alpha.18 source. */
22
22
  export const BRANDLAB_SOURCE_SAFETY_V2_RULESET_ID = "source-safety-v2@2c15e22f547dbdb98b233358f3934723659e73b5";
23
23
  export const BRANDLAB_SOURCE_SAFETY_V2_PATTERNS = Object.freeze([
24
24
  ...BRANDLAB_SOURCE_SAFETY_V1_PATTERNS,
@@ -44,6 +44,10 @@ const SOURCE_SAFETY_BY_ARCHITECTURE_CONTRACT = Object.freeze({
44
44
  id: BRANDLAB_SOURCE_SAFETY_V2_RULESET_ID,
45
45
  patterns: BRANDLAB_SOURCE_SAFETY_V2_PATTERNS,
46
46
  },
47
+ "architecture-v5": {
48
+ id: BRANDLAB_SOURCE_SAFETY_V2_RULESET_ID,
49
+ patterns: BRANDLAB_SOURCE_SAFETY_V2_PATTERNS,
50
+ },
47
51
  });
48
52
  export function sourceSafetyRulesetForArchitecture(architectureContract) {
49
53
  if (!architectureContract)
@@ -1 +1 @@
1
- {"version":3,"file":"source-safety-contracts.js","sourceRoot":"","sources":["../src/source-safety-contracts.ts"],"names":[],"mappings":"AAOA,2EAA2E;AAC3E,MAAM,CAAC,MAAM,oCAAoC,GAC/C,2DAA2D,CAAC;AAE9D,MAAM,CAAC,MAAM,kCAAkC,GAAG,MAAM,CAAC,MAAM,CAAC;IAC9D;QACE,IAAI,EAAE,wBAAwB;QAC9B,OAAO,EAAE,gEAAgE;KAC1E;IACD;QACE,IAAI,EAAE,gCAAgC;QACtC,OAAO,EAAE,mDAAmD;KAC7D;IACD;QACE,IAAI,EAAE,oCAAoC;QAC1C,OAAO,EAAE,+BAA+B;KACzC;IACD;QACE,IAAI,EAAE,8BAA8B;QACpC,OAAO,EAAE,sCAAsC;KAChD;CACiC,CAAC,CAAC;AAEtC,2EAA2E;AAC3E,MAAM,CAAC,MAAM,oCAAoC,GAC/C,2DAA2D,CAAC;AAE9D,MAAM,CAAC,MAAM,kCAAkC,GAAG,MAAM,CAAC,MAAM,CAAC;IAC9D,GAAG,kCAAkC;IACrC;QACE,IAAI,EAAE,4BAA4B;QAClC,OAAO,EAAE,mDAAmD;KAC7D;CACiC,CAAC,CAAC;AAEtC,MAAM,sCAAsC,GAAG,MAAM,CAAC,MAAM,CAAC;IAC3D,iBAAiB,EAAE;QACjB,EAAE,EAAE,oCAAoC;QACxC,QAAQ,EAAE,kCAAkC;KAC7C;IACD,iBAAiB,EAAE;QACjB,EAAE,EAAE,oCAAoC;QACxC,QAAQ,EAAE,kCAAkC;KAC7C;IACD,iBAAiB,EAAE;QACjB,EAAE,EAAE,oCAAoC;QACxC,QAAQ,EAAE,kCAAkC;KAC7C;IACD,iBAAiB,EAAE;QACjB,EAAE,EAAE,oCAAoC;QACxC,QAAQ,EAAE,kCAAkC;KAC7C;CAC8D,CAAC,CAAC;AAEnE,MAAM,UAAU,kCAAkC,CAChD,oBAA+C;IAE/C,IAAI,CAAC,oBAAoB;QAAE,OAAO,IAAI,CAAC;IACvC,OACE,sCAGD,CAAC,oBAAoB,CAAC,IAAI,IAAI,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,8BAA8B,CAC5C,SAA6C,EAC7C,MAAmC;IAEnC,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAC/B,CAAC,SAAS,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,CACjD,CAAC;IACF,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAC3B,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAC9D,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,OAAsB;IAC7C,OAAO,GAAG,OAAO,CAAC,IAAI,SAAS,OAAO,CAAC,OAAO,CAAC,MAAM,SAAS,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;AACxF,CAAC"}
1
+ {"version":3,"file":"source-safety-contracts.js","sourceRoot":"","sources":["../src/source-safety-contracts.ts"],"names":[],"mappings":"AAOA,2EAA2E;AAC3E,MAAM,CAAC,MAAM,oCAAoC,GAC/C,2DAA2D,CAAC;AAE9D,MAAM,CAAC,MAAM,kCAAkC,GAAG,MAAM,CAAC,MAAM,CAAC;IAC9D;QACE,IAAI,EAAE,wBAAwB;QAC9B,OAAO,EAAE,gEAAgE;KAC1E;IACD;QACE,IAAI,EAAE,gCAAgC;QACtC,OAAO,EAAE,mDAAmD;KAC7D;IACD;QACE,IAAI,EAAE,oCAAoC;QAC1C,OAAO,EAAE,+BAA+B;KACzC;IACD;QACE,IAAI,EAAE,8BAA8B;QACpC,OAAO,EAAE,sCAAsC;KAChD;CACiC,CAAC,CAAC;AAEtC,wEAAwE;AACxE,MAAM,CAAC,MAAM,oCAAoC,GAC/C,2DAA2D,CAAC;AAE9D,MAAM,CAAC,MAAM,kCAAkC,GAAG,MAAM,CAAC,MAAM,CAAC;IAC9D,GAAG,kCAAkC;IACrC;QACE,IAAI,EAAE,4BAA4B;QAClC,OAAO,EAAE,mDAAmD;KAC7D;CACiC,CAAC,CAAC;AAEtC,MAAM,sCAAsC,GAAG,MAAM,CAAC,MAAM,CAAC;IAC3D,iBAAiB,EAAE;QACjB,EAAE,EAAE,oCAAoC;QACxC,QAAQ,EAAE,kCAAkC;KAC7C;IACD,iBAAiB,EAAE;QACjB,EAAE,EAAE,oCAAoC;QACxC,QAAQ,EAAE,kCAAkC;KAC7C;IACD,iBAAiB,EAAE;QACjB,EAAE,EAAE,oCAAoC;QACxC,QAAQ,EAAE,kCAAkC;KAC7C;IACD,iBAAiB,EAAE;QACjB,EAAE,EAAE,oCAAoC;QACxC,QAAQ,EAAE,kCAAkC;KAC7C;IACD,iBAAiB,EAAE;QACjB,EAAE,EAAE,oCAAoC;QACxC,QAAQ,EAAE,kCAAkC;KAC7C;CAC8D,CAAC,CAAC;AAEnE,MAAM,UAAU,kCAAkC,CAChD,oBAA+C;IAE/C,IAAI,CAAC,oBAAoB;QAAE,OAAO,IAAI,CAAC;IACvC,OACE,sCAGD,CAAC,oBAAoB,CAAC,IAAI,IAAI,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,8BAA8B,CAC5C,SAA6C,EAC7C,MAAmC;IAEnC,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAC/B,CAAC,SAAS,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,CACjD,CAAC;IACF,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAC3B,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAC9D,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,OAAsB;IAC7C,OAAO,GAAG,OAAO,CAAC,IAAI,SAAS,OAAO,CAAC,OAAO,CAAC,MAAM,SAAS,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;AACxF,CAAC"}
@@ -0,0 +1,99 @@
1
+ import type { BrandlabFinding, BrandlabFindingClassification, ConformanceSummary } from "./project.js";
2
+ export declare const BRANDLAB_VERIFICATION_POLICY_VERSION = "simplified-v1";
3
+ export declare const BRANDLAB_VERIFICATION_FAMILIES: readonly [{
4
+ readonly id: "runtime-security";
5
+ readonly title: "Runtime and security";
6
+ readonly purpose: "Supported patched runtime, headers and server-only safety.";
7
+ }, {
8
+ readonly id: "release-integrity";
9
+ readonly title: "Release integrity";
10
+ readonly purpose: "One exact Brandlab release with reproducible package provenance.";
11
+ }, {
12
+ readonly id: "project-verification";
13
+ readonly title: "Project verification";
14
+ readonly purpose: "Typecheck, tests and production build complete successfully.";
15
+ }, {
16
+ readonly id: "contact-delivery";
17
+ readonly title: "Contact delivery";
18
+ readonly purpose: "Shared validation, delivery, error handling and duplicate protection.";
19
+ }, {
20
+ readonly id: "analytics-privacy";
21
+ readonly title: "Analytics privacy";
22
+ readonly purpose: "No lead PII reaches analytics or public runtime configuration.";
23
+ }, {
24
+ readonly id: "analytics-conversion";
25
+ readonly title: "Analytics conversion";
26
+ readonly purpose: "Canonical calls and accepted contact submissions are tracked once.";
27
+ }, {
28
+ readonly id: "search-routing";
29
+ readonly title: "Search routing";
30
+ readonly purpose: "Canonical, robots, breadcrumbs and sitemap output agree.";
31
+ }, {
32
+ readonly id: "structured-data";
33
+ readonly title: "Structured data";
34
+ readonly purpose: "Valid schema without synthetic offers or prohibited ratings.";
35
+ }, {
36
+ readonly id: "business-identity";
37
+ readonly title: "Business identity";
38
+ readonly purpose: "Public business facts match the verified operating model.";
39
+ }, {
40
+ readonly id: "route-identity";
41
+ readonly title: "Route identity";
42
+ readonly purpose: "Routes have stable IDs and unique canonical search identity.";
43
+ }, {
44
+ readonly id: "copy-safety";
45
+ readonly title: "Customer copy safety";
46
+ readonly purpose: "No placeholder, implementation-facing or unsupported public copy.";
47
+ }, {
48
+ readonly id: "duplicate-content";
49
+ readonly title: "Duplicate content";
50
+ readonly purpose: "No exact duplicate or clear location-token-substitution page.";
51
+ }, {
52
+ readonly id: "accessibility";
53
+ readonly title: "Accessibility";
54
+ readonly purpose: "Representative pages have no serious interaction or Axe failures.";
55
+ }, {
56
+ readonly id: "deployment-provenance";
57
+ readonly title: "Deployment provenance";
58
+ readonly purpose: "Release evidence matches the reviewed source and deployment.";
59
+ }, {
60
+ readonly id: "source-safety";
61
+ readonly title: "Source safety";
62
+ readonly purpose: "No secret leakage or unsafe local reimplementation of protected behaviour.";
63
+ }];
64
+ export type BrandlabVerificationFamilyId = (typeof BRANDLAB_VERIFICATION_FAMILIES)[number]["id"];
65
+ export interface BrandlabOperationalFinding extends BrandlabFinding {
66
+ familyId: BrandlabVerificationFamilyId;
67
+ }
68
+ export interface BrandlabVerificationFamilyResult {
69
+ id: BrandlabVerificationFamilyId;
70
+ title: string;
71
+ purpose: string;
72
+ status: "pass" | "warning" | "blocked";
73
+ blockers: number;
74
+ warnings: number;
75
+ info: number;
76
+ sourceRuleIds: string[];
77
+ }
78
+ export interface BrandlabVerificationResult {
79
+ policyVersion: typeof BRANDLAB_VERIFICATION_POLICY_VERSION;
80
+ familyCount: typeof BRANDLAB_VERIFICATION_FAMILIES.length;
81
+ status: "pass" | "warning" | "blocked";
82
+ maintenance: ConformanceSummary;
83
+ migration: ConformanceSummary;
84
+ advisory: ConformanceSummary;
85
+ families: BrandlabVerificationFamilyResult[];
86
+ }
87
+ export interface BrandlabDiagnosticsResult {
88
+ findings: BrandlabFinding[];
89
+ maintenance: ConformanceSummary;
90
+ migration: ConformanceSummary;
91
+ advisory: ConformanceSummary;
92
+ }
93
+ export declare function applyBrandlabVerificationPolicy(findings: readonly BrandlabFinding[]): {
94
+ operationalFindings: BrandlabOperationalFinding[];
95
+ diagnostics: BrandlabFinding[];
96
+ verification: BrandlabVerificationResult;
97
+ };
98
+ export declare function summarizeVerificationFindings(findings: readonly BrandlabFinding[], classification: BrandlabFindingClassification): ConformanceSummary;
99
+ //# sourceMappingURL=verification-policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verification-policy.d.ts","sourceRoot":"","sources":["../src/verification-policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,6BAA6B,EAC7B,kBAAkB,EACnB,MAAM,cAAc,CAAC;AAEtB,eAAO,MAAM,oCAAoC,kBAAkB,CAAC;AAEpE,eAAO,MAAM,8BAA8B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4EjC,CAAC;AAEX,MAAM,MAAM,4BAA4B,GACtC,CAAC,OAAO,8BAA8B,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC;AAExD,MAAM,WAAW,0BAA2B,SAAQ,eAAe;IACjE,QAAQ,EAAE,4BAA4B,CAAC;CACxC;AAED,MAAM,WAAW,gCAAgC;IAC/C,EAAE,EAAE,4BAA4B,CAAC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,0BAA0B;IACzC,aAAa,EAAE,OAAO,oCAAoC,CAAC;IAC3D,WAAW,EAAE,OAAO,8BAA8B,CAAC,MAAM,CAAC;IAC1D,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;IACvC,WAAW,EAAE,kBAAkB,CAAC;IAChC,SAAS,EAAE,kBAAkB,CAAC;IAC9B,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,QAAQ,EAAE,gCAAgC,EAAE,CAAC;CAC9C;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,WAAW,EAAE,kBAAkB,CAAC;IAChC,SAAS,EAAE,kBAAkB,CAAC;IAC9B,QAAQ,EAAE,kBAAkB,CAAC;CAC9B;AAED,wBAAgB,+BAA+B,CAC7C,QAAQ,EAAE,SAAS,eAAe,EAAE,GACnC;IACD,mBAAmB,EAAE,0BAA0B,EAAE,CAAC;IAClD,WAAW,EAAE,eAAe,EAAE,CAAC;IAC/B,YAAY,EAAE,0BAA0B,CAAC;CAC1C,CA4DA;AAsGD,wBAAgB,6BAA6B,CAC3C,QAAQ,EAAE,SAAS,eAAe,EAAE,EACpC,cAAc,EAAE,6BAA6B,GAC5C,kBAAkB,CAcpB"}
@@ -0,0 +1,219 @@
1
+ export const BRANDLAB_VERIFICATION_POLICY_VERSION = "simplified-v1";
2
+ export const BRANDLAB_VERIFICATION_FAMILIES = [
3
+ {
4
+ id: "runtime-security",
5
+ title: "Runtime and security",
6
+ purpose: "Supported patched runtime, headers and server-only safety.",
7
+ },
8
+ {
9
+ id: "release-integrity",
10
+ title: "Release integrity",
11
+ purpose: "One exact Brandlab release with reproducible package provenance.",
12
+ },
13
+ {
14
+ id: "project-verification",
15
+ title: "Project verification",
16
+ purpose: "Typecheck, tests and production build complete successfully.",
17
+ },
18
+ {
19
+ id: "contact-delivery",
20
+ title: "Contact delivery",
21
+ purpose: "Shared validation, delivery, error handling and duplicate protection.",
22
+ },
23
+ {
24
+ id: "analytics-privacy",
25
+ title: "Analytics privacy",
26
+ purpose: "No lead PII reaches analytics or public runtime configuration.",
27
+ },
28
+ {
29
+ id: "analytics-conversion",
30
+ title: "Analytics conversion",
31
+ purpose: "Canonical calls and accepted contact submissions are tracked once.",
32
+ },
33
+ {
34
+ id: "search-routing",
35
+ title: "Search routing",
36
+ purpose: "Canonical, robots, breadcrumbs and sitemap output agree.",
37
+ },
38
+ {
39
+ id: "structured-data",
40
+ title: "Structured data",
41
+ purpose: "Valid schema without synthetic offers or prohibited ratings.",
42
+ },
43
+ {
44
+ id: "business-identity",
45
+ title: "Business identity",
46
+ purpose: "Public business facts match the verified operating model.",
47
+ },
48
+ {
49
+ id: "route-identity",
50
+ title: "Route identity",
51
+ purpose: "Routes have stable IDs and unique canonical search identity.",
52
+ },
53
+ {
54
+ id: "copy-safety",
55
+ title: "Customer copy safety",
56
+ purpose: "No placeholder, implementation-facing or unsupported public copy.",
57
+ },
58
+ {
59
+ id: "duplicate-content",
60
+ title: "Duplicate content",
61
+ purpose: "No exact duplicate or clear location-token-substitution page.",
62
+ },
63
+ {
64
+ id: "accessibility",
65
+ title: "Accessibility",
66
+ purpose: "Representative pages have no serious interaction or Axe failures.",
67
+ },
68
+ {
69
+ id: "deployment-provenance",
70
+ title: "Deployment provenance",
71
+ purpose: "Release evidence matches the reviewed source and deployment.",
72
+ },
73
+ {
74
+ id: "source-safety",
75
+ title: "Source safety",
76
+ purpose: "No secret leakage or unsafe local reimplementation of protected behaviour.",
77
+ },
78
+ ];
79
+ export function applyBrandlabVerificationPolicy(findings) {
80
+ const operationalFindings = [];
81
+ const diagnostics = [];
82
+ for (const finding of findings) {
83
+ const familyId = familyForFinding(finding);
84
+ if (isOperationalFinding(finding, familyId)) {
85
+ operationalFindings.push({ ...finding, familyId });
86
+ }
87
+ else {
88
+ diagnostics.push(finding);
89
+ }
90
+ }
91
+ const families = BRANDLAB_VERIFICATION_FAMILIES.map((definition) => {
92
+ const scoped = operationalFindings.filter((finding) => finding.familyId === definition.id);
93
+ const blockers = scoped.filter((finding) => finding.severity === "blocker").length;
94
+ const warnings = scoped.filter((finding) => finding.severity === "warning").length;
95
+ const info = scoped.filter((finding) => finding.severity === "info").length;
96
+ return {
97
+ ...definition,
98
+ status: blockers > 0 ? "blocked" : warnings > 0 ? "warning" : "pass",
99
+ blockers,
100
+ warnings,
101
+ info,
102
+ sourceRuleIds: [...new Set(scoped.map((finding) => finding.ruleId))].sort(),
103
+ };
104
+ });
105
+ const maintenance = summarizeVerificationFindings(operationalFindings, "maintenance");
106
+ const migration = summarizeVerificationFindings(operationalFindings, "migration");
107
+ const advisory = summarizeVerificationFindings(operationalFindings, "advisory");
108
+ return {
109
+ operationalFindings,
110
+ diagnostics,
111
+ verification: {
112
+ policyVersion: BRANDLAB_VERIFICATION_POLICY_VERSION,
113
+ familyCount: BRANDLAB_VERIFICATION_FAMILIES.length,
114
+ status: maintenance.blockers > 0 || migration.blockers > 0
115
+ ? "blocked"
116
+ : maintenance.warnings > 0 || migration.warnings > 0
117
+ ? "warning"
118
+ : "pass",
119
+ maintenance,
120
+ migration,
121
+ advisory,
122
+ families,
123
+ },
124
+ };
125
+ }
126
+ function familyForFinding(finding) {
127
+ const id = finding.ruleId;
128
+ const surface = finding.surface;
129
+ if (surface === "release")
130
+ return "release-integrity";
131
+ if (surface === "runtime" ||
132
+ surface === "headers" ||
133
+ surface === "security" ||
134
+ surface === "environment") {
135
+ return "runtime-security";
136
+ }
137
+ if (surface.startsWith("contact"))
138
+ return "contact-delivery";
139
+ if (surface === "analytics") {
140
+ return /\b(?:pii|privacy|email|phone-number|lead-diagnostic|public-env)\b/i.test(id)
141
+ ? "analytics-privacy"
142
+ : "analytics-conversion";
143
+ }
144
+ if (surface === "metadata" ||
145
+ surface === "sitemap" ||
146
+ surface === "sitemap-catalog" ||
147
+ surface === "robots" ||
148
+ surface === "breadcrumbs" ||
149
+ surface === "search-certification") {
150
+ return "search-routing";
151
+ }
152
+ if (surface === "schema" ||
153
+ surface === "schema-graph" ||
154
+ surface === "reviews" ||
155
+ surface === "project-reviews" ||
156
+ surface.startsWith("google-reviews")) {
157
+ return "structured-data";
158
+ }
159
+ if (surface === "business" || surface === "location-proof") {
160
+ return "business-identity";
161
+ }
162
+ if (surface === "routes")
163
+ return "route-identity";
164
+ if (surface === "location-quality" || id.includes("rendered-content")) {
165
+ return "duplicate-content";
166
+ }
167
+ if (surface === "accessibility")
168
+ return "accessibility";
169
+ if (surface === "deployment")
170
+ return "deployment-provenance";
171
+ if (surface === "content")
172
+ return "copy-safety";
173
+ return "source-safety";
174
+ }
175
+ function isOperationalFinding(finding, familyId) {
176
+ if (finding.classification === "advisory")
177
+ return false;
178
+ switch (familyId) {
179
+ case "release-integrity":
180
+ case "runtime-security":
181
+ case "contact-delivery":
182
+ case "structured-data":
183
+ case "accessibility":
184
+ case "deployment-provenance":
185
+ return true;
186
+ case "analytics-privacy":
187
+ return true;
188
+ case "analytics-conversion":
189
+ return /(?:event|conversion|accepted|contact|phone|send-to|dedup|duplicate|unsafe)/i.test(finding.ruleId);
190
+ case "search-routing":
191
+ return /(?:canonical|robots|sitemap|breadcrumb|framework-output|duplicate-brand-title|unsafe-metadata)/i.test(finding.ruleId);
192
+ case "business-identity":
193
+ return /(?:service-area-public-address|address-leak|hidden-address|synthetic-review|hardcoded-google-review)/i.test(finding.ruleId);
194
+ case "route-identity":
195
+ return /(?:project-id|route-(?:id|path|canonical)|duplicate-route|config-v[2345]-(?:missing|syntax|export|object))/.test(finding.ruleId);
196
+ case "copy-safety":
197
+ return /(?:placeholder|template|implementation|helper-language|unsupported-claim)/i.test(finding.ruleId);
198
+ case "duplicate-content":
199
+ return /(?:exact-duplicate|token-substitution)/i.test(finding.ruleId);
200
+ case "source-safety":
201
+ return /(?:secret|unsafe|raw-json|raw-schema|local-contact|local-analytics|local-google-reviews|self-serving|prohibited)/i.test(finding.ruleId);
202
+ case "project-verification":
203
+ return true;
204
+ }
205
+ }
206
+ export function summarizeVerificationFindings(findings, classification) {
207
+ const scoped = findings.filter((finding) => finding.classification === classification);
208
+ const blockers = scoped.filter((finding) => finding.severity === "blocker").length;
209
+ const warnings = scoped.filter((finding) => finding.severity === "warning").length;
210
+ const info = scoped.filter((finding) => finding.severity === "info").length;
211
+ return {
212
+ status: blockers > 0 ? "blocked" : warnings > 0 ? "warning" : "pass",
213
+ total: scoped.length,
214
+ blockers,
215
+ warnings,
216
+ info,
217
+ };
218
+ }
219
+ //# sourceMappingURL=verification-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verification-policy.js","sourceRoot":"","sources":["../src/verification-policy.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,11 +1,17 @@
1
1
  {
2
2
  "name": "@brandlab-digital/conformance",
3
- "version": "1.0.0-rc.2",
3
+ "version": "1.0.0-rc.21",
4
+ "repository": {
5
+ "type": "git",
6
+ "url": "git+https://github.com/RomieDandan/brandlab.git",
7
+ "directory": "standards/source/packages/conformance"
8
+ },
4
9
  "private": false,
5
10
  "type": "module",
6
11
  "sideEffects": false,
7
12
  "bin": {
8
- "brandlab-conformance": "./dist/cli.js"
13
+ "brandlab-verify": "dist/cli.js",
14
+ "brandlab-conformance": "dist/cli.js"
9
15
  },
10
16
  "files": [
11
17
  "dist"
@@ -54,6 +60,18 @@
54
60
  "./schema-hygiene": {
55
61
  "types": "./dist/schema-hygiene.d.ts",
56
62
  "import": "./dist/schema-hygiene.js"
63
+ },
64
+ "./project-documentation": {
65
+ "types": "./dist/project-documentation.d.ts",
66
+ "import": "./dist/project-documentation.js"
67
+ },
68
+ "./analytics-contract": {
69
+ "types": "./dist/analytics-contract.d.ts",
70
+ "import": "./dist/analytics-contract.js"
71
+ },
72
+ "./rendered-content": {
73
+ "types": "./dist/rendered-content.d.ts",
74
+ "import": "./dist/rendered-content.js"
57
75
  }
58
76
  }
59
77
  }