@lucern/contracts 0.3.0-alpha.1 → 0.3.0-alpha.10

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 (213) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/dist/component-boundary.contract.d.ts +14 -0
  3. package/dist/component-boundary.contract.js +155 -0
  4. package/dist/component-boundary.contract.js.map +1 -0
  5. package/dist/component-host-boundary.contract.d.ts +41 -0
  6. package/dist/component-host-boundary.contract.js +54 -0
  7. package/dist/component-host-boundary.contract.js.map +1 -0
  8. package/dist/context-pack.contract.d.ts +5 -3
  9. package/dist/context-pack.contract.js.map +1 -1
  10. package/dist/{dsl-BgpoVOVQ.d.ts → dsl-djCRfuWC.d.ts} +1 -1
  11. package/dist/dsl.d.ts +1 -1
  12. package/dist/dsl.js +1 -4
  13. package/dist/dsl.js.map +1 -1
  14. package/dist/edge-policy-manifest-Dw5IhT1L.d.ts +133 -0
  15. package/dist/function-registry/beliefs.d.ts +41 -41
  16. package/dist/function-registry/beliefs.js +709 -31
  17. package/dist/function-registry/beliefs.js.map +1 -1
  18. package/dist/function-registry/coding.js +694 -31
  19. package/dist/function-registry/coding.js.map +1 -1
  20. package/dist/function-registry/context.d.ts +13 -13
  21. package/dist/function-registry/context.js +700 -35
  22. package/dist/function-registry/context.js.map +1 -1
  23. package/dist/function-registry/contracts.js +665 -28
  24. package/dist/function-registry/contracts.js.map +1 -1
  25. package/dist/function-registry/coordination.js +665 -28
  26. package/dist/function-registry/coordination.js.map +1 -1
  27. package/dist/function-registry/edges.d.ts +156 -0
  28. package/dist/function-registry/edges.js +876 -60
  29. package/dist/function-registry/edges.js.map +1 -1
  30. package/dist/function-registry/evidence.d.ts +33 -33
  31. package/dist/function-registry/evidence.js +717 -37
  32. package/dist/function-registry/evidence.js.map +1 -1
  33. package/dist/function-registry/graph.d.ts +131 -53
  34. package/dist/function-registry/graph.js +781 -35
  35. package/dist/function-registry/graph.js.map +1 -1
  36. package/dist/function-registry/helpers.d.ts +3 -3
  37. package/dist/function-registry/helpers.js +665 -28
  38. package/dist/function-registry/helpers.js.map +1 -1
  39. package/dist/function-registry/identity.js +665 -28
  40. package/dist/function-registry/identity.js.map +1 -1
  41. package/dist/function-registry/index.d.ts +321 -7
  42. package/dist/function-registry/index.js +1046 -33
  43. package/dist/function-registry/index.js.map +1 -1
  44. package/dist/function-registry/judgments.d.ts +9 -9
  45. package/dist/function-registry/judgments.js +677 -31
  46. package/dist/function-registry/judgments.js.map +1 -1
  47. package/dist/function-registry/legacy.js +665 -28
  48. package/dist/function-registry/legacy.js.map +1 -1
  49. package/dist/function-registry/lenses.d.ts +17 -17
  50. package/dist/function-registry/lenses.js +688 -31
  51. package/dist/function-registry/lenses.js.map +1 -1
  52. package/dist/function-registry/manifest.d.ts +6 -6
  53. package/dist/function-registry/manifest.js +18 -2
  54. package/dist/function-registry/manifest.js.map +1 -1
  55. package/dist/function-registry/ontologies.d.ts +45 -45
  56. package/dist/function-registry/ontologies.js +683 -34
  57. package/dist/function-registry/ontologies.js.map +1 -1
  58. package/dist/function-registry/pipeline.d.ts +13 -13
  59. package/dist/function-registry/pipeline.js +674 -31
  60. package/dist/function-registry/pipeline.js.map +1 -1
  61. package/dist/function-registry/questions.d.ts +49 -49
  62. package/dist/function-registry/questions.js +762 -36
  63. package/dist/function-registry/questions.js.map +1 -1
  64. package/dist/function-registry/tasks.d.ts +17 -17
  65. package/dist/function-registry/tasks.js +709 -30
  66. package/dist/function-registry/tasks.js.map +1 -1
  67. package/dist/function-registry/topics.d.ts +99 -21
  68. package/dist/function-registry/topics.js +747 -32
  69. package/dist/function-registry/topics.js.map +1 -1
  70. package/dist/function-registry/types.d.ts +1 -1
  71. package/dist/function-registry/worktrees.d.ts +80 -41
  72. package/dist/function-registry/worktrees.js +804 -40
  73. package/dist/function-registry/worktrees.js.map +1 -1
  74. package/dist/function-registry-input-audit.d.ts +13 -0
  75. package/dist/function-registry-input-audit.js +166 -0
  76. package/dist/function-registry-input-audit.js.map +1 -0
  77. package/dist/gateway.contract.d.ts +2 -0
  78. package/dist/gateway.contract.js.map +1 -1
  79. package/dist/generated/convexSchemas.js +4 -3
  80. package/dist/generated/convexSchemas.js.map +1 -1
  81. package/dist/generated/schema-manifest.json +49 -3
  82. package/dist/generated/tableOwnership.d.ts +2 -1
  83. package/dist/generated/tableOwnership.js +2 -0
  84. package/dist/generated/tableOwnership.js.map +1 -1
  85. package/dist/generated/tier-expectations.json +4 -2
  86. package/dist/graph-intelligence.contract.d.ts +506 -0
  87. package/dist/graph-intelligence.contract.js +595 -0
  88. package/dist/graph-intelligence.contract.js.map +1 -0
  89. package/dist/graph-types/index.d.ts +5 -1
  90. package/dist/graph-types/index.js +15 -4
  91. package/dist/graph-types/index.js.map +1 -1
  92. package/dist/{index-CV-0_VWJ.d.ts → index-O09U2xHk.d.ts} +5 -2
  93. package/dist/index.d.ts +24 -413
  94. package/dist/index.js +3286 -136
  95. package/dist/index.js.map +1 -1
  96. package/dist/infisical-runtime.contract.d.ts +174 -0
  97. package/dist/infisical-runtime.contract.js +317 -0
  98. package/dist/infisical-runtime.contract.js.map +1 -0
  99. package/dist/lens-filter.contract.js +4 -3
  100. package/dist/lens-filter.contract.js.map +1 -1
  101. package/dist/lens-workflow.contract.js +4 -3
  102. package/dist/lens-workflow.contract.js.map +1 -1
  103. package/dist/manifests/edge-policy-manifest.d.ts +2 -0
  104. package/dist/manifests/edge-policy-manifest.data.d.ts +13 -0
  105. package/dist/manifests/edge-policy-manifest.data.js +26 -0
  106. package/dist/manifests/edge-policy-manifest.data.js.map +1 -0
  107. package/dist/manifests/edge-policy-manifest.js +92 -0
  108. package/dist/manifests/edge-policy-manifest.js.map +1 -0
  109. package/dist/manifests/infisical-runtime-manifest.d.ts +151 -0
  110. package/dist/manifests/infisical-runtime-manifest.js +316 -0
  111. package/dist/manifests/infisical-runtime-manifest.js.map +1 -0
  112. package/dist/manifests/invariant-manifest.d.ts +65 -0
  113. package/dist/manifests/invariant-manifest.js +18 -0
  114. package/dist/manifests/invariant-manifest.js.map +1 -0
  115. package/dist/manifests/invariants/ast-utils.d.ts +14 -0
  116. package/dist/manifests/invariants/ast-utils.js +54 -0
  117. package/dist/manifests/invariants/ast-utils.js.map +1 -0
  118. package/dist/manifests/invariants/index.d.ts +15 -0
  119. package/dist/manifests/invariants/index.js +183 -0
  120. package/dist/manifests/invariants/index.js.map +1 -0
  121. package/dist/manifests/invariants/inv-1-beliefs-append-only.d.ts +12 -0
  122. package/dist/manifests/invariants/inv-1-beliefs-append-only.js +94 -0
  123. package/dist/manifests/invariants/inv-1-beliefs-append-only.js.map +1 -0
  124. package/dist/manifests/invariants/inv-14-no-silent-transitions.d.ts +12 -0
  125. package/dist/manifests/invariants/inv-14-no-silent-transitions.js +99 -0
  126. package/dist/manifests/invariants/inv-14-no-silent-transitions.js.map +1 -0
  127. package/dist/manifests/invariants/manifest-1-projections-declare-audit.d.ts +12 -0
  128. package/dist/manifests/invariants/manifest-1-projections-declare-audit.js +42 -0
  129. package/dist/manifests/invariants/manifest-1-projections-declare-audit.js.map +1 -0
  130. package/dist/manifests/tenant-client-manifest.d.ts +322 -0
  131. package/dist/manifests/tenant-client-manifest.js +432 -0
  132. package/dist/manifests/tenant-client-manifest.js.map +1 -0
  133. package/dist/mcp-gateway-boundary.contract.d.ts +181 -0
  134. package/dist/mcp-gateway-boundary.contract.js +43 -0
  135. package/dist/mcp-gateway-boundary.contract.js.map +1 -0
  136. package/dist/projections/check-convex-args-shape.d.ts +3 -0
  137. package/dist/projections/check-convex-args-shape.js +399 -0
  138. package/dist/projections/check-convex-args-shape.js.map +1 -0
  139. package/dist/projections/create-evidence.projection.d.ts +176 -0
  140. package/dist/projections/create-evidence.projection.js +131 -0
  141. package/dist/projections/create-evidence.projection.js.map +1 -0
  142. package/dist/projections/index.d.ts +102 -0
  143. package/dist/projections/index.js +348 -0
  144. package/dist/projections/index.js.map +1 -0
  145. package/dist/projections/list-beliefs.projection.d.ts +36 -0
  146. package/dist/projections/list-beliefs.projection.js +54 -0
  147. package/dist/projections/list-beliefs.projection.js.map +1 -0
  148. package/dist/projections/list-tasks.projection.d.ts +32 -0
  149. package/dist/projections/list-tasks.projection.js +52 -0
  150. package/dist/projections/list-tasks.projection.js.map +1 -0
  151. package/dist/projections/modulate-confidence.projection.d.ts +219 -0
  152. package/dist/projections/modulate-confidence.projection.js +148 -0
  153. package/dist/projections/modulate-confidence.projection.js.map +1 -0
  154. package/dist/projections/projection-dsl.d.ts +11 -0
  155. package/dist/projections/projection-dsl.js +8 -0
  156. package/dist/projections/projection-dsl.js.map +1 -0
  157. package/dist/schema-helpers/enumValidation.js +2 -5
  158. package/dist/schema-helpers/enumValidation.js.map +1 -1
  159. package/dist/schema-helpers/spine/nodes/decision.js +2 -1
  160. package/dist/schema-helpers/spine/nodes/decision.js.map +1 -1
  161. package/dist/schema-helpers/spine/tables/epistemicNodes.js +27 -27
  162. package/dist/schema-helpers/spine/tables/epistemicNodes.js.map +1 -1
  163. package/dist/schemas/component-table-manifest.d.ts +2 -2
  164. package/dist/schemas/enums.d.ts +5 -2
  165. package/dist/schemas/enums.js +5 -2
  166. package/dist/schemas/enums.js.map +1 -1
  167. package/dist/schemas/index.d.ts +1 -1
  168. package/dist/schemas/index.js +45 -4
  169. package/dist/schemas/index.js.map +1 -1
  170. package/dist/schemas/manifest.d.ts +1030 -890
  171. package/dist/schemas/manifest.js +44 -3
  172. package/dist/schemas/manifest.js.map +1 -1
  173. package/dist/schemas/sl-opinion.d.ts +4 -4
  174. package/dist/schemas/tables/identity/platform.d.ts +10 -10
  175. package/dist/schemas/tables/kernel/epistemic.d.ts +6 -6
  176. package/dist/schemas/tables/kernel/infra.d.ts +4 -4
  177. package/dist/schemas/tables/kernel/intelligence.d.ts +10 -10
  178. package/dist/schemas/tables/kernel/lens.d.ts +4 -4
  179. package/dist/schemas/tables/kernel/platform.d.ts +12 -12
  180. package/dist/schemas/tables/kernel/spine.d.ts +3 -3
  181. package/dist/schemas/tables/kernel/spine.js +5 -2
  182. package/dist/schemas/tables/kernel/spine.js.map +1 -1
  183. package/dist/schemas/tables/kernel/task.d.ts +42 -42
  184. package/dist/schemas/tables/kernel/topic.js +5 -1
  185. package/dist/schemas/tables/kernel/topic.js.map +1 -1
  186. package/dist/schemas/tables/kernel/worktree.d.ts +58 -58
  187. package/dist/schemas/tables/mc/identity.d.ts +26 -3
  188. package/dist/schemas/tables/mc/identity.js +35 -1
  189. package/dist/schemas/tables/mc/identity.js.map +1 -1
  190. package/dist/schemas/tables/mc/pack.d.ts +20 -20
  191. package/dist/schemas/tables/mc/registry.d.ts +4 -4
  192. package/dist/schemas/tables/mc/workspace.d.ts +9 -3
  193. package/dist/schemas/tables/mc/workspace.js +3 -1
  194. package/dist/schemas/tables/mc/workspace.js.map +1 -1
  195. package/dist/sdk-methods.contract.d.ts +2 -2
  196. package/dist/{sdk-tools.contract-S4ia0TTo.d.ts → sdk-tools.contract-BNklQDfB.d.ts} +2 -2
  197. package/dist/sdk-tools.contract.d.ts +2 -2
  198. package/dist/sdk-tools.contract.js +646 -23
  199. package/dist/sdk-tools.contract.js.map +1 -1
  200. package/dist/tenant-bootstrap-seed.contract.d.ts +1101 -0
  201. package/dist/tenant-bootstrap-seed.contract.js +653 -0
  202. package/dist/tenant-bootstrap-seed.contract.js.map +1 -0
  203. package/dist/tenant-bootstrap-seed.defaults.d.ts +16 -0
  204. package/dist/tenant-bootstrap-seed.defaults.js +303 -0
  205. package/dist/tenant-bootstrap-seed.defaults.js.map +1 -0
  206. package/dist/tenant-client.contract.d.ts +349 -0
  207. package/dist/tenant-client.contract.js +488 -0
  208. package/dist/tenant-client.contract.js.map +1 -0
  209. package/dist/{tool-contracts-C92-9ueT.d.ts → tool-contracts-BevD9Ho2.d.ts} +36 -2
  210. package/dist/tool-contracts.d.ts +1 -1
  211. package/dist/tool-contracts.js +647 -24
  212. package/dist/tool-contracts.js.map +1 -1
  213. package/package.json +9 -1
@@ -0,0 +1,183 @@
1
+ import { join } from 'path';
2
+ import { readdirSync, statSync, readFileSync } from 'fs';
3
+ import ts from 'typescript';
4
+
5
+ // src/manifests/invariants/inv-1-beliefs-append-only.ts
6
+ function collectTsFiles(root) {
7
+ const entries = [];
8
+ for (const name of readdirSync(root)) {
9
+ const path = join(root, name);
10
+ const stat = statSync(path);
11
+ if (stat.isDirectory()) {
12
+ if (name === "node_modules" || name === "dist" || name === ".next") {
13
+ continue;
14
+ }
15
+ entries.push(...collectTsFiles(path));
16
+ } else if (name.endsWith(".ts") && !name.endsWith(".d.ts")) {
17
+ entries.push(path);
18
+ }
19
+ }
20
+ return entries;
21
+ }
22
+ function readSource(filePath) {
23
+ const text = readFileSync(filePath, "utf8");
24
+ return {
25
+ filePath,
26
+ text,
27
+ sourceFile: ts.createSourceFile(filePath, text, ts.ScriptTarget.Latest, true)
28
+ };
29
+ }
30
+ function walk(node, visit) {
31
+ visit(node);
32
+ node.forEachChild((child) => walk(child, visit));
33
+ }
34
+ function isDbCall(node, method) {
35
+ if (!ts.isCallExpression(node)) {
36
+ return false;
37
+ }
38
+ const expression = node.expression;
39
+ if (!ts.isPropertyAccessExpression(expression)) {
40
+ return false;
41
+ }
42
+ if (expression.name.text !== method) {
43
+ return false;
44
+ }
45
+ return expression.expression.getText().endsWith(".db");
46
+ }
47
+ function lineRef(unit, node) {
48
+ const { line } = unit.sourceFile.getLineAndCharacterOfPosition(node.getStart());
49
+ return `${unit.filePath}:${line + 1}`;
50
+ }
51
+
52
+ // src/manifests/invariants/inv-1-beliefs-append-only.ts
53
+ function isBeliefWriteCandidate(node) {
54
+ const [target, patch] = node.arguments;
55
+ const targetText = target?.getText() ?? "";
56
+ const patchText = patch?.getText() ?? "";
57
+ if (!/belief/i.test(targetText)) {
58
+ return false;
59
+ }
60
+ return /canonicalText|formulation|confidence|beliefStatus/.test(patchText);
61
+ }
62
+ var INV_1_BELIEFS_APPEND_ONLY = {
63
+ invariant: "INV-1: beliefs append-only",
64
+ description: "Scored beliefs cannot be patched or deleted; they must fork.",
65
+ checker: "ast",
66
+ severity: "block_publish",
67
+ evaluate: async (ctx) => {
68
+ const root = join(ctx.repoRoot, "packages/reasoning-kernel/src/adapters");
69
+ const violations = [];
70
+ for (const filePath of collectTsFiles(root)) {
71
+ if (filePath.endsWith(".test.ts")) {
72
+ continue;
73
+ }
74
+ const unit = readSource(filePath);
75
+ walk(unit.sourceFile, (node) => {
76
+ if (isDbCall(node, "patch") && isBeliefWriteCandidate(node)) {
77
+ violations.push(lineRef(unit, node));
78
+ }
79
+ if (isDbCall(node, "delete") && /belief/i.test(node.getText())) {
80
+ violations.push(lineRef(unit, node));
81
+ }
82
+ });
83
+ }
84
+ return violations.length === 0 ? { status: "passed", evidenceRefs: [] } : {
85
+ status: "failed",
86
+ evidenceRefs: violations,
87
+ reason: `${violations.length} unwrapped belief writes found`
88
+ };
89
+ }
90
+ };
91
+ var EPISTEMIC_TABLES = [
92
+ "epistemicNodes",
93
+ "epistemicEdges",
94
+ "beliefConfidence",
95
+ "questions",
96
+ "answers",
97
+ "contradictions"
98
+ ];
99
+ var INV_14_NO_SILENT_TRANSITIONS = {
100
+ invariant: "INV-14: no silent state transitions",
101
+ description: "Epistemic state transitions must co-locate an epistemicAudit insert in the same implementation file.",
102
+ checker: "ast",
103
+ severity: "block_publish",
104
+ evaluate: async (ctx) => {
105
+ const root = join(ctx.repoRoot, "packages/reasoning-kernel/src/adapters");
106
+ const violations = [];
107
+ for (const filePath of collectTsFiles(root)) {
108
+ if (filePath.endsWith(".test.ts")) {
109
+ continue;
110
+ }
111
+ const unit = readSource(filePath);
112
+ if (unit.text.includes("epistemicAudit")) {
113
+ continue;
114
+ }
115
+ walk(unit.sourceFile, (node) => {
116
+ if (!isDbCall(node, "patch")) {
117
+ return;
118
+ }
119
+ const text = node.getText();
120
+ const touchesEpistemicState = EPISTEMIC_TABLES.some((table) => text.includes(`"${table}"`)) || /\b(belief|question|answer|contradiction|edge)\w*Id\b/i.test(text);
121
+ const carriesAuditIntent = /\b(epistemicAudit|rationale|reason|audit)\b/i.test(text);
122
+ if (touchesEpistemicState && !carriesAuditIntent) {
123
+ violations.push(lineRef(unit, node));
124
+ }
125
+ });
126
+ }
127
+ return violations.length === 0 ? { status: "passed", evidenceRefs: [] } : {
128
+ status: "failed",
129
+ evidenceRefs: violations,
130
+ reason: `${violations.length} epistemic writes lack local audit evidence`
131
+ };
132
+ }
133
+ };
134
+
135
+ // src/manifests/invariants/manifest-1-projections-declare-audit.ts
136
+ function objectShape(schema) {
137
+ let current = schema;
138
+ while (current._def.typeName === "ZodEffects") {
139
+ current = current._def.schema;
140
+ }
141
+ const def = current._def;
142
+ if (typeof def.shape === "function") {
143
+ return def.shape();
144
+ }
145
+ if (def.shape && typeof def.shape === "object") {
146
+ return def.shape;
147
+ }
148
+ return void 0;
149
+ }
150
+ var MANIFEST_1_PROJECTIONS_DECLARE_AUDIT = {
151
+ invariant: "MANIFEST-1: kernel projections declare epistemicAudit",
152
+ description: "Kernel mutation projections must carry a rationale so audit evidence can explain the transition.",
153
+ checker: "manifest",
154
+ severity: "block_publish",
155
+ evaluate: async (ctx) => {
156
+ const violations = [];
157
+ for (const [name, projection] of Object.entries(ctx.projections)) {
158
+ if (!/^(create|modulate|fork|update)_/.test(name)) {
159
+ continue;
160
+ }
161
+ const shape = objectShape(projection.inputSchema);
162
+ if (!shape || !("rationale" in shape)) {
163
+ violations.push(`projection '${name}' missing 'rationale' field`);
164
+ }
165
+ }
166
+ return violations.length === 0 ? { status: "passed", evidenceRefs: [] } : {
167
+ status: "failed",
168
+ evidenceRefs: violations,
169
+ reason: `${violations.length} projections missing audit rationale`
170
+ };
171
+ }
172
+ };
173
+
174
+ // src/manifests/invariants/index.ts
175
+ var invariants = [
176
+ INV_1_BELIEFS_APPEND_ONLY,
177
+ INV_14_NO_SILENT_TRANSITIONS,
178
+ MANIFEST_1_PROJECTIONS_DECLARE_AUDIT
179
+ ];
180
+
181
+ export { INV_14_NO_SILENT_TRANSITIONS, INV_1_BELIEFS_APPEND_ONLY, MANIFEST_1_PROJECTIONS_DECLARE_AUDIT, invariants };
182
+ //# sourceMappingURL=index.js.map
183
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/manifests/invariants/ast-utils.ts","../../../src/manifests/invariants/inv-1-beliefs-append-only.ts","../../../src/manifests/invariants/inv-14-no-silent-transitions.ts","../../../src/manifests/invariants/manifest-1-projections-declare-audit.ts","../../../src/manifests/invariants/index.ts"],"names":["join"],"mappings":"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","file":"index.js","sourcesContent":["import { readFileSync, readdirSync, statSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport ts from \"typescript\";\n\nexport type SourceUnit = {\n filePath: string;\n text: string;\n sourceFile: ts.SourceFile;\n};\n\nexport function collectTsFiles(root: string): string[] {\n const entries: string[] = [];\n for (const name of readdirSync(root)) {\n const path = join(root, name);\n const stat = statSync(path);\n if (stat.isDirectory()) {\n if (name === \"node_modules\" || name === \"dist\" || name === \".next\") {\n continue;\n }\n entries.push(...collectTsFiles(path));\n } else if (name.endsWith(\".ts\") && !name.endsWith(\".d.ts\")) {\n entries.push(path);\n }\n }\n return entries;\n}\n\nexport function readSource(filePath: string): SourceUnit {\n const text = readFileSync(filePath, \"utf8\");\n return {\n filePath,\n text,\n sourceFile: ts.createSourceFile(filePath, text, ts.ScriptTarget.Latest, true),\n };\n}\n\nexport function walk(node: ts.Node, visit: (node: ts.Node) => void): void {\n visit(node);\n node.forEachChild((child) => walk(child, visit));\n}\n\nexport function isDbCall(node: ts.Node, method: string): node is ts.CallExpression {\n if (!ts.isCallExpression(node)) {\n return false;\n }\n const expression = node.expression;\n if (!ts.isPropertyAccessExpression(expression)) {\n return false;\n }\n if (expression.name.text !== method) {\n return false;\n }\n return expression.expression.getText().endsWith(\".db\");\n}\n\nexport function lineRef(unit: SourceUnit, node: ts.Node): string {\n const { line } = unit.sourceFile.getLineAndCharacterOfPosition(node.getStart());\n return `${unit.filePath}:${line + 1}`;\n}\n","import { join } from \"node:path\";\nimport ts from \"typescript\";\nimport type { InvariantRule } from \"../invariant-manifest.js\";\nimport { collectTsFiles, isDbCall, lineRef, readSource, walk } from \"./ast-utils.js\";\n\nfunction isBeliefWriteCandidate(node: ts.CallExpression): boolean {\n const [target, patch] = node.arguments;\n const targetText = target?.getText() ?? \"\";\n const patchText = patch?.getText() ?? \"\";\n\n if (!/belief/i.test(targetText)) {\n return false;\n }\n\n return /canonicalText|formulation|confidence|beliefStatus/.test(patchText);\n}\n\nexport const INV_1_BELIEFS_APPEND_ONLY: InvariantRule = {\n invariant: \"INV-1: beliefs append-only\",\n description: \"Scored beliefs cannot be patched or deleted; they must fork.\",\n checker: \"ast\",\n severity: \"block_publish\",\n evaluate: async (ctx) => {\n const root = join(ctx.repoRoot, \"packages/reasoning-kernel/src/adapters\");\n const violations: string[] = [];\n\n for (const filePath of collectTsFiles(root)) {\n if (filePath.endsWith(\".test.ts\")) {\n continue;\n }\n const unit = readSource(filePath);\n walk(unit.sourceFile, (node) => {\n if (isDbCall(node, \"patch\") && isBeliefWriteCandidate(node)) {\n violations.push(lineRef(unit, node));\n }\n if (isDbCall(node, \"delete\") && /belief/i.test(node.getText())) {\n violations.push(lineRef(unit, node));\n }\n });\n }\n\n return violations.length === 0\n ? { status: \"passed\", evidenceRefs: [] }\n : {\n status: \"failed\",\n evidenceRefs: violations,\n reason: `${violations.length} unwrapped belief writes found`,\n };\n },\n};\n","import { join } from \"node:path\";\nimport type { InvariantRule } from \"../invariant-manifest.js\";\nimport { collectTsFiles, isDbCall, lineRef, readSource, walk } from \"./ast-utils.js\";\n\nconst EPISTEMIC_TABLES = [\n \"epistemicNodes\",\n \"epistemicEdges\",\n \"beliefConfidence\",\n \"questions\",\n \"answers\",\n \"contradictions\",\n];\n\nexport const INV_14_NO_SILENT_TRANSITIONS: InvariantRule = {\n invariant: \"INV-14: no silent state transitions\",\n description:\n \"Epistemic state transitions must co-locate an epistemicAudit insert in the same implementation file.\",\n checker: \"ast\",\n severity: \"block_publish\",\n evaluate: async (ctx) => {\n const root = join(ctx.repoRoot, \"packages/reasoning-kernel/src/adapters\");\n const violations: string[] = [];\n\n for (const filePath of collectTsFiles(root)) {\n if (filePath.endsWith(\".test.ts\")) {\n continue;\n }\n const unit = readSource(filePath);\n if (unit.text.includes(\"epistemicAudit\")) {\n continue;\n }\n\n walk(unit.sourceFile, (node) => {\n if (!isDbCall(node, \"patch\")) {\n return;\n }\n const text = node.getText();\n const touchesEpistemicState =\n EPISTEMIC_TABLES.some((table) => text.includes(`\"${table}\"`)) ||\n /\\b(belief|question|answer|contradiction|edge)\\w*Id\\b/i.test(text);\n const carriesAuditIntent =\n /\\b(epistemicAudit|rationale|reason|audit)\\b/i.test(text);\n if (touchesEpistemicState && !carriesAuditIntent) {\n violations.push(lineRef(unit, node));\n }\n });\n }\n\n return violations.length === 0\n ? { status: \"passed\", evidenceRefs: [] }\n : {\n status: \"failed\",\n evidenceRefs: violations,\n reason: `${violations.length} epistemic writes lack local audit evidence`,\n };\n },\n};\n","import type { z } from \"zod\";\nimport type { InvariantRule } from \"../invariant-manifest.js\";\n\nfunction objectShape(schema: z.ZodTypeAny): Record<string, unknown> | undefined {\n let current = schema;\n while (current._def.typeName === \"ZodEffects\") {\n current = (current._def as { schema: z.ZodTypeAny }).schema;\n }\n\n const def = current._def as { shape?: unknown };\n if (typeof def.shape === \"function\") {\n return def.shape() as Record<string, unknown>;\n }\n if (def.shape && typeof def.shape === \"object\") {\n return def.shape as Record<string, unknown>;\n }\n return undefined;\n}\n\nexport const MANIFEST_1_PROJECTIONS_DECLARE_AUDIT: InvariantRule = {\n invariant: \"MANIFEST-1: kernel projections declare epistemicAudit\",\n description:\n \"Kernel mutation projections must carry a rationale so audit evidence can explain the transition.\",\n checker: \"manifest\",\n severity: \"block_publish\",\n evaluate: async (ctx) => {\n const violations: string[] = [];\n\n for (const [name, projection] of Object.entries(ctx.projections)) {\n if (!/^(create|modulate|fork|update)_/.test(name)) {\n continue;\n }\n const shape = objectShape(projection.inputSchema);\n if (!shape || !(\"rationale\" in shape)) {\n violations.push(`projection '${name}' missing 'rationale' field`);\n }\n }\n\n return violations.length === 0\n ? { status: \"passed\", evidenceRefs: [] }\n : {\n status: \"failed\",\n evidenceRefs: violations,\n reason: `${violations.length} projections missing audit rationale`,\n };\n },\n};\n","import { INV_1_BELIEFS_APPEND_ONLY } from \"./inv-1-beliefs-append-only.js\";\nimport { INV_14_NO_SILENT_TRANSITIONS } from \"./inv-14-no-silent-transitions.js\";\nimport { MANIFEST_1_PROJECTIONS_DECLARE_AUDIT } from \"./manifest-1-projections-declare-audit.js\";\n\nexport const invariants = [\n INV_1_BELIEFS_APPEND_ONLY,\n INV_14_NO_SILENT_TRANSITIONS,\n MANIFEST_1_PROJECTIONS_DECLARE_AUDIT,\n] as const;\n\nexport { INV_1_BELIEFS_APPEND_ONLY } from \"./inv-1-beliefs-append-only.js\";\nexport { INV_14_NO_SILENT_TRANSITIONS } from \"./inv-14-no-silent-transitions.js\";\nexport { MANIFEST_1_PROJECTIONS_DECLARE_AUDIT } from \"./manifest-1-projections-declare-audit.js\";\n"]}
@@ -0,0 +1,12 @@
1
+ import { InvariantRule } from '../invariant-manifest.js';
2
+ import 'zod';
3
+ import '../../projections/index.js';
4
+ import '../../projections/projection-dsl.js';
5
+ import '../../projections/create-evidence.projection.js';
6
+ import '../../projections/list-beliefs.projection.js';
7
+ import '../../projections/list-tasks.projection.js';
8
+ import '../../projections/modulate-confidence.projection.js';
9
+
10
+ declare const INV_1_BELIEFS_APPEND_ONLY: InvariantRule;
11
+
12
+ export { INV_1_BELIEFS_APPEND_ONLY };
@@ -0,0 +1,94 @@
1
+ import { join } from 'path';
2
+ import { readdirSync, statSync, readFileSync } from 'fs';
3
+ import ts from 'typescript';
4
+
5
+ // src/manifests/invariants/inv-1-beliefs-append-only.ts
6
+ function collectTsFiles(root) {
7
+ const entries = [];
8
+ for (const name of readdirSync(root)) {
9
+ const path = join(root, name);
10
+ const stat = statSync(path);
11
+ if (stat.isDirectory()) {
12
+ if (name === "node_modules" || name === "dist" || name === ".next") {
13
+ continue;
14
+ }
15
+ entries.push(...collectTsFiles(path));
16
+ } else if (name.endsWith(".ts") && !name.endsWith(".d.ts")) {
17
+ entries.push(path);
18
+ }
19
+ }
20
+ return entries;
21
+ }
22
+ function readSource(filePath) {
23
+ const text = readFileSync(filePath, "utf8");
24
+ return {
25
+ filePath,
26
+ text,
27
+ sourceFile: ts.createSourceFile(filePath, text, ts.ScriptTarget.Latest, true)
28
+ };
29
+ }
30
+ function walk(node, visit) {
31
+ visit(node);
32
+ node.forEachChild((child) => walk(child, visit));
33
+ }
34
+ function isDbCall(node, method) {
35
+ if (!ts.isCallExpression(node)) {
36
+ return false;
37
+ }
38
+ const expression = node.expression;
39
+ if (!ts.isPropertyAccessExpression(expression)) {
40
+ return false;
41
+ }
42
+ if (expression.name.text !== method) {
43
+ return false;
44
+ }
45
+ return expression.expression.getText().endsWith(".db");
46
+ }
47
+ function lineRef(unit, node) {
48
+ const { line } = unit.sourceFile.getLineAndCharacterOfPosition(node.getStart());
49
+ return `${unit.filePath}:${line + 1}`;
50
+ }
51
+
52
+ // src/manifests/invariants/inv-1-beliefs-append-only.ts
53
+ function isBeliefWriteCandidate(node) {
54
+ const [target, patch] = node.arguments;
55
+ const targetText = target?.getText() ?? "";
56
+ const patchText = patch?.getText() ?? "";
57
+ if (!/belief/i.test(targetText)) {
58
+ return false;
59
+ }
60
+ return /canonicalText|formulation|confidence|beliefStatus/.test(patchText);
61
+ }
62
+ var INV_1_BELIEFS_APPEND_ONLY = {
63
+ invariant: "INV-1: beliefs append-only",
64
+ description: "Scored beliefs cannot be patched or deleted; they must fork.",
65
+ checker: "ast",
66
+ severity: "block_publish",
67
+ evaluate: async (ctx) => {
68
+ const root = join(ctx.repoRoot, "packages/reasoning-kernel/src/adapters");
69
+ const violations = [];
70
+ for (const filePath of collectTsFiles(root)) {
71
+ if (filePath.endsWith(".test.ts")) {
72
+ continue;
73
+ }
74
+ const unit = readSource(filePath);
75
+ walk(unit.sourceFile, (node) => {
76
+ if (isDbCall(node, "patch") && isBeliefWriteCandidate(node)) {
77
+ violations.push(lineRef(unit, node));
78
+ }
79
+ if (isDbCall(node, "delete") && /belief/i.test(node.getText())) {
80
+ violations.push(lineRef(unit, node));
81
+ }
82
+ });
83
+ }
84
+ return violations.length === 0 ? { status: "passed", evidenceRefs: [] } : {
85
+ status: "failed",
86
+ evidenceRefs: violations,
87
+ reason: `${violations.length} unwrapped belief writes found`
88
+ };
89
+ }
90
+ };
91
+
92
+ export { INV_1_BELIEFS_APPEND_ONLY };
93
+ //# sourceMappingURL=inv-1-beliefs-append-only.js.map
94
+ //# sourceMappingURL=inv-1-beliefs-append-only.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/manifests/invariants/ast-utils.ts","../../../src/manifests/invariants/inv-1-beliefs-append-only.ts"],"names":["join"],"mappings":"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","file":"inv-1-beliefs-append-only.js","sourcesContent":["import { readFileSync, readdirSync, statSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport ts from \"typescript\";\n\nexport type SourceUnit = {\n filePath: string;\n text: string;\n sourceFile: ts.SourceFile;\n};\n\nexport function collectTsFiles(root: string): string[] {\n const entries: string[] = [];\n for (const name of readdirSync(root)) {\n const path = join(root, name);\n const stat = statSync(path);\n if (stat.isDirectory()) {\n if (name === \"node_modules\" || name === \"dist\" || name === \".next\") {\n continue;\n }\n entries.push(...collectTsFiles(path));\n } else if (name.endsWith(\".ts\") && !name.endsWith(\".d.ts\")) {\n entries.push(path);\n }\n }\n return entries;\n}\n\nexport function readSource(filePath: string): SourceUnit {\n const text = readFileSync(filePath, \"utf8\");\n return {\n filePath,\n text,\n sourceFile: ts.createSourceFile(filePath, text, ts.ScriptTarget.Latest, true),\n };\n}\n\nexport function walk(node: ts.Node, visit: (node: ts.Node) => void): void {\n visit(node);\n node.forEachChild((child) => walk(child, visit));\n}\n\nexport function isDbCall(node: ts.Node, method: string): node is ts.CallExpression {\n if (!ts.isCallExpression(node)) {\n return false;\n }\n const expression = node.expression;\n if (!ts.isPropertyAccessExpression(expression)) {\n return false;\n }\n if (expression.name.text !== method) {\n return false;\n }\n return expression.expression.getText().endsWith(\".db\");\n}\n\nexport function lineRef(unit: SourceUnit, node: ts.Node): string {\n const { line } = unit.sourceFile.getLineAndCharacterOfPosition(node.getStart());\n return `${unit.filePath}:${line + 1}`;\n}\n","import { join } from \"node:path\";\nimport ts from \"typescript\";\nimport type { InvariantRule } from \"../invariant-manifest.js\";\nimport { collectTsFiles, isDbCall, lineRef, readSource, walk } from \"./ast-utils.js\";\n\nfunction isBeliefWriteCandidate(node: ts.CallExpression): boolean {\n const [target, patch] = node.arguments;\n const targetText = target?.getText() ?? \"\";\n const patchText = patch?.getText() ?? \"\";\n\n if (!/belief/i.test(targetText)) {\n return false;\n }\n\n return /canonicalText|formulation|confidence|beliefStatus/.test(patchText);\n}\n\nexport const INV_1_BELIEFS_APPEND_ONLY: InvariantRule = {\n invariant: \"INV-1: beliefs append-only\",\n description: \"Scored beliefs cannot be patched or deleted; they must fork.\",\n checker: \"ast\",\n severity: \"block_publish\",\n evaluate: async (ctx) => {\n const root = join(ctx.repoRoot, \"packages/reasoning-kernel/src/adapters\");\n const violations: string[] = [];\n\n for (const filePath of collectTsFiles(root)) {\n if (filePath.endsWith(\".test.ts\")) {\n continue;\n }\n const unit = readSource(filePath);\n walk(unit.sourceFile, (node) => {\n if (isDbCall(node, \"patch\") && isBeliefWriteCandidate(node)) {\n violations.push(lineRef(unit, node));\n }\n if (isDbCall(node, \"delete\") && /belief/i.test(node.getText())) {\n violations.push(lineRef(unit, node));\n }\n });\n }\n\n return violations.length === 0\n ? { status: \"passed\", evidenceRefs: [] }\n : {\n status: \"failed\",\n evidenceRefs: violations,\n reason: `${violations.length} unwrapped belief writes found`,\n };\n },\n};\n"]}
@@ -0,0 +1,12 @@
1
+ import { InvariantRule } from '../invariant-manifest.js';
2
+ import 'zod';
3
+ import '../../projections/index.js';
4
+ import '../../projections/projection-dsl.js';
5
+ import '../../projections/create-evidence.projection.js';
6
+ import '../../projections/list-beliefs.projection.js';
7
+ import '../../projections/list-tasks.projection.js';
8
+ import '../../projections/modulate-confidence.projection.js';
9
+
10
+ declare const INV_14_NO_SILENT_TRANSITIONS: InvariantRule;
11
+
12
+ export { INV_14_NO_SILENT_TRANSITIONS };
@@ -0,0 +1,99 @@
1
+ import { join } from 'path';
2
+ import { readdirSync, statSync, readFileSync } from 'fs';
3
+ import ts from 'typescript';
4
+
5
+ // src/manifests/invariants/inv-14-no-silent-transitions.ts
6
+ function collectTsFiles(root) {
7
+ const entries = [];
8
+ for (const name of readdirSync(root)) {
9
+ const path = join(root, name);
10
+ const stat = statSync(path);
11
+ if (stat.isDirectory()) {
12
+ if (name === "node_modules" || name === "dist" || name === ".next") {
13
+ continue;
14
+ }
15
+ entries.push(...collectTsFiles(path));
16
+ } else if (name.endsWith(".ts") && !name.endsWith(".d.ts")) {
17
+ entries.push(path);
18
+ }
19
+ }
20
+ return entries;
21
+ }
22
+ function readSource(filePath) {
23
+ const text = readFileSync(filePath, "utf8");
24
+ return {
25
+ filePath,
26
+ text,
27
+ sourceFile: ts.createSourceFile(filePath, text, ts.ScriptTarget.Latest, true)
28
+ };
29
+ }
30
+ function walk(node, visit) {
31
+ visit(node);
32
+ node.forEachChild((child) => walk(child, visit));
33
+ }
34
+ function isDbCall(node, method) {
35
+ if (!ts.isCallExpression(node)) {
36
+ return false;
37
+ }
38
+ const expression = node.expression;
39
+ if (!ts.isPropertyAccessExpression(expression)) {
40
+ return false;
41
+ }
42
+ if (expression.name.text !== method) {
43
+ return false;
44
+ }
45
+ return expression.expression.getText().endsWith(".db");
46
+ }
47
+ function lineRef(unit, node) {
48
+ const { line } = unit.sourceFile.getLineAndCharacterOfPosition(node.getStart());
49
+ return `${unit.filePath}:${line + 1}`;
50
+ }
51
+
52
+ // src/manifests/invariants/inv-14-no-silent-transitions.ts
53
+ var EPISTEMIC_TABLES = [
54
+ "epistemicNodes",
55
+ "epistemicEdges",
56
+ "beliefConfidence",
57
+ "questions",
58
+ "answers",
59
+ "contradictions"
60
+ ];
61
+ var INV_14_NO_SILENT_TRANSITIONS = {
62
+ invariant: "INV-14: no silent state transitions",
63
+ description: "Epistemic state transitions must co-locate an epistemicAudit insert in the same implementation file.",
64
+ checker: "ast",
65
+ severity: "block_publish",
66
+ evaluate: async (ctx) => {
67
+ const root = join(ctx.repoRoot, "packages/reasoning-kernel/src/adapters");
68
+ const violations = [];
69
+ for (const filePath of collectTsFiles(root)) {
70
+ if (filePath.endsWith(".test.ts")) {
71
+ continue;
72
+ }
73
+ const unit = readSource(filePath);
74
+ if (unit.text.includes("epistemicAudit")) {
75
+ continue;
76
+ }
77
+ walk(unit.sourceFile, (node) => {
78
+ if (!isDbCall(node, "patch")) {
79
+ return;
80
+ }
81
+ const text = node.getText();
82
+ const touchesEpistemicState = EPISTEMIC_TABLES.some((table) => text.includes(`"${table}"`)) || /\b(belief|question|answer|contradiction|edge)\w*Id\b/i.test(text);
83
+ const carriesAuditIntent = /\b(epistemicAudit|rationale|reason|audit)\b/i.test(text);
84
+ if (touchesEpistemicState && !carriesAuditIntent) {
85
+ violations.push(lineRef(unit, node));
86
+ }
87
+ });
88
+ }
89
+ return violations.length === 0 ? { status: "passed", evidenceRefs: [] } : {
90
+ status: "failed",
91
+ evidenceRefs: violations,
92
+ reason: `${violations.length} epistemic writes lack local audit evidence`
93
+ };
94
+ }
95
+ };
96
+
97
+ export { INV_14_NO_SILENT_TRANSITIONS };
98
+ //# sourceMappingURL=inv-14-no-silent-transitions.js.map
99
+ //# sourceMappingURL=inv-14-no-silent-transitions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/manifests/invariants/ast-utils.ts","../../../src/manifests/invariants/inv-14-no-silent-transitions.ts"],"names":["join"],"mappings":"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","file":"inv-14-no-silent-transitions.js","sourcesContent":["import { readFileSync, readdirSync, statSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport ts from \"typescript\";\n\nexport type SourceUnit = {\n filePath: string;\n text: string;\n sourceFile: ts.SourceFile;\n};\n\nexport function collectTsFiles(root: string): string[] {\n const entries: string[] = [];\n for (const name of readdirSync(root)) {\n const path = join(root, name);\n const stat = statSync(path);\n if (stat.isDirectory()) {\n if (name === \"node_modules\" || name === \"dist\" || name === \".next\") {\n continue;\n }\n entries.push(...collectTsFiles(path));\n } else if (name.endsWith(\".ts\") && !name.endsWith(\".d.ts\")) {\n entries.push(path);\n }\n }\n return entries;\n}\n\nexport function readSource(filePath: string): SourceUnit {\n const text = readFileSync(filePath, \"utf8\");\n return {\n filePath,\n text,\n sourceFile: ts.createSourceFile(filePath, text, ts.ScriptTarget.Latest, true),\n };\n}\n\nexport function walk(node: ts.Node, visit: (node: ts.Node) => void): void {\n visit(node);\n node.forEachChild((child) => walk(child, visit));\n}\n\nexport function isDbCall(node: ts.Node, method: string): node is ts.CallExpression {\n if (!ts.isCallExpression(node)) {\n return false;\n }\n const expression = node.expression;\n if (!ts.isPropertyAccessExpression(expression)) {\n return false;\n }\n if (expression.name.text !== method) {\n return false;\n }\n return expression.expression.getText().endsWith(\".db\");\n}\n\nexport function lineRef(unit: SourceUnit, node: ts.Node): string {\n const { line } = unit.sourceFile.getLineAndCharacterOfPosition(node.getStart());\n return `${unit.filePath}:${line + 1}`;\n}\n","import { join } from \"node:path\";\nimport type { InvariantRule } from \"../invariant-manifest.js\";\nimport { collectTsFiles, isDbCall, lineRef, readSource, walk } from \"./ast-utils.js\";\n\nconst EPISTEMIC_TABLES = [\n \"epistemicNodes\",\n \"epistemicEdges\",\n \"beliefConfidence\",\n \"questions\",\n \"answers\",\n \"contradictions\",\n];\n\nexport const INV_14_NO_SILENT_TRANSITIONS: InvariantRule = {\n invariant: \"INV-14: no silent state transitions\",\n description:\n \"Epistemic state transitions must co-locate an epistemicAudit insert in the same implementation file.\",\n checker: \"ast\",\n severity: \"block_publish\",\n evaluate: async (ctx) => {\n const root = join(ctx.repoRoot, \"packages/reasoning-kernel/src/adapters\");\n const violations: string[] = [];\n\n for (const filePath of collectTsFiles(root)) {\n if (filePath.endsWith(\".test.ts\")) {\n continue;\n }\n const unit = readSource(filePath);\n if (unit.text.includes(\"epistemicAudit\")) {\n continue;\n }\n\n walk(unit.sourceFile, (node) => {\n if (!isDbCall(node, \"patch\")) {\n return;\n }\n const text = node.getText();\n const touchesEpistemicState =\n EPISTEMIC_TABLES.some((table) => text.includes(`\"${table}\"`)) ||\n /\\b(belief|question|answer|contradiction|edge)\\w*Id\\b/i.test(text);\n const carriesAuditIntent =\n /\\b(epistemicAudit|rationale|reason|audit)\\b/i.test(text);\n if (touchesEpistemicState && !carriesAuditIntent) {\n violations.push(lineRef(unit, node));\n }\n });\n }\n\n return violations.length === 0\n ? { status: \"passed\", evidenceRefs: [] }\n : {\n status: \"failed\",\n evidenceRefs: violations,\n reason: `${violations.length} epistemic writes lack local audit evidence`,\n };\n },\n};\n"]}
@@ -0,0 +1,12 @@
1
+ import { InvariantRule } from '../invariant-manifest.js';
2
+ import 'zod';
3
+ import '../../projections/index.js';
4
+ import '../../projections/projection-dsl.js';
5
+ import '../../projections/create-evidence.projection.js';
6
+ import '../../projections/list-beliefs.projection.js';
7
+ import '../../projections/list-tasks.projection.js';
8
+ import '../../projections/modulate-confidence.projection.js';
9
+
10
+ declare const MANIFEST_1_PROJECTIONS_DECLARE_AUDIT: InvariantRule;
11
+
12
+ export { MANIFEST_1_PROJECTIONS_DECLARE_AUDIT };
@@ -0,0 +1,42 @@
1
+ // src/manifests/invariants/manifest-1-projections-declare-audit.ts
2
+ function objectShape(schema) {
3
+ let current = schema;
4
+ while (current._def.typeName === "ZodEffects") {
5
+ current = current._def.schema;
6
+ }
7
+ const def = current._def;
8
+ if (typeof def.shape === "function") {
9
+ return def.shape();
10
+ }
11
+ if (def.shape && typeof def.shape === "object") {
12
+ return def.shape;
13
+ }
14
+ return void 0;
15
+ }
16
+ var MANIFEST_1_PROJECTIONS_DECLARE_AUDIT = {
17
+ invariant: "MANIFEST-1: kernel projections declare epistemicAudit",
18
+ description: "Kernel mutation projections must carry a rationale so audit evidence can explain the transition.",
19
+ checker: "manifest",
20
+ severity: "block_publish",
21
+ evaluate: async (ctx) => {
22
+ const violations = [];
23
+ for (const [name, projection] of Object.entries(ctx.projections)) {
24
+ if (!/^(create|modulate|fork|update)_/.test(name)) {
25
+ continue;
26
+ }
27
+ const shape = objectShape(projection.inputSchema);
28
+ if (!shape || !("rationale" in shape)) {
29
+ violations.push(`projection '${name}' missing 'rationale' field`);
30
+ }
31
+ }
32
+ return violations.length === 0 ? { status: "passed", evidenceRefs: [] } : {
33
+ status: "failed",
34
+ evidenceRefs: violations,
35
+ reason: `${violations.length} projections missing audit rationale`
36
+ };
37
+ }
38
+ };
39
+
40
+ export { MANIFEST_1_PROJECTIONS_DECLARE_AUDIT };
41
+ //# sourceMappingURL=manifest-1-projections-declare-audit.js.map
42
+ //# sourceMappingURL=manifest-1-projections-declare-audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/manifests/invariants/manifest-1-projections-declare-audit.ts"],"names":[],"mappings":";AAGA,SAAS,YAAY,MAAA,EAA2D;AAC9E,EAAA,IAAI,OAAA,GAAU,MAAA;AACd,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,QAAA,KAAa,YAAA,EAAc;AAC7C,IAAA,OAAA,GAAW,QAAQ,IAAA,CAAkC,MAAA;AAAA,EACvD;AAEA,EAAA,MAAM,MAAM,OAAA,CAAQ,IAAA;AACpB,EAAA,IAAI,OAAO,GAAA,CAAI,KAAA,KAAU,UAAA,EAAY;AACnC,IAAA,OAAO,IAAI,KAAA,EAAM;AAAA,EACnB;AACA,EAAA,IAAI,GAAA,CAAI,KAAA,IAAS,OAAO,GAAA,CAAI,UAAU,QAAA,EAAU;AAC9C,IAAA,OAAO,GAAA,CAAI,KAAA;AAAA,EACb;AACA,EAAA,OAAO,MAAA;AACT;AAEO,IAAM,oCAAA,GAAsD;AAAA,EACjE,SAAA,EAAW,uDAAA;AAAA,EACX,WAAA,EACE,kGAAA;AAAA,EACF,OAAA,EAAS,UAAA;AAAA,EACT,QAAA,EAAU,eAAA;AAAA,EACV,QAAA,EAAU,OAAO,GAAA,KAAQ;AACvB,IAAA,MAAM,aAAuB,EAAC;AAE9B,IAAA,KAAA,MAAW,CAAC,MAAM,UAAU,CAAA,IAAK,OAAO,OAAA,CAAQ,GAAA,CAAI,WAAW,CAAA,EAAG;AAChE,MAAA,IAAI,CAAC,iCAAA,CAAkC,IAAA,CAAK,IAAI,CAAA,EAAG;AACjD,QAAA;AAAA,MACF;AACA,MAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,UAAA,CAAW,WAAW,CAAA;AAChD,MAAA,IAAI,CAAC,KAAA,IAAS,EAAE,WAAA,IAAe,KAAA,CAAA,EAAQ;AACrC,QAAA,UAAA,CAAW,IAAA,CAAK,CAAA,YAAA,EAAe,IAAI,CAAA,2BAAA,CAA6B,CAAA;AAAA,MAClE;AAAA,IACF;AAEA,IAAA,OAAO,UAAA,CAAW,WAAW,CAAA,GACzB,EAAE,QAAQ,QAAA,EAAU,YAAA,EAAc,EAAC,EAAE,GACrC;AAAA,MACE,MAAA,EAAQ,QAAA;AAAA,MACR,YAAA,EAAc,UAAA;AAAA,MACd,MAAA,EAAQ,CAAA,EAAG,UAAA,CAAW,MAAM,CAAA,oCAAA;AAAA,KAC9B;AAAA,EACN;AACF","file":"manifest-1-projections-declare-audit.js","sourcesContent":["import type { z } from \"zod\";\nimport type { InvariantRule } from \"../invariant-manifest.js\";\n\nfunction objectShape(schema: z.ZodTypeAny): Record<string, unknown> | undefined {\n let current = schema;\n while (current._def.typeName === \"ZodEffects\") {\n current = (current._def as { schema: z.ZodTypeAny }).schema;\n }\n\n const def = current._def as { shape?: unknown };\n if (typeof def.shape === \"function\") {\n return def.shape() as Record<string, unknown>;\n }\n if (def.shape && typeof def.shape === \"object\") {\n return def.shape as Record<string, unknown>;\n }\n return undefined;\n}\n\nexport const MANIFEST_1_PROJECTIONS_DECLARE_AUDIT: InvariantRule = {\n invariant: \"MANIFEST-1: kernel projections declare epistemicAudit\",\n description:\n \"Kernel mutation projections must carry a rationale so audit evidence can explain the transition.\",\n checker: \"manifest\",\n severity: \"block_publish\",\n evaluate: async (ctx) => {\n const violations: string[] = [];\n\n for (const [name, projection] of Object.entries(ctx.projections)) {\n if (!/^(create|modulate|fork|update)_/.test(name)) {\n continue;\n }\n const shape = objectShape(projection.inputSchema);\n if (!shape || !(\"rationale\" in shape)) {\n violations.push(`projection '${name}' missing 'rationale' field`);\n }\n }\n\n return violations.length === 0\n ? { status: \"passed\", evidenceRefs: [] }\n : {\n status: \"failed\",\n evidenceRefs: violations,\n reason: `${violations.length} projections missing audit rationale`,\n };\n },\n};\n"]}