@unifyplane/logsdk 0.1.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 (170) hide show
  1. package/README.md +18 -0
  2. package/contracts/repo.capabilities.json +12 -0
  3. package/contracts/repo.runtime.json +49 -0
  4. package/contracts/schemas/repo/repo.runtime.v1.schema.json +134 -0
  5. package/dist/core/clock.d.ts +3 -0
  6. package/dist/core/clock.d.ts.map +1 -0
  7. package/dist/core/clock.js +21 -0
  8. package/dist/core/clock.js.map +1 -0
  9. package/dist/core/context.d.ts +10 -0
  10. package/dist/core/context.d.ts.map +1 -0
  11. package/dist/core/context.js +100 -0
  12. package/dist/core/context.js.map +1 -0
  13. package/dist/core/fanout.d.ts +4 -0
  14. package/dist/core/fanout.d.ts.map +1 -0
  15. package/dist/core/fanout.js +32 -0
  16. package/dist/core/fanout.js.map +1 -0
  17. package/dist/core/ids.d.ts +6 -0
  18. package/dist/core/ids.d.ts.map +1 -0
  19. package/dist/core/ids.js +27 -0
  20. package/dist/core/ids.js.map +1 -0
  21. package/dist/core/message_constraints.d.ts +4 -0
  22. package/dist/core/message_constraints.d.ts.map +1 -0
  23. package/dist/core/message_constraints.js +53 -0
  24. package/dist/core/message_constraints.js.map +1 -0
  25. package/dist/core/outcomes.d.ts +5 -0
  26. package/dist/core/outcomes.d.ts.map +1 -0
  27. package/dist/core/outcomes.js +4 -0
  28. package/dist/core/outcomes.js.map +1 -0
  29. package/dist/core/record_builder.d.ts +34 -0
  30. package/dist/core/record_builder.d.ts.map +1 -0
  31. package/dist/core/record_builder.js +188 -0
  32. package/dist/core/record_builder.js.map +1 -0
  33. package/dist/core/spool.d.ts +4 -0
  34. package/dist/core/spool.d.ts.map +1 -0
  35. package/dist/core/spool.js +31 -0
  36. package/dist/core/spool.js.map +1 -0
  37. package/dist/core/types.d.ts +33 -0
  38. package/dist/core/types.d.ts.map +1 -0
  39. package/dist/core/types.js +4 -0
  40. package/dist/core/types.js.map +1 -0
  41. package/dist/esm/core/clock.js +21 -0
  42. package/dist/esm/core/clock.js.map +1 -0
  43. package/dist/esm/core/context.js +100 -0
  44. package/dist/esm/core/context.js.map +1 -0
  45. package/dist/esm/core/fanout.js +32 -0
  46. package/dist/esm/core/fanout.js.map +1 -0
  47. package/dist/esm/core/ids.js +27 -0
  48. package/dist/esm/core/ids.js.map +1 -0
  49. package/dist/esm/core/message_constraints.js +53 -0
  50. package/dist/esm/core/message_constraints.js.map +1 -0
  51. package/dist/esm/core/outcomes.js +4 -0
  52. package/dist/esm/core/outcomes.js.map +1 -0
  53. package/dist/esm/core/record_builder.js +188 -0
  54. package/dist/esm/core/record_builder.js.map +1 -0
  55. package/dist/esm/core/spool.js +31 -0
  56. package/dist/esm/core/spool.js.map +1 -0
  57. package/dist/esm/core/types.js +4 -0
  58. package/dist/esm/core/types.js.map +1 -0
  59. package/dist/esm/index.js +52 -0
  60. package/dist/esm/index.js.map +1 -0
  61. package/dist/esm/sinks/file_ndjson.js +29 -0
  62. package/dist/esm/sinks/file_ndjson.js.map +1 -0
  63. package/dist/esm/sinks/file_ndjson_sink.js +36 -0
  64. package/dist/esm/sinks/file_ndjson_sink.js.map +1 -0
  65. package/dist/esm/sinks/sink_types.js +2 -0
  66. package/dist/esm/sinks/sink_types.js.map +1 -0
  67. package/dist/esm/sinks/stdout_sink.js +15 -0
  68. package/dist/esm/sinks/stdout_sink.js.map +1 -0
  69. package/dist/esm/validate/api_surface_guard.js +63 -0
  70. package/dist/esm/validate/api_surface_guard.js.map +1 -0
  71. package/dist/esm/validate/noncompliance.js +17 -0
  72. package/dist/esm/validate/noncompliance.js.map +1 -0
  73. package/dist/esm/validate/schema_guard.js +151 -0
  74. package/dist/esm/validate/schema_guard.js.map +1 -0
  75. package/dist/index.d.ts +26 -0
  76. package/dist/index.d.ts.map +1 -0
  77. package/dist/index.js +52 -0
  78. package/dist/index.js.map +1 -0
  79. package/dist/sinks/file_ndjson.d.ts +18 -0
  80. package/dist/sinks/file_ndjson.d.ts.map +1 -0
  81. package/dist/sinks/file_ndjson.js +29 -0
  82. package/dist/sinks/file_ndjson.js.map +1 -0
  83. package/dist/sinks/file_ndjson_sink.d.ts +7 -0
  84. package/dist/sinks/file_ndjson_sink.d.ts.map +1 -0
  85. package/dist/sinks/file_ndjson_sink.js +36 -0
  86. package/dist/sinks/file_ndjson_sink.js.map +1 -0
  87. package/dist/sinks/sink_types.d.ts +12 -0
  88. package/dist/sinks/sink_types.d.ts.map +1 -0
  89. package/dist/sinks/sink_types.js +2 -0
  90. package/dist/sinks/sink_types.js.map +1 -0
  91. package/dist/sinks/stdout_sink.d.ts +6 -0
  92. package/dist/sinks/stdout_sink.d.ts.map +1 -0
  93. package/dist/sinks/stdout_sink.js +15 -0
  94. package/dist/sinks/stdout_sink.js.map +1 -0
  95. package/dist/types/core/clock.d.ts +3 -0
  96. package/dist/types/core/clock.d.ts.map +1 -0
  97. package/dist/types/core/context.d.ts +10 -0
  98. package/dist/types/core/context.d.ts.map +1 -0
  99. package/dist/types/core/fanout.d.ts +4 -0
  100. package/dist/types/core/fanout.d.ts.map +1 -0
  101. package/dist/types/core/ids.d.ts +6 -0
  102. package/dist/types/core/ids.d.ts.map +1 -0
  103. package/dist/types/core/message_constraints.d.ts +4 -0
  104. package/dist/types/core/message_constraints.d.ts.map +1 -0
  105. package/dist/types/core/outcomes.d.ts +5 -0
  106. package/dist/types/core/outcomes.d.ts.map +1 -0
  107. package/dist/types/core/record_builder.d.ts +34 -0
  108. package/dist/types/core/record_builder.d.ts.map +1 -0
  109. package/dist/types/core/spool.d.ts +4 -0
  110. package/dist/types/core/spool.d.ts.map +1 -0
  111. package/dist/types/core/types.d.ts +33 -0
  112. package/dist/types/core/types.d.ts.map +1 -0
  113. package/dist/types/index.d.ts +26 -0
  114. package/dist/types/index.d.ts.map +1 -0
  115. package/dist/types/sinks/file_ndjson.d.ts +18 -0
  116. package/dist/types/sinks/file_ndjson.d.ts.map +1 -0
  117. package/dist/types/sinks/file_ndjson_sink.d.ts +7 -0
  118. package/dist/types/sinks/file_ndjson_sink.d.ts.map +1 -0
  119. package/dist/types/sinks/sink_types.d.ts +12 -0
  120. package/dist/types/sinks/sink_types.d.ts.map +1 -0
  121. package/dist/types/sinks/stdout_sink.d.ts +6 -0
  122. package/dist/types/sinks/stdout_sink.d.ts.map +1 -0
  123. package/dist/types/validate/api_surface_guard.d.ts +2 -0
  124. package/dist/types/validate/api_surface_guard.d.ts.map +1 -0
  125. package/dist/types/validate/noncompliance.d.ts +15 -0
  126. package/dist/types/validate/noncompliance.d.ts.map +1 -0
  127. package/dist/types/validate/schema_guard.d.ts +5 -0
  128. package/dist/types/validate/schema_guard.d.ts.map +1 -0
  129. package/dist/validate/api_surface_guard.d.ts +2 -0
  130. package/dist/validate/api_surface_guard.d.ts.map +1 -0
  131. package/dist/validate/api_surface_guard.js +63 -0
  132. package/dist/validate/api_surface_guard.js.map +1 -0
  133. package/dist/validate/noncompliance.d.ts +15 -0
  134. package/dist/validate/noncompliance.d.ts.map +1 -0
  135. package/dist/validate/noncompliance.js +17 -0
  136. package/dist/validate/noncompliance.js.map +1 -0
  137. package/dist/validate/schema_guard.d.ts +5 -0
  138. package/dist/validate/schema_guard.d.ts.map +1 -0
  139. package/dist/validate/schema_guard.js +151 -0
  140. package/dist/validate/schema_guard.js.map +1 -0
  141. package/evidence/audit/llm/llm_audit_report_2026-01-25T15-11-32Z.json +30 -0
  142. package/evidence/audit/llm/llm_audit_report_2026-01-25T15-53-20Z.json +154 -0
  143. package/evidence/audit/llm/llm_audit_report_2026-01-25T16-14-52Z.json +130 -0
  144. package/evidence/audit/llm/llm_audit_report_2026-01-25T16-15-42Z.json +152 -0
  145. package/evidence/audit/llm/llm_audit_report_2026-01-25T16-17-39Z.json +152 -0
  146. package/evidence/audit/llm/llm_audit_report_2026-01-25T16-18-51Z.json +152 -0
  147. package/evidence/audit/llm/llm_audit_report_2026-01-25T16-19-50Z.json +152 -0
  148. package/evidence/audit/llm/llm_audit_report_2026-01-25T16-20-36Z.json +152 -0
  149. package/evidence/audit/llm/llm_audit_report_2026-01-25T23-22-43Z.json +170 -0
  150. package/evidence/audit/llm/llm_audit_report_2026-01-25T23-39-03Z.json +157 -0
  151. package/filestructure.output.txt +73 -0
  152. package/package.json +16 -0
  153. package/src/core/clock.ts +25 -0
  154. package/src/core/context.ts +142 -0
  155. package/src/core/fanout.ts +38 -0
  156. package/src/core/ids.ts +35 -0
  157. package/src/core/message_constraints.ts +66 -0
  158. package/src/core/outcomes.ts +5 -0
  159. package/src/core/record_builder.ts +269 -0
  160. package/src/core/spool.ts +41 -0
  161. package/src/core/types.ts +56 -0
  162. package/src/index.ts +105 -0
  163. package/src/sinks/file_ndjson.ts +42 -0
  164. package/src/sinks/file_ndjson_sink.ts +45 -0
  165. package/src/sinks/sink_types.ts +15 -0
  166. package/src/sinks/stdout_sink.ts +20 -0
  167. package/src/validate/api_surface_guard.ts +106 -0
  168. package/src/validate/noncompliance.ts +33 -0
  169. package/src/validate/schema_guard.ts +242 -0
  170. package/unifyplane-logsdk-0.1.0.tgz +0 -0
@@ -0,0 +1,63 @@
1
+ import { API_SURFACE_VIOLATION, NonComplianceError, } from "./noncompliance.js";
2
+ const ALLOWED_SCOPES = ["request", "job", "component"];
3
+ const FORBIDDEN_NAMES = new Set([
4
+ "withContext",
5
+ "ctx",
6
+ "meta",
7
+ "attributes",
8
+ "tags",
9
+ "labels",
10
+ "log",
11
+ "emit",
12
+ "metric",
13
+ "span",
14
+ ]);
15
+ function assertFunction(value, name, arity) {
16
+ if (typeof value !== "function") {
17
+ throw new NonComplianceError(API_SURFACE_VIOLATION, `${name} must be a function.`);
18
+ }
19
+ if (value.length !== arity) {
20
+ throw new NonComplianceError(API_SURFACE_VIOLATION, `${name} must accept exactly ${arity} argument(s).`);
21
+ }
22
+ }
23
+ function assertChildScopePolicy(child) {
24
+ const candidate = child;
25
+ const allowedScopes = candidate.allowedScopes;
26
+ if (!Array.isArray(allowedScopes) || allowedScopes.length === 0) {
27
+ throw new NonComplianceError(API_SURFACE_VIOLATION, "child() must declare allowedScopes to enforce scope union.");
28
+ }
29
+ for (const scope of allowedScopes) {
30
+ if (!ALLOWED_SCOPES.includes(scope)) {
31
+ throw new NonComplianceError(API_SURFACE_VIOLATION, `child() scope not allowed: ${String(scope)}.`);
32
+ }
33
+ }
34
+ }
35
+ export function assertApiSurface(surface) {
36
+ if (!surface || typeof surface !== "object") {
37
+ throw new NonComplianceError(API_SURFACE_VIOLATION, "API surface must be an object.");
38
+ }
39
+ const api = surface;
40
+ const keys = Object.keys(api);
41
+ for (const key of keys) {
42
+ if (FORBIDDEN_NAMES.has(key)) {
43
+ throw new NonComplianceError(API_SURFACE_VIOLATION, `Forbidden API method detected: ${key}.`);
44
+ }
45
+ }
46
+ if (!("step" in api)) {
47
+ throw new NonComplianceError(API_SURFACE_VIOLATION, "API surface must expose step(message).");
48
+ }
49
+ assertFunction(api.step, "step", 1);
50
+ if ("flush" in api) {
51
+ assertFunction(api.flush, "flush", 0);
52
+ }
53
+ if ("child" in api) {
54
+ assertFunction(api.child, "child", 1);
55
+ assertChildScopePolicy(api.child);
56
+ }
57
+ for (const key of keys) {
58
+ if (key !== "step" && key !== "child" && key !== "flush") {
59
+ throw new NonComplianceError(API_SURFACE_VIOLATION, `Unexpected API export: ${key}.`);
60
+ }
61
+ }
62
+ }
63
+ //# sourceMappingURL=api_surface_guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api_surface_guard.js","sourceRoot":"","sources":["../../src/validate/api_surface_guard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export declare const API_SURFACE_VIOLATION: "API_SURFACE_VIOLATION";
2
+ export declare const CONTEXT_INJECTION_VIOLATION: "CONTEXT_INJECTION_VIOLATION";
3
+ export declare const PAYLOAD_EMBEDDING_VIOLATION: "PAYLOAD_EMBEDDING_VIOLATION";
4
+ export declare const CANONICAL_SCHEMA_VIOLATION: "CANONICAL_SCHEMA_VIOLATION";
5
+ export declare const SINK_MUTATION_VIOLATION: "SINK_MUTATION_VIOLATION";
6
+ export declare const NO_AUTHORITATIVE_SINK: "NO_AUTHORITATIVE_SINK";
7
+ export declare const FANOUT_NONDETERMINISM: "FANOUT_NONDETERMINISM";
8
+ export declare const AUTHORITATIVE_FAILURE_SWALLOWED: "AUTHORITATIVE_FAILURE_SWALLOWED";
9
+ export declare const UNBOUNDED_BUFFER_RISK: "UNBOUNDED_BUFFER_RISK";
10
+ export type NonComplianceCode = typeof API_SURFACE_VIOLATION | typeof CONTEXT_INJECTION_VIOLATION | typeof PAYLOAD_EMBEDDING_VIOLATION | typeof CANONICAL_SCHEMA_VIOLATION | typeof SINK_MUTATION_VIOLATION | typeof NO_AUTHORITATIVE_SINK | typeof FANOUT_NONDETERMINISM | typeof AUTHORITATIVE_FAILURE_SWALLOWED | typeof UNBOUNDED_BUFFER_RISK;
11
+ export declare class NonComplianceError extends Error {
12
+ readonly code: NonComplianceCode;
13
+ constructor(code: NonComplianceCode, message: string);
14
+ }
15
+ //# sourceMappingURL=noncompliance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"noncompliance.d.ts","sourceRoot":"","sources":["../../src/validate/noncompliance.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,qBAAqB,EAAG,uBAAgC,CAAC;AACtE,eAAO,MAAM,2BAA2B,EACtC,6BAAsC,CAAC;AACzC,eAAO,MAAM,2BAA2B,EACtC,6BAAsC,CAAC;AACzC,eAAO,MAAM,0BAA0B,EACrC,4BAAqC,CAAC;AACxC,eAAO,MAAM,uBAAuB,EAAG,yBAAkC,CAAC;AAC1E,eAAO,MAAM,qBAAqB,EAAG,uBAAgC,CAAC;AACtE,eAAO,MAAM,qBAAqB,EAAG,uBAAgC,CAAC;AACtE,eAAO,MAAM,+BAA+B,EAC1C,iCAA0C,CAAC;AAC7C,eAAO,MAAM,qBAAqB,EAAG,uBAAgC,CAAC;AAEtE,MAAM,MAAM,iBAAiB,GACzB,OAAO,qBAAqB,GAC5B,OAAO,2BAA2B,GAClC,OAAO,2BAA2B,GAClC,OAAO,0BAA0B,GACjC,OAAO,uBAAuB,GAC9B,OAAO,qBAAqB,GAC5B,OAAO,qBAAqB,GAC5B,OAAO,+BAA+B,GACtC,OAAO,qBAAqB,CAAC;AAEjC,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;gBAErB,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM;CAIrD"}
@@ -0,0 +1,17 @@
1
+ export const API_SURFACE_VIOLATION = "API_SURFACE_VIOLATION";
2
+ export const CONTEXT_INJECTION_VIOLATION = "CONTEXT_INJECTION_VIOLATION";
3
+ export const PAYLOAD_EMBEDDING_VIOLATION = "PAYLOAD_EMBEDDING_VIOLATION";
4
+ export const CANONICAL_SCHEMA_VIOLATION = "CANONICAL_SCHEMA_VIOLATION";
5
+ export const SINK_MUTATION_VIOLATION = "SINK_MUTATION_VIOLATION";
6
+ export const NO_AUTHORITATIVE_SINK = "NO_AUTHORITATIVE_SINK";
7
+ export const FANOUT_NONDETERMINISM = "FANOUT_NONDETERMINISM";
8
+ export const AUTHORITATIVE_FAILURE_SWALLOWED = "AUTHORITATIVE_FAILURE_SWALLOWED";
9
+ export const UNBOUNDED_BUFFER_RISK = "UNBOUNDED_BUFFER_RISK";
10
+ export class NonComplianceError extends Error {
11
+ code;
12
+ constructor(code, message) {
13
+ super(message);
14
+ this.code = code;
15
+ }
16
+ }
17
+ //# sourceMappingURL=noncompliance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"noncompliance.js","sourceRoot":"","sources":["../../src/validate/noncompliance.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,qBAAqB,GAAG,uBAAgC,CAAC;AACtE,MAAM,CAAC,MAAM,2BAA2B,GACtC,6BAAsC,CAAC;AACzC,MAAM,CAAC,MAAM,2BAA2B,GACtC,6BAAsC,CAAC;AACzC,MAAM,CAAC,MAAM,0BAA0B,GACrC,4BAAqC,CAAC;AACxC,MAAM,CAAC,MAAM,uBAAuB,GAAG,yBAAkC,CAAC;AAC1E,MAAM,CAAC,MAAM,qBAAqB,GAAG,uBAAgC,CAAC;AACtE,MAAM,CAAC,MAAM,qBAAqB,GAAG,uBAAgC,CAAC;AACtE,MAAM,CAAC,MAAM,+BAA+B,GAC1C,iCAA0C,CAAC;AAC7C,MAAM,CAAC,MAAM,qBAAqB,GAAG,uBAAgC,CAAC;AAatE,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAClC,IAAI,CAAoB;IAEjC,YAAY,IAAuB,EAAE,OAAe;QAClD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF"}
@@ -0,0 +1,5 @@
1
+ import type { StepRecord } from "../core/types.js";
2
+ import type { SinkEntry } from "../sinks/sink_types.js";
3
+ export declare function assertStepRecord(record: unknown): asserts record is StepRecord;
4
+ export declare function assertHasAuthoritativeSink(sinks: ReadonlyArray<SinkEntry>): void;
5
+ //# sourceMappingURL=schema_guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema_guard.d.ts","sourceRoot":"","sources":["../../src/validate/schema_guard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AA0DxD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,IAAI,UAAU,CA8G9E;AAID,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,aAAa,CAAC,SAAS,CAAC,GAC9B,IAAI,CAWN"}
@@ -0,0 +1,151 @@
1
+ import { assertValidMessage } from "../core/message_constraints.js";
2
+ import { CANONICAL_SCHEMA_VIOLATION, CONTEXT_INJECTION_VIOLATION, NO_AUTHORITATIVE_SINK, PAYLOAD_EMBEDDING_VIOLATION, NonComplianceError, } from "./noncompliance.js";
3
+ const REQUIRED_FIELDS = [
4
+ "record_version",
5
+ "record_id",
6
+ "sequence",
7
+ "timestamp_utc",
8
+ "monotonic_time",
9
+ "institution",
10
+ "system_name",
11
+ "system_type",
12
+ "environment",
13
+ "system_version",
14
+ "message",
15
+ "context_hash",
16
+ "context_version",
17
+ "record_hash",
18
+ "hash_algorithm",
19
+ ];
20
+ const OPTIONAL_FIELDS = [
21
+ "instance_id",
22
+ "trace_id",
23
+ "span_id",
24
+ "parent_step_id",
25
+ "surface_type",
26
+ "surface_name",
27
+ "surface_instance",
28
+ "source_file",
29
+ "source_module",
30
+ "source_function",
31
+ "source_line",
32
+ "message_code",
33
+ "evidence_refs",
34
+ ];
35
+ const ALLOWED_FIELDS = new Set([...REQUIRED_FIELDS, ...OPTIONAL_FIELDS]);
36
+ const CONTEXT_FIELDS = ["context", "context_blob", "context_data", "context_value"];
37
+ // Explicit type assertion for string keys from Object.keys(schema.properties)
38
+ function asRecord(value) {
39
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
40
+ throw new NonComplianceError(CANONICAL_SCHEMA_VIOLATION, "Step record must be a plain object.");
41
+ }
42
+ return value;
43
+ }
44
+ export function assertStepRecord(record) {
45
+ const candidate = asRecord(record);
46
+ if (!Object.isFrozen(candidate)) {
47
+ throw new NonComplianceError(CANONICAL_SCHEMA_VIOLATION, "Step record must be immutable at emission time.");
48
+ }
49
+ for (const forbidden of CONTEXT_FIELDS) {
50
+ if (forbidden in candidate) {
51
+ throw new NonComplianceError(CONTEXT_INJECTION_VIOLATION, "Context must not be embedded in the step record.");
52
+ }
53
+ }
54
+ for (const key of Object.keys(candidate)) {
55
+ if (!ALLOWED_FIELDS.has(key)) {
56
+ throw new NonComplianceError(CANONICAL_SCHEMA_VIOLATION, `Unexpected field in step record: ${key}.`);
57
+ }
58
+ }
59
+ for (const field of REQUIRED_FIELDS) {
60
+ if (!(field in candidate)) {
61
+ throw new NonComplianceError(CANONICAL_SCHEMA_VIOLATION, `Missing required field: ${field}.`);
62
+ }
63
+ }
64
+ assertStringField(candidate, "record_version");
65
+ assertStringField(candidate, "record_id");
66
+ assertIntegerField(candidate, "sequence");
67
+ assertStringField(candidate, "timestamp_utc");
68
+ assertNumberField(candidate, "monotonic_time");
69
+ assertStringField(candidate, "institution");
70
+ assertStringField(candidate, "system_name");
71
+ assertStringField(candidate, "system_type");
72
+ assertStringField(candidate, "environment");
73
+ assertStringField(candidate, "system_version");
74
+ assertStringField(candidate, "context_hash");
75
+ assertStringField(candidate, "context_version");
76
+ assertStringField(candidate, "record_hash");
77
+ assertStringField(candidate, "hash_algorithm");
78
+ if (candidate.record_version !== "log.step.v1") {
79
+ throw new NonComplianceError(CANONICAL_SCHEMA_VIOLATION, "record_version must be log.step.v1.");
80
+ }
81
+ try {
82
+ assertValidMessage(candidate.message);
83
+ }
84
+ catch (error) {
85
+ throw new NonComplianceError(PAYLOAD_EMBEDDING_VIOLATION, error instanceof Error ? error.message : "Invalid message content.");
86
+ }
87
+ if (typeof candidate.timestamp_utc === "string") {
88
+ const parsed = Date.parse(candidate.timestamp_utc);
89
+ if (Number.isNaN(parsed)) {
90
+ throw new NonComplianceError(CANONICAL_SCHEMA_VIOLATION, "timestamp_utc must be a valid ISO-8601 string.");
91
+ }
92
+ }
93
+ assertOptionalStringField(candidate, "instance_id");
94
+ assertOptionalStringField(candidate, "trace_id");
95
+ assertOptionalStringField(candidate, "span_id");
96
+ assertOptionalStringField(candidate, "parent_step_id");
97
+ assertOptionalStringField(candidate, "surface_type");
98
+ assertOptionalStringField(candidate, "surface_name");
99
+ assertOptionalStringField(candidate, "surface_instance");
100
+ assertOptionalStringField(candidate, "source_file");
101
+ assertOptionalStringField(candidate, "source_module");
102
+ assertOptionalStringField(candidate, "source_function");
103
+ assertOptionalStringField(candidate, "message_code");
104
+ if ("source_line" in candidate && candidate.source_line !== undefined) {
105
+ assertNumberField(candidate, "source_line");
106
+ }
107
+ if ("evidence_refs" in candidate && candidate.evidence_refs !== undefined) {
108
+ if (!Array.isArray(candidate.evidence_refs)) {
109
+ throw new NonComplianceError(CANONICAL_SCHEMA_VIOLATION, "evidence_refs must be an array of strings.");
110
+ }
111
+ for (const ref of candidate.evidence_refs) {
112
+ if (typeof ref !== "string" || ref.length === 0) {
113
+ throw new NonComplianceError(CANONICAL_SCHEMA_VIOLATION, "evidence_refs must contain non-empty strings.");
114
+ }
115
+ }
116
+ }
117
+ }
118
+ // Explicit type assertion for string keys from Object.keys(schema.properties)
119
+ export function assertHasAuthoritativeSink(sinks) {
120
+ const hasAuthoritative = sinks.some((entry) => entry.sinkClass === "authoritative");
121
+ if (!hasAuthoritative) {
122
+ throw new NonComplianceError(NO_AUTHORITATIVE_SINK, "At least one authoritative sink is required.");
123
+ }
124
+ }
125
+ function assertStringField(record, field) {
126
+ const value = record[field];
127
+ if (typeof value !== "string" || value.length === 0) {
128
+ throw new NonComplianceError(CANONICAL_SCHEMA_VIOLATION, `${field} must be a non-empty string.`);
129
+ }
130
+ }
131
+ function assertOptionalStringField(record, field) {
132
+ if (field in record && record[field] !== undefined) {
133
+ const value = record[field];
134
+ if (typeof value !== "string" || value.length === 0) {
135
+ throw new NonComplianceError(CANONICAL_SCHEMA_VIOLATION, `${field} must be a non-empty string when provided.`);
136
+ }
137
+ }
138
+ }
139
+ function assertNumberField(record, field) {
140
+ const value = record[field];
141
+ if (typeof value !== "number" || !Number.isFinite(value)) {
142
+ throw new NonComplianceError(CANONICAL_SCHEMA_VIOLATION, `${field} must be a finite number.`);
143
+ }
144
+ }
145
+ function assertIntegerField(record, field) {
146
+ const value = record[field];
147
+ if (typeof value !== "number" || !Number.isInteger(value) || value < 0) {
148
+ throw new NonComplianceError(CANONICAL_SCHEMA_VIOLATION, `${field} must be a non-negative integer.`);
149
+ }
150
+ }
151
+ //# sourceMappingURL=schema_guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema_guard.js","sourceRoot":"","sources":["../../src/validate/schema_guard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ {
2
+ "repo": {
3
+ "path": "C:\\Ananda\\projects\\unifyplane\\LogSDK"
4
+ },
5
+ "audit_input_path": "C:\\Ananda\\projects\\unifyplane\\LogSDK",
6
+ "audit_root": "C:\\Ananda\\projects\\unifyplane\\LogSDK",
7
+ "generated_at_utc": "2026-01-25T15:11:32Z",
8
+ "overall_status": "BLOCKED",
9
+ "blocking_failure": {
10
+ "missing_surfaces": [
11
+ "plans"
12
+ ],
13
+ "reason": "Missing required repository surfaces"
14
+ },
15
+ "runtime_contract": {
16
+ "exists": true,
17
+ "path": "contracts/repo.runtime.json",
18
+ "valid": null,
19
+ "notes": "Not evaluated because audit was blocked on missing surfaces"
20
+ },
21
+ "derived_runtime_diagnostics": {
22
+ "signals": null,
23
+ "surfaces": null,
24
+ "notes": "Diagnostics not computed due to blocking failure"
25
+ },
26
+ "rule_findings": [],
27
+ "summary": {
28
+ "notes": "Audit blocked before runtime evaluation because required surfaces were missing (plans)."
29
+ }
30
+ }
@@ -0,0 +1,154 @@
1
+ {
2
+ "repo": {
3
+ "path": "C:\\Ananda\\projects\\unifyplane\\LogSDK",
4
+ "name": "@unifyplane/logsdk",
5
+ "runtime_manifest": "contracts/repo.runtime.json"
6
+ },
7
+ "audit_input_path": "C:\\Ananda\\projects\\unifyplane\\LogSDK",
8
+ "audit_root": "C:\\Ananda\\projects\\unifyplane\\LogSDK",
9
+ "generated_at_utc": "2026-01-25T15:53:20Z",
10
+ "overall_status": "FAIL",
11
+ "blocking_failure": null,
12
+ "runtime_contract": {
13
+ "exists": true,
14
+ "path": "contracts/repo.runtime.json",
15
+ "schema_path": "contracts/schemas/repo/repo.runtime.v1.schema.json",
16
+ "valid": true,
17
+ "record_version": "repo.runtime.v1",
18
+ "authoritative_repo_role": "enterprise-substrate-logging",
19
+ "repo_role": "enterprise-substrate-logging",
20
+ "repo_id": "unifyplane-logsdk",
21
+ "module_system": "esm",
22
+ "node_target": "node22",
23
+ "tsconfig_path": "tsconfig.json",
24
+ "dist_entry": "dist/index.js",
25
+ "json_strategy": "esm-import"
26
+ },
27
+ "derived_runtime_diagnostics": {
28
+ "signals": {
29
+ "audit_root_resolution": "Starting at C:\\Ananda\\projects\\unifyplane\\LogSDK (package.json located here)",
30
+ "package_json_type": "module",
31
+ "tsconfig_module": "ES2022",
32
+ "tsconfig_moduleResolution": "Bundler",
33
+ "dist_require_matches": false,
34
+ "dist_import_matches": true,
35
+ "dist_export_matches": true,
36
+ "dist_has_contracts_dir": false,
37
+ "dist_has_schemas_dir": false
38
+ },
39
+ "surfaces": {
40
+ "agents_md": true,
41
+ "package_json": true,
42
+ "tsconfig_json": true,
43
+ "src_dir": true,
44
+ "app_dir": false,
45
+ "plans_dir": false,
46
+ "tools_dir": true,
47
+ "tests_dir": true,
48
+ "contracts_dir": true,
49
+ "evidence_dir": true,
50
+ "dist_dir": true
51
+ }
52
+ },
53
+ "rule_findings": [
54
+ {
55
+ "rule_id": "BUILD-DIST-001",
56
+ "status": "PASS",
57
+ "scope": "REPO_STATIC",
58
+ "evidence": "dist/ directory exists with compiled artifacts such as dist/index.js"
59
+ },
60
+ {
61
+ "rule_id": "DEP-SDK-001",
62
+ "status": "PASS",
63
+ "scope": "REPO_STATIC",
64
+ "evidence": "package.json declares no dependencies and dependency_policy.mode=workspace-allowed"
65
+ },
66
+ {
67
+ "rule_id": "DIST-ENTRY-001",
68
+ "status": "PASS",
69
+ "scope": "RUNTIME_CONTRACT",
70
+ "evidence": "runtime manifest dist_entry=dist/index.js and the file exists"
71
+ },
72
+ {
73
+ "rule_id": "LOG-FORB-001",
74
+ "status": "PASS",
75
+ "scope": "REPO_STATIC",
76
+ "evidence": "No console.log occurrences exist within src/ or dist/ (rg search returned nothing)"
77
+ },
78
+ {
79
+ "rule_id": "META-RUNTIME-001",
80
+ "status": "PASS",
81
+ "scope": "RUNTIME_CONTRACT",
82
+ "evidence": "contracts/repo.runtime.json is present"
83
+ },
84
+ {
85
+ "rule_id": "META-RUNTIME-002",
86
+ "status": "PASS",
87
+ "scope": "RUNTIME_CONTRACT",
88
+ "evidence": "Derived schema contracts/schemas/repo/repo.runtime.v1.schema.json exists"
89
+ },
90
+ {
91
+ "rule_id": "META-RUNTIME-003",
92
+ "status": "PASS",
93
+ "scope": "RUNTIME_CONTRACT",
94
+ "evidence": "Runtime contract satisfies the schema (required keys, enums, ajv structure, etc.)"
95
+ },
96
+ {
97
+ "rule_id": "META-RUNTIME-004",
98
+ "status": "PASS",
99
+ "scope": "RUNTIME_CONTRACT",
100
+ "evidence": "record_version equals repo.runtime.v1"
101
+ },
102
+ {
103
+ "rule_id": "MOD-CJS-001",
104
+ "status": "NOT_APPLICABLE",
105
+ "scope": "RUNTIME_CONTRACT",
106
+ "evidence": "Module system is declared as esm so CJS-specific requirement is not evaluated"
107
+ },
108
+ {
109
+ "rule_id": "MOD-CJS-002",
110
+ "status": "NOT_APPLICABLE",
111
+ "scope": "RUNTIME_CONTRACT",
112
+ "evidence": "Module system is declared as esm so CJS-specific requirement is not evaluated"
113
+ },
114
+ {
115
+ "rule_id": "MOD-CJS-003",
116
+ "status": "NOT_APPLICABLE",
117
+ "scope": "RUNTIME_CONTRACT",
118
+ "evidence": "Module system is declared as esm so CJS-specific requirement is not evaluated"
119
+ },
120
+ {
121
+ "rule_id": "MOD-ESM-001",
122
+ "status": "PASS",
123
+ "scope": "RUNTIME_CONTRACT",
124
+ "evidence": "dist/index.js uses static ESM import/export statements with .js extensions"
125
+ },
126
+ {
127
+ "rule_id": "MOD-ESM-002",
128
+ "status": "VIOLATION",
129
+ "scope": "RUNTIME_CONTRACT",
130
+ "evidence": "tsconfig.json lines 4-5 (module=ES2022, moduleResolution=Bundler) are not NodeNext/NodeNext as required"
131
+ },
132
+ {
133
+ "rule_id": "TEST-SEM-001",
134
+ "status": "GAP",
135
+ "scope": "REPO_STATIC",
136
+ "evidence": "Cannot confirm dist-aligned tests because npm/node commands are disallowed by instructions"
137
+ },
138
+ {
139
+ "rule_id": "TOOL-PURITY-001",
140
+ "status": "PASS",
141
+ "scope": "REPO_STATIC",
142
+ "evidence": "tools/ contains only test-result helpers under tools/test_results, so tooling does not pollute runtime dist artifacts"
143
+ }
144
+ ],
145
+ "summary": {
146
+ "blocking_failure": null,
147
+ "violation_count": 1,
148
+ "gap_count": 1,
149
+ "overall_status": "FAIL",
150
+ "explicit_violations": [
151
+ "MOD-ESM-002"
152
+ ]
153
+ }
154
+ }
@@ -0,0 +1,130 @@
1
+ {
2
+ "repo": {
3
+ "path": "C:\\Ananda\\projects\\unifyplane\\LogSDK",
4
+ "name": "@unifyplane/logsdk",
5
+ "runtime_manifest": "contracts/repo.runtime.json"
6
+ },
7
+ "audit_input_path": "C:\\Ananda\\projects\\unifyplane\\LogSDK",
8
+ "audit_root": "C:\\Ananda\\projects\\unifyplane\\LogSDK",
9
+ "generated_at_utc": "2026-01-25T16:14:52Z",
10
+ "overall_status": "FAIL",
11
+ "blocking_failure": null,
12
+ "runtime_contract": {
13
+ "exists": true,
14
+ "path": "contracts/repo.runtime.json",
15
+ "schema_path": "contracts\\schemas\\repo\\repo.runtime.v1.schema.json",
16
+ "valid": true,
17
+ "record_version": "repo.runtime.v1",
18
+ "authoritative_repo_role": "enterprise-substrate-logging",
19
+ "repo_role": "enterprise-substrate-logging",
20
+ "repo_id": "unifyplane-logsdk",
21
+ "module_system": "esm",
22
+ "node_target": "node22",
23
+ "tsconfig_path": "tsconfig.json",
24
+ "dist_entry": "dist/index.js",
25
+ "json_strategy": "esm-import"
26
+ },
27
+ "derived_runtime_diagnostics": {
28
+ "signals": null,
29
+ "surfaces": null
30
+ },
31
+ "rule_findings": [
32
+ {
33
+ "rule_id": "BUILD-DIST-001",
34
+ "status": "VIOLATION",
35
+ "scope": "REPO_STATIC",
36
+ "evidence": "dist/ directory exists with compiled artifacts such as dist/index.js"
37
+ },
38
+ {
39
+ "rule_id": "DEP-SDK-001",
40
+ "status": "PASS",
41
+ "scope": "REPO_STATIC",
42
+ "evidence": "package.json declares no dependencies and dependency_policy.mode=workspace-allowed"
43
+ },
44
+ {
45
+ "rule_id": "DIST-ENTRY-001",
46
+ "status": "PASS",
47
+ "scope": "RUNTIME_CONTRACT",
48
+ "evidence": "runtime manifest dist_entry=dist/index.js and the file exists"
49
+ },
50
+ {
51
+ "rule_id": "LOG-FORB-001",
52
+ "status": "PASS",
53
+ "scope": "REPO_STATIC",
54
+ "evidence": "rg -n console\\\\.log src dist produced no matches, so no adhoc console logging"
55
+ },
56
+ {
57
+ "rule_id": "META-RUNTIME-001",
58
+ "status": "PASS",
59
+ "scope": "RUNTIME_CONTRACT",
60
+ "evidence": "contracts/repo.runtime.json is present"
61
+ },
62
+ {
63
+ "rule_id": "META-RUNTIME-002",
64
+ "status": "PASS",
65
+ "scope": "RUNTIME_CONTRACT",
66
+ "evidence": "Derived schema contracts\\schemas\\repo\\repo.runtime.v1.schema.json exists"
67
+ },
68
+ {
69
+ "rule_id": "META-RUNTIME-003",
70
+ "status": "PASS",
71
+ "scope": "RUNTIME_CONTRACT",
72
+ "evidence": "Runtime contract satisfies the schema constraints (required keys, enums, ajv structure, etc.)"
73
+ },
74
+ {
75
+ "rule_id": "META-RUNTIME-004",
76
+ "status": "PASS",
77
+ "scope": "RUNTIME_CONTRACT",
78
+ "evidence": "record_version equals repo.runtime.v1"
79
+ },
80
+ {
81
+ "rule_id": "MOD-CJS-001",
82
+ "status": "NOT_APPLICABLE",
83
+ "scope": "RUNTIME_CONTRACT",
84
+ "evidence": "Module system is declared as esm so CJS-specific requirement is not evaluated"
85
+ },
86
+ {
87
+ "rule_id": "MOD-CJS-002",
88
+ "status": "NOT_APPLICABLE",
89
+ "scope": "RUNTIME_CONTRACT",
90
+ "evidence": "Module system is declared as esm so CJS-specific requirement is not evaluated"
91
+ },
92
+ {
93
+ "rule_id": "MOD-CJS-003",
94
+ "status": "NOT_APPLICABLE",
95
+ "scope": "RUNTIME_CONTRACT",
96
+ "evidence": "Module system is declared as esm so CJS-specific requirement is not evaluated"
97
+ },
98
+ {
99
+ "rule_id": "MOD-ESM-001",
100
+ "status": "PASS",
101
+ "scope": "RUNTIME_CONTRACT",
102
+ "evidence": "dist/index.js uses static ESM imports/exports with .js extensions"
103
+ },
104
+ {
105
+ "rule_id": "MOD-ESM-002",
106
+ "status": "PASS",
107
+ "scope": "RUNTIME_CONTRACT",
108
+ "evidence": "tsconfig.json module and moduleResolution are both NodeNext"
109
+ },
110
+ {
111
+ "rule_id": "TEST-SEM-001",
112
+ "status": "GAP",
113
+ "scope": "REPO_STATIC",
114
+ "evidence": "Cannot confirm dist-aligned tests because npm/node commands are disallowed by instructions"
115
+ },
116
+ {
117
+ "rule_id": "TOOL-PURITY-001",
118
+ "status": "PASS",
119
+ "scope": "REPO_STATIC",
120
+ "evidence": "tools/ contains only the t helper folder, so tooling does not pollute runtime dist artifacts"
121
+ }
122
+ ],
123
+ "summary": {
124
+ "blocking_failure": null,
125
+ "violation_count": 1,
126
+ "gap_count": 4,
127
+ "overall_status": "FAIL",
128
+ "explicit_violations": "BUILD-DIST-001"
129
+ }
130
+ }