@growth-labs/conformance 0.3.1 → 0.5.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.
- package/CHANGELOG.md +66 -0
- package/README.md +45 -1
- package/dist/endpoint.d.ts +21 -0
- package/dist/endpoint.d.ts.map +1 -0
- package/dist/endpoint.js +225 -0
- package/dist/endpoint.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/runner.js +71 -5
- package/dist/runner.js.map +1 -1
- package/dist/schema.d.ts +255 -142
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +23 -3
- package/dist/schema.js.map +1 -1
- package/fixtures/negative/required-negative-fixtures.json +49 -0
- package/package.json +5 -1
- package/src/endpoint.ts +279 -0
- package/src/index.ts +4 -0
- package/src/runner.ts +81 -5
- package/src/schema.ts +27 -3
package/dist/schema.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,eAAO,MAAM,uBAAuB,+BAA+B,CAAA;AACnE,eAAO,MAAM,+BAA+B,6EAOlC,CAAA;AAEV,eAAO,MAAM,+BAA+B
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,eAAO,MAAM,uBAAuB,+BAA+B,CAAA;AACnE,eAAO,MAAM,+BAA+B,6EAOlC,CAAA;AAEV,eAAO,MAAM,+BAA+B;;;;;;;;;;;;;;;;;;;;;;;CAwBlC,CAAA;AAEV,MAAM,MAAM,yBAAyB,GAAG,MAAM,OAAO,+BAA+B,CAAA;AACpF,MAAM,MAAM,2BAA2B,GACtC,CAAC,OAAO,+BAA+B,CAAC,CAAC,yBAAyB,CAAC,CAAA;AAEpE,eAAO,MAAM,cAAc,8EAOzB,CAAA;AACF,eAAO,MAAM,gBAAgB,8BAA4B,CAAA;AACzD,eAAO,MAAM,iBAAiB,mCAAiC,CAAA;AAC/D,eAAO,MAAM,qBAAqB,iCAA+B,CAAA;AAEjE,eAAO,MAAM,iBAAiB,4DAA6C,CAAA;AAC3E,eAAO,MAAM,eAAe,sFAA8B,CAAA;AAE1D,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;EAMhC,CAAA;AAEF,eAAO,MAAM,6BAA6B,wCAAsC,CAAA;AAEhF,eAAO,MAAM,oCAAoC;;;;;;;;;;;;EAW/C,CAAA;AAEF,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAenC,CAAA;AAEF,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;EAO7B,CAAA;AAEF,eAAO,MAAM,oCAAoC;;;;;;;;;;;;;;;;;;EAM/C,CAAA;AAEF,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;EAOjC,CAAA;AAEF,eAAO,MAAM,mCAAmC;;;;;;;;;;;;;;;;;;;;;;;;;;;EAO9C,CAAA;AAEF,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAMgB,CAAA;AAEnD,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;EAO9B,CAAA;AAqEF,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAQpC,CAAA;AAEF,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAcnC,CAAA;AAEF,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;EAOnC,CAAA;AAEF,eAAO,MAAM,6BAA6B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAIxC,CAAA;AAEF,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;EAKhC,CAAA;AAEF,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAYnC,CAAA;AAEF,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAQpC,CAAA;AAEF,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAA;AACrD,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAA;AACzD,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAA;AACvD,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAA;AACnE,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,6BAA6B,CAAC,CAAA;AACnF,MAAM,MAAM,8BAA8B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oCAAoC,CAAC,CAAA;AACjG,MAAM,MAAM,0BAA0B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAA;AACjF,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAA;AAC7D,MAAM,MAAM,8BAA8B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oCAAoC,CAAC,CAAA;AACjG,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAA;AACrE,MAAM,MAAM,6BAA6B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mCAAmC,CAAC,CAAA;AAC/F,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAA;AACrE,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAA;AAC/D,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAA;AAC9E,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAA;AACzE,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAA;AACzE,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,6BAA6B,CAAC,CAAA;AACnF,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAA;AACnE,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAA;AACzE,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAA;AAE3E,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,kBAAkB,CAE1E;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,OAAO,GAAG,kBAAkB,CAE7E;AAED,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,OAAO,GAAG,mBAAmB,CAE/E"}
|
package/dist/schema.js
CHANGED
|
@@ -30,6 +30,7 @@ export const REQUIRED_NEGATIVE_FIXTURE_CODES = {
|
|
|
30
30
|
'missing-max-image-preview-large': 'metadata.robots.missing_max_image_preview_large',
|
|
31
31
|
'crawler-public-cache-key-collision': 'cache.crawler_public_key_collision',
|
|
32
32
|
'runtime-canonical-override-not-applied': 'metadata.canonical.runtime_override_not_applied',
|
|
33
|
+
'llms-runtime-static-shadow': 'publication.surface.static_shadow',
|
|
33
34
|
};
|
|
34
35
|
export const audienceSchema = z.enum([
|
|
35
36
|
'public',
|
|
@@ -51,6 +52,19 @@ export const surfaceResponseSchema = z.object({
|
|
|
51
52
|
html: z.string().optional(),
|
|
52
53
|
body: z.string().optional(),
|
|
53
54
|
});
|
|
55
|
+
export const publicationSurfaceOwnerSchema = z.enum(['runtime', 'static', 'na']);
|
|
56
|
+
export const publicationSurfaceOwnerReceiptSchema = z.object({
|
|
57
|
+
collector: z.string().regex(/^[a-z0-9][a-z0-9:._-]*@[0-9]+$/i, {
|
|
58
|
+
message: 'collector must be a versioned identifier such as tool-name@1',
|
|
59
|
+
}),
|
|
60
|
+
observedAt: z
|
|
61
|
+
.string()
|
|
62
|
+
.regex(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?(Z|[+-]\d{2}:\d{2})$/, {
|
|
63
|
+
message: 'observedAt must be an ISO date-time with timezone, e.g. 2026-07-15T23:30:00Z',
|
|
64
|
+
})
|
|
65
|
+
.optional(),
|
|
66
|
+
signalHash: z.string().regex(/^sha256:[0-9a-f]{64}$/),
|
|
67
|
+
});
|
|
54
68
|
export const publicationSurfaceSchema = z.object({
|
|
55
69
|
name: z.string().min(1),
|
|
56
70
|
status: z.enum(['present', 'missing', 'na']),
|
|
@@ -60,6 +74,12 @@ export const publicationSurfaceSchema = z.object({
|
|
|
60
74
|
bodyBytes: z.number().int().nonnegative().optional(),
|
|
61
75
|
capabilityBoundary: z.string().min(1).optional(),
|
|
62
76
|
evidence: z.string().min(1).optional(),
|
|
77
|
+
intendedOwner: publicationSurfaceOwnerSchema.optional(),
|
|
78
|
+
observedOwner: publicationSurfaceOwnerSchema.optional(),
|
|
79
|
+
ownerReceipt: publicationSurfaceOwnerReceiptSchema.optional(),
|
|
80
|
+
staticEntryCount: z.number().int().nonnegative().optional(),
|
|
81
|
+
observedCount: z.number().int().nonnegative().optional(),
|
|
82
|
+
minimumCount: z.number().int().nonnegative().optional(),
|
|
63
83
|
});
|
|
64
84
|
export const cacheVariantSchema = z.object({
|
|
65
85
|
audience: audienceSchema,
|
|
@@ -72,14 +92,14 @@ export const cacheVariantSchema = z.object({
|
|
|
72
92
|
export const securityFunctionalProbeReceiptSchema = z.object({
|
|
73
93
|
name: z.string().min(1),
|
|
74
94
|
status: checkStatusSchema,
|
|
75
|
-
checkedAt: z.string().
|
|
95
|
+
checkedAt: z.string().datetime({ offset: true }),
|
|
76
96
|
evidence: z.string().min(1).optional(),
|
|
77
97
|
capabilityBoundary: z.string().min(1).optional(),
|
|
78
98
|
});
|
|
79
99
|
export const cspReportReceiptSchema = z.object({
|
|
80
100
|
name: z.string().min(1),
|
|
81
101
|
status: checkStatusSchema,
|
|
82
|
-
checkedAt: z.string().
|
|
102
|
+
checkedAt: z.string().datetime({ offset: true }),
|
|
83
103
|
evidence: z.string().min(1).optional(),
|
|
84
104
|
endpoint: z.string().min(1).optional(),
|
|
85
105
|
capabilityBoundary: z.string().min(1).optional(),
|
|
@@ -102,7 +122,7 @@ export const securityReceiptsSchema = z
|
|
|
102
122
|
export const buildEvidenceSchema = z.object({
|
|
103
123
|
commitSha: z.string().min(7).optional(),
|
|
104
124
|
artifactId: z.string().min(1).optional(),
|
|
105
|
-
generatedAt: z.string().
|
|
125
|
+
generatedAt: z.string().datetime({ offset: true }).optional(),
|
|
106
126
|
packageVersions: z.record(z.string().min(1)).default({}),
|
|
107
127
|
staticHeaderPolicy: z.boolean().default(false),
|
|
108
128
|
ssrHeaderPolicy: z.boolean().default(false),
|
package/dist/schema.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,MAAM,CAAC,MAAM,uBAAuB,GAAG,4BAA4B,CAAA;AACnE,MAAM,CAAC,MAAM,+BAA+B,GAAG;IAC9C,OAAO;IACP,OAAO;IACP,QAAQ;IACR,WAAW;IACX,QAAQ;IACR,aAAa;CACJ,CAAA;AAEV,MAAM,CAAC,MAAM,+BAA+B,GAAG;IAC9C,mBAAmB,EAAE,4BAA4B;IACjD,cAAc,EAAE,yBAAyB;IACzC,cAAc,EAAE,yBAAyB;IACzC,qBAAqB,EAAE,+BAA+B;IACtD,0BAA0B,EAAE,mCAAmC;IAC/D,iBAAiB,EAAE,0BAA0B;IAC7C,6CAA6C,EAC5C,sDAAsD;IACvD,yCAAyC,EAAE,kDAAkD;IAC7F,uCAAuC,EAAE,oCAAoC;IAC7E,kCAAkC,EAAE,mCAAmC;IACvE,4BAA4B,EAAE,6BAA6B;IAC3D,2BAA2B,EAAE,4BAA4B;IACzD,uCAAuC,EAAE,sCAAsC;IAC/E,eAAe,EAAE,2BAA2B;IAC5C,oCAAoC,EAAE,oDAAoD;IAC1F,oCAAoC,EAAE,oDAAoD;IAC1F,0BAA0B,EAAE,2BAA2B;IACvD,mBAAmB,EAAE,wBAAwB;IAC7C,iCAAiC,EAAE,iDAAiD;IACpF,oCAAoC,EAAE,oCAAoC;IAC1E,wCAAwC,EAAE,iDAAiD;CAClF,CAAA;AAMV,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,IAAI,CAAC;IACpC,QAAQ;IACR,SAAS;IACT,YAAY;IACZ,QAAQ;IACR,OAAO;IACP,SAAS;CACT,CAAC,CAAA;AACF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAA;AACzD,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAA;AAC/D,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAA;AAEjE,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAA;AAC3E,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAA;AAE1D,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;IACvD,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IAChC,OAAO,EAAE,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;IACpC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC3B,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;IAC5C,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IAChC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;IACzD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACzC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;IACpD,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IAChD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;CACtC,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,QAAQ,EAAE,cAAc;IACxB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3B,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IAChC,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;IAC3E,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAC5C,OAAO,EAAE,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;CACpC,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,oCAAoC,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5D,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,MAAM,EAAE,iBAAiB;IACzB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACvC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACtC,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;CAChD,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,MAAM,EAAE,iBAAiB;IACzB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACvC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACtC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACtC,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;CAChD,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,mCAAmC,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3D,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,gBAAgB,CAAC;IAC7C,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IAC5C,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC;QAClB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,4BAA4B,CAAC;QACpD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,uBAAuB,CAAC;KACrD,CAAC;CACF,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC;KACrC,MAAM,CAAC;IACP,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAC3E,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACvD,qBAAqB,EAAE,mCAAmC,CAAC,QAAQ,EAAE;CACrE,CAAC;KACD,OAAO,CAAC,EAAE,gBAAgB,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAA;AAEnD,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACvC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACxC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACzC,eAAe,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACxD,kBAAkB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IAC9C,eAAe,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;CAC3C,CAAC,CAAA;AAEF,MAAM,yBAAyB,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,WAAW,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE;IAC5E,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,QAAQ;QAAE,OAAM;IAC7E,IAAI,MAAW,CAAA;IACf,IAAI,CAAC;QACJ,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAA;IACzB,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,CAAC,QAAQ,CAAC;YAChB,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM;YAC3B,OAAO,EAAE,4DAA4D;SACrE,CAAC,CAAA;QACF,OAAM;IACP,CAAC;IACD,IACC,MAAM,CAAC,QAAQ,KAAK,QAAQ;QAC5B,MAAM,CAAC,QAAQ,KAAK,EAAE;QACtB,MAAM,CAAC,QAAQ,KAAK,EAAE;QACtB,MAAM,CAAC,MAAM,KAAK,EAAE;QACpB,MAAM,CAAC,IAAI,KAAK,EAAE;QAClB,MAAM,KAAK,MAAM,CAAC,MAAM,EACvB,CAAC;QACF,OAAO,CAAC,QAAQ,CAAC;YAChB,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM;YAC3B,OAAO,EAAE,4DAA4D;SACrE,CAAC,CAAA;IACH,CAAC;AACF,CAAC,CAAC,CAAA;AAEF,MAAM,iBAAiB,GAAG,CAAC;KACzB,MAAM,CAAC;IACP,SAAS,EAAE,CAAC;SACV,KAAK,CAAC,yBAAyB,CAAC;SAChC,GAAG,CAAC,CAAC,CAAC;SACN,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,MAAM,EAAE;QAC9D,OAAO,EAAE,wCAAwC;KACjD,CAAC;IACH,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;CACpD,CAAC;KACD,WAAW,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE;IAChC,IAAI,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1E,OAAO,CAAC,QAAQ,CAAC;YAChB,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM;YAC3B,IAAI,EAAE,CAAC,WAAW,CAAC;YACnB,OAAO,EAAE,kEAAkE;SAC3E,CAAC,CAAA;IACH,CAAC;IACD,IACC,MAAM,CAAC,YAAY,KAAK,MAAM;QAC9B,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,EAClE,CAAC;QACF,OAAO,CAAC,QAAQ,CAAC;YAChB,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM;YAC3B,IAAI,EAAE,CAAC,cAAc,CAAC;YACtB,OAAO,EAAE,sDAAsD;SAC/D,CAAC,CAAA;IACH,CAAC;IACD,IACC,MAAM,CAAC,YAAY,KAAK,YAAY;QACpC,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,EAClE,CAAC;QACF,OAAO,CAAC,QAAQ,CAAC;YAChB,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM;YAC3B,IAAI,EAAE,CAAC,cAAc,CAAC;YACtB,OAAO,EAAE,4DAA4D;SACrE,CAAC,CAAA;IACH,CAAC;AACF,CAAC,CAAC,CAAA;AAEH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC,MAAM,CAAC;IACjD,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IACzC,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACnD,gBAAgB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IAC3C,WAAW,EAAE,iBAAiB,CAAC,OAAO,CAAC;QACtC,SAAS,EAAE,CAAC,QAAQ,CAAC;QACrB,YAAY,EAAE,MAAM;KACpB,CAAC;CACF,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChD,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACrB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC;IACpD,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;IACrB,UAAU,EAAE,gBAAgB;IAC5B,QAAQ,EAAE,cAAc;IACxB,QAAQ,EAAE,qBAAqB;IAC/B,QAAQ,EAAE,yBAAyB,CAAC,OAAO,CAAC,EAAE,CAAC;IAC/C,mBAAmB,EAAE,CAAC,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAClE,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACtD,gBAAgB,EAAE,sBAAsB;IACxC,aAAa,EAAE,mBAAmB,CAAC,QAAQ,EAAE;IAC7C,mBAAmB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;CACjD,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,QAAQ,EAAE,qBAAqB;IAC/B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IAClC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACtC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;CACzC,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,CAAC,MAAM,CAAC;IACrD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,MAAM,EAAE,iBAAiB;IACzB,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,wBAAwB,CAAC;CAC3C,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;IACpC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;IACpC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;IAClC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;CACxC,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChD,aAAa,EAAE,CAAC,CAAC,OAAO,CAAC,uBAAuB,CAAC;IACjD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9B,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;IACrB,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,OAAO,EAAE,qBAAqB;IAC9B,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,6BAA6B,CAAC;IAC9C,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,wBAAwB,CAAC;IAC3C,gBAAgB,EAAE,sBAAsB;CACxC,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC,MAAM,CAAC;IACjD,aAAa,EAAE,CAAC,CAAC,OAAO,CAAC,uBAAuB,CAAC;IACjD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9B,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,OAAO,EAAE,qBAAqB,CAAC,MAAM,CAAC;QACrC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;KACrC,CAAC;IACF,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,wBAAwB,CAAC;CACxC,CAAC,CAAA;AAqBF,MAAM,UAAU,uBAAuB,CAAC,KAAc;IACrD,OAAO,wBAAwB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;AAC7C,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,KAAc;IACxD,OAAO,wBAAwB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;AAC7C,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,KAAc;IACzD,OAAO,yBAAyB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;AAC9C,CAAC"}
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -270,5 +270,54 @@
|
|
|
270
270
|
"canonicalUrl": "https://fixture.example/articles/runtime-canonical"
|
|
271
271
|
}
|
|
272
272
|
}
|
|
273
|
+
},
|
|
274
|
+
{
|
|
275
|
+
"name": "llms-runtime-static-shadow",
|
|
276
|
+
"expectedFailingCode": "publication.surface.static_shadow",
|
|
277
|
+
"patch": {
|
|
278
|
+
"publicationSurfaces": [
|
|
279
|
+
{
|
|
280
|
+
"name": "sitemap",
|
|
281
|
+
"status": "present",
|
|
282
|
+
"url": "https://fixture.example/sitemap.xml",
|
|
283
|
+
"httpStatus": 200,
|
|
284
|
+
"contentType": "application/xml",
|
|
285
|
+
"bodyBytes": 640
|
|
286
|
+
},
|
|
287
|
+
{
|
|
288
|
+
"name": "robots",
|
|
289
|
+
"status": "present",
|
|
290
|
+
"url": "https://fixture.example/robots.txt",
|
|
291
|
+
"httpStatus": 200,
|
|
292
|
+
"contentType": "text/plain",
|
|
293
|
+
"bodyBytes": 180
|
|
294
|
+
},
|
|
295
|
+
{
|
|
296
|
+
"name": "feed",
|
|
297
|
+
"status": "present",
|
|
298
|
+
"url": "https://fixture.example/feed.xml",
|
|
299
|
+
"httpStatus": 200,
|
|
300
|
+
"contentType": "application/rss+xml",
|
|
301
|
+
"bodyBytes": 940
|
|
302
|
+
},
|
|
303
|
+
{
|
|
304
|
+
"name": "llms",
|
|
305
|
+
"status": "present",
|
|
306
|
+
"httpStatus": 200,
|
|
307
|
+
"contentType": "text/plain",
|
|
308
|
+
"bodyBytes": 1420,
|
|
309
|
+
"intendedOwner": "runtime",
|
|
310
|
+
"observedOwner": "static",
|
|
311
|
+
"ownerReceipt": {
|
|
312
|
+
"collector": "astro-build-artifact-inspector@1",
|
|
313
|
+
"observedAt": "2026-07-15T23:30:00Z",
|
|
314
|
+
"signalHash": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
|
|
315
|
+
},
|
|
316
|
+
"staticEntryCount": 14,
|
|
317
|
+
"observedCount": 0,
|
|
318
|
+
"minimumCount": 1
|
|
319
|
+
}
|
|
320
|
+
]
|
|
321
|
+
}
|
|
273
322
|
}
|
|
274
323
|
]
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@growth-labs/conformance",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "Reusable fleet publication conformance harness for Growth Labs sites: headers, cache, metadata, structured data, images, publication surfaces, and evidence bundles.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -16,6 +16,10 @@
|
|
|
16
16
|
"./schema": {
|
|
17
17
|
"types": "./dist/schema.d.ts",
|
|
18
18
|
"import": "./dist/schema.js"
|
|
19
|
+
},
|
|
20
|
+
"./endpoint": {
|
|
21
|
+
"types": "./dist/endpoint.d.ts",
|
|
22
|
+
"import": "./dist/endpoint.js"
|
|
19
23
|
}
|
|
20
24
|
},
|
|
21
25
|
"files": [
|
package/src/endpoint.ts
ADDED
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
import { z } from 'zod'
|
|
2
|
+
import { buildEvidenceSchema, siteEvidenceBundleSchema } from './schema.js'
|
|
3
|
+
|
|
4
|
+
export const CONFORMANCE_ENDPOINT_MAX_BYTES = 1024 * 1024
|
|
5
|
+
|
|
6
|
+
const COMMIT_SHA_PATTERN = /^[0-9a-f]{40}$/
|
|
7
|
+
const CONTENT_TYPE = 'application/json; charset=utf-8'
|
|
8
|
+
const GENERIC_FAILURE_BODY = '{"status":"unavailable"}'
|
|
9
|
+
const INIT_FAILURE_DIAGNOSTIC =
|
|
10
|
+
'[conformance] initConformanceEndpoint: artifact validation failed at init'
|
|
11
|
+
|
|
12
|
+
// Single stripping schema: validates endpoint buildEvidence and the v2 bundle together
|
|
13
|
+
// without touching schema-external fields. No .passthrough() — unknown fields are stripped.
|
|
14
|
+
const deploymentArtifactSchema = siteEvidenceBundleSchema.extend({
|
|
15
|
+
buildEvidence: buildEvidenceSchema.extend({
|
|
16
|
+
commitSha: z.string().regex(COMMIT_SHA_PATTERN),
|
|
17
|
+
generatedAt: z.string().datetime({ offset: true }),
|
|
18
|
+
}),
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
export interface CloudflareVersionMetadataLike {
|
|
22
|
+
id?: unknown
|
|
23
|
+
tag?: unknown
|
|
24
|
+
timestamp?: unknown
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export interface DeploymentConformanceResponseOptions {
|
|
28
|
+
method: string
|
|
29
|
+
bundle: unknown
|
|
30
|
+
expectedSite: string
|
|
31
|
+
versionMetadata?: CloudflareVersionMetadataLike | null
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export interface ConformanceEndpointHandler {
|
|
35
|
+
handle(options: {
|
|
36
|
+
method: unknown
|
|
37
|
+
versionMetadata?: CloudflareVersionMetadataLike | null
|
|
38
|
+
}): Response
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export function initConformanceEndpoint(
|
|
42
|
+
artifact: unknown,
|
|
43
|
+
expectedSite: string,
|
|
44
|
+
): ConformanceEndpointHandler {
|
|
45
|
+
let capturedBody: string | null = null
|
|
46
|
+
let capturedBuildCommitSha: string | null = null
|
|
47
|
+
|
|
48
|
+
try {
|
|
49
|
+
const site = readExpectedSite(expectedSite)
|
|
50
|
+
const { buildEvidence, ...bundle } = deploymentArtifactSchema.parse(artifact)
|
|
51
|
+
|
|
52
|
+
if (bundle.site !== site || bundle.environment !== 'production') {
|
|
53
|
+
throw new Error('Conformance endpoint evidence does not match the expected production site.')
|
|
54
|
+
}
|
|
55
|
+
capturedBody = stringifyJsonBounded(bundle, CONFORMANCE_ENDPOINT_MAX_BYTES)
|
|
56
|
+
capturedBuildCommitSha = buildEvidence.commitSha
|
|
57
|
+
} catch {
|
|
58
|
+
reportInitFailure()
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
return {
|
|
62
|
+
handle(options) {
|
|
63
|
+
let isHead = false
|
|
64
|
+
try {
|
|
65
|
+
const methodStr = readRequestMethod(options.method)
|
|
66
|
+
isHead = methodStr === 'HEAD'
|
|
67
|
+
|
|
68
|
+
if (methodStr !== 'GET' && methodStr !== 'HEAD') {
|
|
69
|
+
return genericFailureResponse(405, false, { Allow: 'GET, HEAD' })
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
if (capturedBody === null || capturedBuildCommitSha === null) {
|
|
73
|
+
throw new Error('Conformance endpoint artifact initialization failed.')
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const commitSha = readDeploymentCommitSha(options.versionMetadata)
|
|
77
|
+
|
|
78
|
+
if (!commitShaEquals(capturedBuildCommitSha, commitSha)) {
|
|
79
|
+
throw new Error('Conformance endpoint build evidence does not match the deployment tag.')
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
return new Response(isHead ? null : capturedBody, {
|
|
83
|
+
status: 200,
|
|
84
|
+
headers: responseHeaders(commitSha),
|
|
85
|
+
})
|
|
86
|
+
} catch {
|
|
87
|
+
return genericFailureResponse(503, isHead)
|
|
88
|
+
}
|
|
89
|
+
},
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function reportInitFailure(): void {
|
|
94
|
+
try {
|
|
95
|
+
console.error(INIT_FAILURE_DIAGNOSTIC)
|
|
96
|
+
} catch {
|
|
97
|
+
// Logging must never turn a fail-closed handler into an import-time crash.
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export function createDeploymentConformanceResponse(
|
|
102
|
+
options: DeploymentConformanceResponseOptions,
|
|
103
|
+
): Response {
|
|
104
|
+
let isHead = false
|
|
105
|
+
|
|
106
|
+
try {
|
|
107
|
+
const method = readRequestMethod(options.method)
|
|
108
|
+
isHead = method === 'HEAD'
|
|
109
|
+
|
|
110
|
+
if (method !== 'GET' && method !== 'HEAD') {
|
|
111
|
+
return genericFailureResponse(405, false, { Allow: 'GET, HEAD' })
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const commitSha = readDeploymentCommitSha(options.versionMetadata)
|
|
115
|
+
const expectedSite = readExpectedSite(options.expectedSite)
|
|
116
|
+
const { buildEvidence, ...bundle } = deploymentArtifactSchema.parse(options.bundle)
|
|
117
|
+
|
|
118
|
+
if (bundle.site !== expectedSite || bundle.environment !== 'production') {
|
|
119
|
+
throw new Error('Conformance endpoint evidence does not match the expected production site.')
|
|
120
|
+
}
|
|
121
|
+
if (!commitShaEquals(buildEvidence.commitSha, commitSha)) {
|
|
122
|
+
throw new Error('Conformance endpoint build evidence does not match the deployment tag.')
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
const body = stringifyJsonBounded(bundle, CONFORMANCE_ENDPOINT_MAX_BYTES)
|
|
126
|
+
return new Response(isHead ? null : body, {
|
|
127
|
+
status: 200,
|
|
128
|
+
headers: responseHeaders(commitSha),
|
|
129
|
+
})
|
|
130
|
+
} catch {
|
|
131
|
+
return genericFailureResponse(503, isHead)
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
function readRequestMethod(method: unknown): string {
|
|
136
|
+
if (typeof method !== 'string') {
|
|
137
|
+
throw new Error('Request method is required.')
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
const normalizedMethod = method.trim().toUpperCase()
|
|
141
|
+
if (normalizedMethod.length === 0) {
|
|
142
|
+
throw new Error('Request method is required.')
|
|
143
|
+
}
|
|
144
|
+
return normalizedMethod
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function readExpectedSite(expectedSite: string): string {
|
|
148
|
+
if (typeof expectedSite !== 'string' || expectedSite.trim().length === 0) {
|
|
149
|
+
throw new Error('Expected site identity is required.')
|
|
150
|
+
}
|
|
151
|
+
return expectedSite
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function readDeploymentCommitSha(
|
|
155
|
+
versionMetadata: CloudflareVersionMetadataLike | null | undefined,
|
|
156
|
+
) {
|
|
157
|
+
if (!versionMetadata || typeof versionMetadata !== 'object') {
|
|
158
|
+
throw new Error('Cloudflare version metadata is required.')
|
|
159
|
+
}
|
|
160
|
+
const { tag } = versionMetadata
|
|
161
|
+
if (typeof tag !== 'string' || !COMMIT_SHA_PATTERN.test(tag)) {
|
|
162
|
+
throw new Error('Cloudflare version metadata tag must be a lowercase 40-character commit SHA.')
|
|
163
|
+
}
|
|
164
|
+
return tag
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
function commitShaEquals(left: string, right: string): boolean {
|
|
168
|
+
if (left.length !== right.length) return false
|
|
169
|
+
|
|
170
|
+
let difference = 0
|
|
171
|
+
for (let index = 0; index < left.length; index += 1) {
|
|
172
|
+
difference |= left.charCodeAt(index) ^ right.charCodeAt(index)
|
|
173
|
+
}
|
|
174
|
+
return difference === 0
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
function responseHeaders(commitSha?: string): Headers {
|
|
178
|
+
const headers = new Headers({
|
|
179
|
+
'Content-Type': CONTENT_TYPE,
|
|
180
|
+
'Cache-Control': 'private, no-store',
|
|
181
|
+
'X-Content-Type-Options': 'nosniff',
|
|
182
|
+
})
|
|
183
|
+
if (commitSha) headers.set('X-Growth-Labs-Commit-SHA', commitSha)
|
|
184
|
+
return headers
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
function genericFailureResponse(
|
|
188
|
+
status: number,
|
|
189
|
+
head: boolean,
|
|
190
|
+
extraHeaders: Record<string, string> = {},
|
|
191
|
+
): Response {
|
|
192
|
+
const headers = responseHeaders()
|
|
193
|
+
for (const [name, value] of Object.entries(extraHeaders)) headers.set(name, value)
|
|
194
|
+
return new Response(head ? null : GENERIC_FAILURE_BODY, { status, headers })
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
function stringifyJsonBounded(value: unknown, maxBytes: number): string {
|
|
198
|
+
if (!Number.isSafeInteger(maxBytes) || maxBytes < 1) {
|
|
199
|
+
throw new RangeError('maxBytes must be a positive safe integer.')
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
const encoder = new TextEncoder()
|
|
203
|
+
const parts: string[] = []
|
|
204
|
+
const seen = new Set<object>()
|
|
205
|
+
let bytes = 0
|
|
206
|
+
|
|
207
|
+
function append(part: string) {
|
|
208
|
+
const nextBytes = bytes + encoder.encode(part).byteLength
|
|
209
|
+
if (nextBytes > maxBytes) throw new RangeError('Conformance endpoint response is too large.')
|
|
210
|
+
bytes = nextBytes
|
|
211
|
+
parts.push(part)
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
function writeJsonString(text: string) {
|
|
215
|
+
append(JSON.stringify(text))
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
function write(next: unknown) {
|
|
219
|
+
if (next === null) {
|
|
220
|
+
append('null')
|
|
221
|
+
return
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
switch (typeof next) {
|
|
225
|
+
case 'string':
|
|
226
|
+
writeJsonString(next)
|
|
227
|
+
return
|
|
228
|
+
case 'number':
|
|
229
|
+
append(Number.isFinite(next) ? String(next) : 'null')
|
|
230
|
+
return
|
|
231
|
+
case 'boolean':
|
|
232
|
+
append(next ? 'true' : 'false')
|
|
233
|
+
return
|
|
234
|
+
case 'object':
|
|
235
|
+
writeObject(next)
|
|
236
|
+
return
|
|
237
|
+
default:
|
|
238
|
+
throw new TypeError('Unsupported JSON value.')
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
function writeObject(next: object) {
|
|
243
|
+
if (seen.has(next)) throw new TypeError('Cannot serialize circular evidence.')
|
|
244
|
+
seen.add(next)
|
|
245
|
+
try {
|
|
246
|
+
if (Array.isArray(next)) {
|
|
247
|
+
append('[')
|
|
248
|
+
next.forEach((item, index) => {
|
|
249
|
+
if (index > 0) append(',')
|
|
250
|
+
if (item === undefined || typeof item === 'function' || typeof item === 'symbol') {
|
|
251
|
+
append('null')
|
|
252
|
+
return
|
|
253
|
+
}
|
|
254
|
+
write(item)
|
|
255
|
+
})
|
|
256
|
+
append(']')
|
|
257
|
+
return
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
append('{')
|
|
261
|
+
let first = true
|
|
262
|
+
for (const key of Object.keys(next)) {
|
|
263
|
+
const item = next[key as keyof typeof next]
|
|
264
|
+
if (item === undefined || typeof item === 'function' || typeof item === 'symbol') continue
|
|
265
|
+
if (!first) append(',')
|
|
266
|
+
first = false
|
|
267
|
+
append(JSON.stringify(key))
|
|
268
|
+
append(':')
|
|
269
|
+
write(item)
|
|
270
|
+
}
|
|
271
|
+
append('}')
|
|
272
|
+
} finally {
|
|
273
|
+
seen.delete(next)
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
write(value)
|
|
278
|
+
return parts.join('')
|
|
279
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -49,7 +49,11 @@ export {
|
|
|
49
49
|
type InlineStyleAttributeInventory,
|
|
50
50
|
inlineStyleAttributeInventorySchema,
|
|
51
51
|
type PublicationSurfaceEvidence,
|
|
52
|
+
type PublicationSurfaceOwner,
|
|
53
|
+
type PublicationSurfaceOwnerReceipt,
|
|
52
54
|
parseConformanceFixture,
|
|
55
|
+
publicationSurfaceOwnerReceiptSchema,
|
|
56
|
+
publicationSurfaceOwnerSchema,
|
|
53
57
|
publicationSurfaceSchema,
|
|
54
58
|
REQUIRED_FUNCTIONAL_PROBE_NAMES,
|
|
55
59
|
REQUIRED_NEGATIVE_FIXTURE_CODES,
|
package/src/runner.ts
CHANGED
|
@@ -992,7 +992,7 @@ function checkPublicationSurfaces(fixture: ConformanceFixture): ConformanceCheck
|
|
|
992
992
|
findings.push({
|
|
993
993
|
code: 'publication.surface.missing',
|
|
994
994
|
severity: 'error',
|
|
995
|
-
message:
|
|
995
|
+
message: 'Required publication surface is missing or not declared NA.',
|
|
996
996
|
path: `publicationSurfaces.${required}`,
|
|
997
997
|
})
|
|
998
998
|
}
|
|
@@ -1007,7 +1007,6 @@ function checkPublicationSurfaces(fixture: ConformanceFixture): ConformanceCheck
|
|
|
1007
1007
|
severity: 'error',
|
|
1008
1008
|
message: 'NA publication surfaces require a capability boundary and evidence.',
|
|
1009
1009
|
path,
|
|
1010
|
-
evidence: surface.name,
|
|
1011
1010
|
remediation:
|
|
1012
1011
|
'Declare why the site cannot provide the surface and attach supporting evidence.',
|
|
1013
1012
|
})
|
|
@@ -1019,7 +1018,7 @@ function checkPublicationSurfaces(fixture: ConformanceFixture): ConformanceCheck
|
|
|
1019
1018
|
findings.push({
|
|
1020
1019
|
code: 'publication.surface.missing',
|
|
1021
1020
|
severity: 'error',
|
|
1022
|
-
message:
|
|
1021
|
+
message: 'Publication surface is missing.',
|
|
1023
1022
|
path,
|
|
1024
1023
|
})
|
|
1025
1024
|
return
|
|
@@ -1029,8 +1028,9 @@ function checkPublicationSurfaces(fixture: ConformanceFixture): ConformanceCheck
|
|
|
1029
1028
|
findings.push({
|
|
1030
1029
|
code: 'publication.surface.http_error',
|
|
1031
1030
|
severity: 'error',
|
|
1032
|
-
message:
|
|
1031
|
+
message: 'Publication surface returned an HTTP error.',
|
|
1033
1032
|
path: `${path}.httpStatus`,
|
|
1033
|
+
evidence: `httpStatus=${surface.httpStatus}`,
|
|
1034
1034
|
})
|
|
1035
1035
|
}
|
|
1036
1036
|
|
|
@@ -1038,10 +1038,86 @@ function checkPublicationSurfaces(fixture: ConformanceFixture): ConformanceCheck
|
|
|
1038
1038
|
findings.push({
|
|
1039
1039
|
code: 'publication.surface.empty',
|
|
1040
1040
|
severity: 'error',
|
|
1041
|
-
message:
|
|
1041
|
+
message: 'Publication surface has an empty body.',
|
|
1042
1042
|
path: `${path}.bodyBytes`,
|
|
1043
1043
|
})
|
|
1044
1044
|
}
|
|
1045
|
+
|
|
1046
|
+
const { intendedOwner, observedOwner } = surface
|
|
1047
|
+
const hasIntended = intendedOwner !== undefined
|
|
1048
|
+
const hasObserved = observedOwner !== undefined
|
|
1049
|
+
|
|
1050
|
+
if (hasIntended !== hasObserved) {
|
|
1051
|
+
findings.push({
|
|
1052
|
+
code: 'publication.surface.owner_pair_incomplete',
|
|
1053
|
+
severity: 'error',
|
|
1054
|
+
message: 'Publication surface ownership requires both intendedOwner and observedOwner.',
|
|
1055
|
+
path: hasIntended ? `${path}.observedOwner` : `${path}.intendedOwner`,
|
|
1056
|
+
remediation:
|
|
1057
|
+
'Declare both intendedOwner and observedOwner together, or omit both for legacy surfaces.',
|
|
1058
|
+
})
|
|
1059
|
+
} else if (hasIntended && hasObserved && intendedOwner !== 'na' && observedOwner !== 'na') {
|
|
1060
|
+
if (!surface.ownerReceipt) {
|
|
1061
|
+
findings.push({
|
|
1062
|
+
code: 'publication.surface.owner_receipt_missing',
|
|
1063
|
+
severity: 'error',
|
|
1064
|
+
message:
|
|
1065
|
+
'Publication surface ownership requires a deterministic receipt when ownership is declared.',
|
|
1066
|
+
path: `${path}.ownerReceipt`,
|
|
1067
|
+
remediation:
|
|
1068
|
+
'Attach a privacy-safe receipt with a versioned collector, observedAt timestamp, and signalHash.',
|
|
1069
|
+
})
|
|
1070
|
+
}
|
|
1071
|
+
if (intendedOwner !== observedOwner) {
|
|
1072
|
+
if (intendedOwner === 'runtime' && observedOwner === 'static') {
|
|
1073
|
+
findings.push({
|
|
1074
|
+
code: 'publication.surface.static_shadow',
|
|
1075
|
+
severity: 'error',
|
|
1076
|
+
message:
|
|
1077
|
+
'Publication surface is intended to be runtime-owned but is served from static assets.',
|
|
1078
|
+
path: `${path}.observedOwner`,
|
|
1079
|
+
evidence: 'intended=runtime; observed=static',
|
|
1080
|
+
remediation:
|
|
1081
|
+
'Set assets.run_worker_first = true in wrangler.toml so the Worker handles requests before static assets.',
|
|
1082
|
+
})
|
|
1083
|
+
} else {
|
|
1084
|
+
findings.push({
|
|
1085
|
+
code: 'publication.surface.owner_mismatch',
|
|
1086
|
+
severity: 'error',
|
|
1087
|
+
message: 'Publication surface intended owner does not match observed owner.',
|
|
1088
|
+
path: `${path}.observedOwner`,
|
|
1089
|
+
evidence: `intended=${intendedOwner}; observed=${observedOwner}`,
|
|
1090
|
+
remediation:
|
|
1091
|
+
'Verify the routing configuration ensures the intended owner handles requests for this surface.',
|
|
1092
|
+
})
|
|
1093
|
+
}
|
|
1094
|
+
}
|
|
1095
|
+
}
|
|
1096
|
+
|
|
1097
|
+
if (surface.minimumCount !== undefined && surface.observedCount === undefined) {
|
|
1098
|
+
findings.push({
|
|
1099
|
+
code: 'publication.surface.count_dimension_incomplete',
|
|
1100
|
+
severity: 'error',
|
|
1101
|
+
message: 'Publication surface count minimum requires both observedCount and minimumCount.',
|
|
1102
|
+
path: `${path}.observedCount`,
|
|
1103
|
+
remediation:
|
|
1104
|
+
'Provide both observedCount and minimumCount, or omit both for surfaces without a count contract.',
|
|
1105
|
+
})
|
|
1106
|
+
} else if (
|
|
1107
|
+
surface.minimumCount !== undefined &&
|
|
1108
|
+
surface.observedCount !== undefined &&
|
|
1109
|
+
surface.observedCount < surface.minimumCount
|
|
1110
|
+
) {
|
|
1111
|
+
findings.push({
|
|
1112
|
+
code: 'publication.surface.count_shortfall',
|
|
1113
|
+
severity: 'error',
|
|
1114
|
+
message: 'Publication surface has fewer entries than the required minimum.',
|
|
1115
|
+
path: `${path}.observedCount`,
|
|
1116
|
+
evidence: `observed=${surface.observedCount}; minimum=${surface.minimumCount}`,
|
|
1117
|
+
remediation:
|
|
1118
|
+
'Verify the surface is populated with the expected number of entries by the intended owner.',
|
|
1119
|
+
})
|
|
1120
|
+
}
|
|
1045
1121
|
})
|
|
1046
1122
|
|
|
1047
1123
|
return receipt('publication-surfaces', findings)
|