@neuroverseos/governance 0.3.0 → 0.3.1

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 (105) hide show
  1. package/README.md +20 -0
  2. package/package.json +16 -3
  3. package/policies/content-moderation-rules.txt +8 -0
  4. package/policies/marketing-rules.txt +8 -0
  5. package/policies/science-research-rules.txt +11 -0
  6. package/policies/social-media-rules.txt +7 -0
  7. package/policies/strict-rules.txt +8 -0
  8. package/policies/trading-rules.txt +8 -0
  9. package/simulate.html +1899 -0
  10. package/dist/adapters/autoresearch.cjs +0 -196
  11. package/dist/adapters/autoresearch.d.cts +0 -103
  12. package/dist/adapters/autoresearch.d.ts +0 -103
  13. package/dist/adapters/autoresearch.js +0 -7
  14. package/dist/adapters/express.cjs +0 -1114
  15. package/dist/adapters/express.d.cts +0 -66
  16. package/dist/adapters/express.d.ts +0 -66
  17. package/dist/adapters/express.js +0 -12
  18. package/dist/adapters/index.cjs +0 -1669
  19. package/dist/adapters/index.d.cts +0 -6
  20. package/dist/adapters/index.d.ts +0 -6
  21. package/dist/adapters/index.js +0 -46
  22. package/dist/adapters/langchain.cjs +0 -1155
  23. package/dist/adapters/langchain.d.cts +0 -89
  24. package/dist/adapters/langchain.d.ts +0 -89
  25. package/dist/adapters/langchain.js +0 -16
  26. package/dist/adapters/openai.cjs +0 -1185
  27. package/dist/adapters/openai.d.cts +0 -99
  28. package/dist/adapters/openai.d.ts +0 -99
  29. package/dist/adapters/openai.js +0 -16
  30. package/dist/adapters/openclaw.cjs +0 -1177
  31. package/dist/adapters/openclaw.d.cts +0 -99
  32. package/dist/adapters/openclaw.d.ts +0 -99
  33. package/dist/adapters/openclaw.js +0 -16
  34. package/dist/bootstrap-GXVDZNF7.js +0 -114
  35. package/dist/build-P42YFKQV.js +0 -339
  36. package/dist/chunk-2NICNKOM.js +0 -100
  37. package/dist/chunk-2PQU3VAN.js +0 -131
  38. package/dist/chunk-4A7LISES.js +0 -324
  39. package/dist/chunk-4JRYGIO7.js +0 -727
  40. package/dist/chunk-4NGDRRQH.js +0 -10
  41. package/dist/chunk-4QXB6PEO.js +0 -232
  42. package/dist/chunk-6CZSKEY5.js +0 -164
  43. package/dist/chunk-7P3S7MAY.js +0 -1090
  44. package/dist/chunk-A5W4GNQO.js +0 -130
  45. package/dist/chunk-AKW5YVCE.js +0 -96
  46. package/dist/chunk-BUWWN2NX.js +0 -192
  47. package/dist/chunk-COT5XS4V.js +0 -109
  48. package/dist/chunk-ER62HNGF.js +0 -139
  49. package/dist/chunk-FYS2CBUW.js +0 -304
  50. package/dist/chunk-GR6DGCZ2.js +0 -340
  51. package/dist/chunk-I3RRAYK2.js +0 -11
  52. package/dist/chunk-JZPQGIKR.js +0 -79
  53. package/dist/chunk-MWDQ4MJB.js +0 -11
  54. package/dist/chunk-NF5POFCI.js +0 -622
  55. package/dist/chunk-OGL7QXZS.js +0 -608
  56. package/dist/chunk-OT6PXH54.js +0 -61
  57. package/dist/chunk-PDOZHZWL.js +0 -225
  58. package/dist/chunk-Q6O7ZLO2.js +0 -62
  59. package/dist/chunk-QPASI2BR.js +0 -187
  60. package/dist/chunk-T5EUJQE5.js +0 -172
  61. package/dist/chunk-XPDMYECO.js +0 -642
  62. package/dist/chunk-YZFATT7X.js +0 -9
  63. package/dist/cli/neuroverse.cjs +0 -11448
  64. package/dist/cli/neuroverse.d.cts +0 -1
  65. package/dist/cli/neuroverse.d.ts +0 -1
  66. package/dist/cli/neuroverse.js +0 -196
  67. package/dist/cli/plan.cjs +0 -1599
  68. package/dist/cli/plan.d.cts +0 -20
  69. package/dist/cli/plan.d.ts +0 -20
  70. package/dist/cli/plan.js +0 -361
  71. package/dist/cli/run.cjs +0 -1746
  72. package/dist/cli/run.d.cts +0 -20
  73. package/dist/cli/run.d.ts +0 -20
  74. package/dist/cli/run.js +0 -143
  75. package/dist/configure-ai-TK67ZWZL.js +0 -132
  76. package/dist/derive-TLIV4OOU.js +0 -152
  77. package/dist/doctor-XPDLEYXN.js +0 -171
  78. package/dist/explain-IDCRWMPX.js +0 -70
  79. package/dist/guard-RV65TT4L.js +0 -96
  80. package/dist/guard-contract-WZx__PmU.d.cts +0 -709
  81. package/dist/guard-contract-WZx__PmU.d.ts +0 -709
  82. package/dist/guard-engine-JLTUARGU.js +0 -10
  83. package/dist/impact-XPECYRLH.js +0 -59
  84. package/dist/improve-GPUBKTEA.js +0 -85
  85. package/dist/index.cjs +0 -6273
  86. package/dist/index.d.cts +0 -1616
  87. package/dist/index.d.ts +0 -1616
  88. package/dist/index.js +0 -379
  89. package/dist/infer-world-7GVZWFX4.js +0 -543
  90. package/dist/init-PKPIYHYE.js +0 -144
  91. package/dist/init-world-VWMQZQC7.js +0 -223
  92. package/dist/mcp-server-FPVSU32Z.js +0 -13
  93. package/dist/model-adapter-BB7G4MFI.js +0 -11
  94. package/dist/playground-E664U4T6.js +0 -550
  95. package/dist/redteam-Z7WREJ44.js +0 -357
  96. package/dist/session-EKTRSR7C.js +0 -14
  97. package/dist/simulate-VDOYQFRO.js +0 -108
  98. package/dist/test-OGXJK4QU.js +0 -217
  99. package/dist/trace-JVF67VR3.js +0 -166
  100. package/dist/validate-LLBWVPGV.js +0 -81
  101. package/dist/validate-engine-UIABSIHD.js +0 -7
  102. package/dist/world-LAXO6DOX.js +0 -378
  103. package/dist/world-loader-HMPTOEA2.js +0 -9
  104. package/dist/worlds/autoresearch.nv-world.md +0 -230
  105. package/dist/worlds/derivation-world.nv-world.md +0 -278
@@ -1,304 +0,0 @@
1
- // src/engine/simulate-engine.ts
2
- function simulateWorld(world, options = {}) {
3
- const steps = Math.max(1, Math.min(options.steps ?? 1, 50));
4
- const profileName = options.profile ?? world.world.default_assumption_profile;
5
- const state = buildInitialState(world.stateSchema, options.stateOverrides);
6
- const assumptions = resolveAssumptions(world.assumptions, profileName);
7
- const initialState = { ...state };
8
- const simulationSteps = [];
9
- let collapsed = false;
10
- let collapseStep;
11
- let collapseRule;
12
- const sortedRules = [...world.rules].sort((a, b) => a.order - b.order);
13
- for (let stepNum = 1; stepNum <= steps; stepNum++) {
14
- if (collapsed) break;
15
- const stepResult = evaluateStep(
16
- stepNum,
17
- sortedRules,
18
- state,
19
- assumptions,
20
- world
21
- );
22
- simulationSteps.push(stepResult);
23
- if (stepResult.collapsed) {
24
- collapsed = true;
25
- collapseStep = stepNum;
26
- collapseRule = stepResult.rulesEvaluated.find((r) => r.collapsed)?.ruleId;
27
- }
28
- }
29
- const finalViability = classifyViability(state, world);
30
- return {
31
- worldId: world.world.world_id,
32
- worldName: world.world.name,
33
- profile: profileName,
34
- initialState,
35
- steps: simulationSteps,
36
- finalState: { ...state },
37
- finalViability,
38
- collapsed,
39
- collapseStep,
40
- collapseRule
41
- };
42
- }
43
- function evaluateStep(stepNum, rules, state, assumptions, world) {
44
- const evaluations = [];
45
- let rulesFired = 0;
46
- let collapsed = false;
47
- const firedRuleIds = /* @__PURE__ */ new Set();
48
- for (const rule of rules) {
49
- if (collapsed) {
50
- evaluations.push({
51
- ruleId: rule.id,
52
- label: rule.label,
53
- triggered: false,
54
- excluded: true,
55
- effects: [],
56
- collapsed: false
57
- });
58
- continue;
59
- }
60
- const excluded = rule.exclusive_with ? firedRuleIds.has(rule.exclusive_with) : false;
61
- if (excluded) {
62
- evaluations.push({
63
- ruleId: rule.id,
64
- label: rule.label,
65
- triggered: false,
66
- excluded: true,
67
- effects: [],
68
- collapsed: false
69
- });
70
- continue;
71
- }
72
- const triggered = evaluateTriggers(rule.triggers, state, assumptions);
73
- if (!triggered) {
74
- evaluations.push({
75
- ruleId: rule.id,
76
- label: rule.label,
77
- triggered: false,
78
- excluded: false,
79
- effects: [],
80
- collapsed: false
81
- });
82
- continue;
83
- }
84
- firedRuleIds.add(rule.id);
85
- rulesFired++;
86
- const appliedEffects = [];
87
- for (const effect of rule.effects ?? []) {
88
- const applied = applyEffect(effect, state);
89
- if (applied) appliedEffects.push(applied);
90
- }
91
- for (const ce of rule.effects_conditional ?? []) {
92
- const conditionMet = evaluateSingleTrigger(ce.condition, state, assumptions);
93
- const andMet = ce.and ? evaluateSingleTrigger(ce.and, state, assumptions) : true;
94
- const orMet = ce.or ? evaluateSingleTrigger(ce.or, state, assumptions) : false;
95
- const anyMet = ce.condition_any ? ce.condition_any.some((c) => evaluateSingleTrigger(c, state, assumptions)) : false;
96
- const shouldApply = conditionMet && andMet || ce.or && orMet || ce.condition_any && anyMet;
97
- if (shouldApply) {
98
- for (const effect of ce.effects) {
99
- const applied = applyEffect(effect, state);
100
- if (applied) appliedEffects.push(applied);
101
- }
102
- }
103
- }
104
- let ruleCollapsed = false;
105
- if (rule.collapse_check) {
106
- const fieldVal = typeof state[rule.collapse_check.field] === "number" ? state[rule.collapse_check.field] : 0;
107
- if (evaluateOperator(fieldVal, rule.collapse_check.operator, rule.collapse_check.value)) {
108
- ruleCollapsed = true;
109
- collapsed = true;
110
- }
111
- }
112
- if (!ruleCollapsed && rule.secondary_check) {
113
- const fieldVal = typeof state[rule.secondary_check.field] === "number" ? state[rule.secondary_check.field] : 0;
114
- if (evaluateOperator(fieldVal, rule.secondary_check.operator, rule.secondary_check.value)) {
115
- ruleCollapsed = true;
116
- collapsed = true;
117
- }
118
- }
119
- evaluations.push({
120
- ruleId: rule.id,
121
- label: rule.label,
122
- triggered: true,
123
- excluded: false,
124
- effects: appliedEffects,
125
- collapsed: ruleCollapsed,
126
- collapseField: ruleCollapsed ? rule.collapse_check?.field ?? rule.secondary_check?.field : void 0
127
- });
128
- }
129
- const viability = classifyViability(state, world);
130
- return {
131
- step: stepNum,
132
- rulesEvaluated: evaluations,
133
- rulesFired,
134
- stateAfter: { ...state },
135
- viability,
136
- collapsed
137
- };
138
- }
139
- function evaluateTriggers(triggers, state, assumptions) {
140
- if (!triggers || triggers.length === 0) return true;
141
- return triggers.every((t) => evaluateSingleTrigger(t, state, assumptions));
142
- }
143
- function evaluateSingleTrigger(trigger, state, assumptions) {
144
- const source = trigger.source === "assumption" ? assumptions : state;
145
- const fieldValue = source[trigger.field];
146
- if (fieldValue === void 0) return false;
147
- return evaluateOperator(fieldValue, trigger.operator, trigger.value);
148
- }
149
- function evaluateOperator(fieldValue, operator, conditionValue) {
150
- switch (operator) {
151
- case "==":
152
- return fieldValue === conditionValue;
153
- case "!=":
154
- return fieldValue !== conditionValue;
155
- case ">":
156
- return typeof fieldValue === "number" && typeof conditionValue === "number" && fieldValue > conditionValue;
157
- case "<":
158
- return typeof fieldValue === "number" && typeof conditionValue === "number" && fieldValue < conditionValue;
159
- case ">=":
160
- return typeof fieldValue === "number" && typeof conditionValue === "number" && fieldValue >= conditionValue;
161
- case "<=":
162
- return typeof fieldValue === "number" && typeof conditionValue === "number" && fieldValue <= conditionValue;
163
- case "in":
164
- return Array.isArray(conditionValue) && conditionValue.includes(String(fieldValue));
165
- default:
166
- return false;
167
- }
168
- }
169
- function applyEffect(effect, state) {
170
- const before = state[effect.target];
171
- let after;
172
- switch (effect.operation) {
173
- case "multiply":
174
- case "multiply_dynamic": {
175
- const current = typeof before === "number" ? before : 0;
176
- const factor = typeof effect.value === "number" ? effect.value : 1;
177
- after = current * factor;
178
- break;
179
- }
180
- case "add":
181
- case "add_dynamic": {
182
- const current = typeof before === "number" ? before : 0;
183
- const addend = typeof effect.value === "number" ? effect.value : 0;
184
- after = current + addend;
185
- break;
186
- }
187
- case "subtract":
188
- case "subtract_dynamic": {
189
- const current = typeof before === "number" ? before : 0;
190
- const subtrahend = typeof effect.value === "number" ? effect.value : 0;
191
- after = current - subtrahend;
192
- break;
193
- }
194
- case "set":
195
- case "set_dynamic":
196
- after = effect.value;
197
- break;
198
- case "set_boolean":
199
- after = !!effect.value;
200
- break;
201
- default:
202
- return null;
203
- }
204
- state[effect.target] = after;
205
- return {
206
- target: effect.target,
207
- operation: effect.operation,
208
- value: effect.value,
209
- before: before ?? 0,
210
- after
211
- };
212
- }
213
- function buildInitialState(schema, overrides) {
214
- const state = {};
215
- for (const [name, variable] of Object.entries(schema.variables ?? {})) {
216
- state[name] = variable.default;
217
- }
218
- if (overrides) {
219
- for (const [key, value] of Object.entries(overrides)) {
220
- state[key] = value;
221
- }
222
- }
223
- return state;
224
- }
225
- function resolveAssumptions(config, profileName) {
226
- const profile = config.profiles?.[profileName];
227
- return profile?.parameters ?? {};
228
- }
229
- function classifyViability(state, world) {
230
- const gates = world.gates?.viability_classification ?? [];
231
- for (const gate of gates) {
232
- const fieldValue = state[gate.field];
233
- if (typeof fieldValue !== "number") continue;
234
- if (evaluateOperator(fieldValue, gate.operator, gate.value)) {
235
- return gate.status;
236
- }
237
- }
238
- return "MODEL_COLLAPSES";
239
- }
240
- function renderSimulateText(result) {
241
- const lines = [];
242
- lines.push(`SIMULATION: ${result.worldName}`);
243
- lines.push(`Profile: ${result.profile}`);
244
- lines.push(`Steps: ${result.steps.length}`);
245
- lines.push("");
246
- lines.push("INITIAL STATE");
247
- for (const [key, value] of Object.entries(result.initialState)) {
248
- lines.push(` ${key}: ${value}`);
249
- }
250
- lines.push("");
251
- for (const step of result.steps) {
252
- lines.push(`STEP ${step.step}`);
253
- const fired = step.rulesEvaluated.filter((r) => r.triggered);
254
- const skipped = step.rulesEvaluated.filter((r) => !r.triggered && !r.excluded);
255
- const excluded = step.rulesEvaluated.filter((r) => r.excluded);
256
- if (fired.length === 0) {
257
- lines.push(" No rules fired (state unchanged)");
258
- } else {
259
- for (const rule of fired) {
260
- lines.push(` FIRED: ${rule.label}`);
261
- for (const effect of rule.effects) {
262
- const beforeStr = formatValue(effect.before);
263
- const afterStr = formatValue(effect.after);
264
- lines.push(` ${effect.target}: ${beforeStr} -> ${afterStr}`);
265
- }
266
- if (rule.collapsed) {
267
- lines.push(` COLLAPSE on ${rule.collapseField}`);
268
- }
269
- }
270
- }
271
- if (excluded.length > 0) {
272
- lines.push(` Excluded: ${excluded.map((r) => r.label).join(", ")}`);
273
- }
274
- lines.push(` Viability: ${step.viability}`);
275
- if (step.collapsed) {
276
- lines.push(" ** MODEL COLLAPSED **");
277
- }
278
- lines.push("");
279
- }
280
- lines.push("FINAL STATE");
281
- for (const [key, value] of Object.entries(result.finalState)) {
282
- const initial = result.initialState[key];
283
- const changed = initial !== value;
284
- const marker = changed ? " (changed)" : "";
285
- lines.push(` ${key}: ${formatValue(value)}${marker}`);
286
- }
287
- lines.push("");
288
- lines.push(`VIABILITY: ${result.finalViability}`);
289
- if (result.collapsed) {
290
- lines.push(`COLLAPSED at step ${result.collapseStep} (rule: ${result.collapseRule})`);
291
- }
292
- return lines.join("\n");
293
- }
294
- function formatValue(v) {
295
- if (typeof v === "number") {
296
- return Number.isInteger(v) ? String(v) : v.toFixed(2);
297
- }
298
- return String(v);
299
- }
300
-
301
- export {
302
- simulateWorld,
303
- renderSimulateText
304
- };
@@ -1,340 +0,0 @@
1
- import {
2
- simulateWorld
3
- } from "./chunk-FYS2CBUW.js";
4
- import {
5
- validateWorld
6
- } from "./chunk-7P3S7MAY.js";
7
-
8
- // src/engine/improve-engine.ts
9
- function improveWorld(world) {
10
- const suggestions = [];
11
- const report = validateWorld(world);
12
- addValidationSuggestions(report.findings, suggestions);
13
- analyzeRuleBalance(world, suggestions);
14
- analyzeStateCoverage(world, suggestions);
15
- analyzeGateCoverage(world, suggestions);
16
- analyzeAssumptions(world, suggestions);
17
- analyzeSimulationDynamics(world, suggestions);
18
- analyzeCompleteness(world, suggestions);
19
- const seen = /* @__PURE__ */ new Set();
20
- const unique = suggestions.filter((s) => {
21
- if (seen.has(s.id)) return false;
22
- seen.add(s.id);
23
- return true;
24
- });
25
- const priorityOrder = {
26
- critical: 0,
27
- high: 1,
28
- medium: 2,
29
- low: 3
30
- };
31
- unique.sort((a, b) => priorityOrder[a.priority] - priorityOrder[b.priority]);
32
- const score = computeHealthScore(world, unique);
33
- return {
34
- worldId: world.world.world_id,
35
- worldName: world.world.name,
36
- score,
37
- suggestions: unique,
38
- stats: {
39
- critical: unique.filter((s) => s.priority === "critical").length,
40
- high: unique.filter((s) => s.priority === "high").length,
41
- medium: unique.filter((s) => s.priority === "medium").length,
42
- low: unique.filter((s) => s.priority === "low").length
43
- }
44
- };
45
- }
46
- function addValidationSuggestions(findings, suggestions) {
47
- for (const f of findings) {
48
- if (f.severity === "info") continue;
49
- const priority = f.severity === "error" ? "critical" : "high";
50
- const category = f.severity === "error" ? "fix" : "structure";
51
- suggestions.push({
52
- id: `validate-${f.id}`,
53
- priority,
54
- category,
55
- title: f.message,
56
- description: f.message,
57
- action: f.suggestion ?? `Review ${f.affectedBlocks.join(", ")}`,
58
- affectedFiles: f.affectedBlocks
59
- });
60
- }
61
- }
62
- function analyzeRuleBalance(world, suggestions) {
63
- if (!world.rules || world.rules.length === 0) return;
64
- const structural = world.rules.filter((r) => r.severity === "structural");
65
- const degradation = world.rules.filter((r) => r.severity === "degradation");
66
- const advantage = world.rules.filter((r) => r.severity === "advantage");
67
- if (structural.length === 0) {
68
- suggestions.push({
69
- id: "no-structural-rules",
70
- priority: "high",
71
- category: "balance",
72
- title: "No structural rules",
73
- description: "All rules are degradation or advantage. Structural rules define the core mechanics that hold the world together.",
74
- action: "Add at least one structural-severity rule that enforces a fundamental world constraint.",
75
- affectedFiles: ["rules/"]
76
- });
77
- }
78
- if (advantage.length === 0 && world.rules.length >= 3) {
79
- suggestions.push({
80
- id: "no-advantage-rules",
81
- priority: "medium",
82
- category: "balance",
83
- title: "No advantage rules",
84
- description: "All rules are negative (structural or degradation). Adding advantage rules creates positive feedback loops.",
85
- action: 'Add a rule with severity "advantage" that rewards desirable state.',
86
- affectedFiles: ["rules/"]
87
- });
88
- }
89
- if (degradation.length === 0 && world.rules.length >= 3) {
90
- suggestions.push({
91
- id: "no-degradation-rules",
92
- priority: "medium",
93
- category: "balance",
94
- title: "No degradation rules",
95
- description: "No rules model gradual decline. Degradation rules create realistic tension.",
96
- action: 'Add a rule with severity "degradation" that models gradual state decline.',
97
- affectedFiles: ["rules/"]
98
- });
99
- }
100
- const missingTranslation = world.rules.filter(
101
- (r) => !r.causal_translation?.trigger_text && !r.causal_translation?.effect_text
102
- );
103
- if (missingTranslation.length > 0 && missingTranslation.length <= 5) {
104
- suggestions.push({
105
- id: "missing-causal-translations",
106
- priority: "low",
107
- category: "completeness",
108
- title: `${missingTranslation.length} rule(s) missing causal translations`,
109
- description: "Causal translations provide human-readable narratives for rules. They improve explain output.",
110
- action: `Add causal_translation to: ${missingTranslation.map((r) => r.id).join(", ")}`,
111
- affectedFiles: ["rules/"]
112
- });
113
- }
114
- }
115
- function analyzeStateCoverage(world, suggestions) {
116
- if (!world.stateSchema?.variables || !world.rules) return;
117
- const variables = Object.keys(world.stateSchema.variables);
118
- const ruleTargets = /* @__PURE__ */ new Set();
119
- const ruleTriggers = /* @__PURE__ */ new Set();
120
- for (const rule of world.rules) {
121
- for (const t of rule.triggers) {
122
- if (t.source === "state") ruleTriggers.add(t.field);
123
- }
124
- for (const e of rule.effects ?? []) {
125
- ruleTargets.add(e.target);
126
- }
127
- for (const ce of rule.effects_conditional ?? []) {
128
- for (const e of ce.effects) {
129
- ruleTargets.add(e.target);
130
- }
131
- }
132
- }
133
- const writeOnly = variables.filter((v) => ruleTargets.has(v) && !ruleTriggers.has(v));
134
- if (writeOnly.length > 0) {
135
- suggestions.push({
136
- id: "write-only-variables",
137
- priority: "medium",
138
- category: "structure",
139
- title: `${writeOnly.length} write-only variable(s)`,
140
- description: `These variables are modified by rules but never trigger any rule: ${writeOnly.join(", ")}. They may be dead-end state.`,
141
- action: "Add rules that trigger on these variables to create feedback loops.",
142
- affectedFiles: ["rules/", "state-schema.json"]
143
- });
144
- }
145
- const readOnly = variables.filter((v) => ruleTriggers.has(v) && !ruleTargets.has(v));
146
- if (readOnly.length > 0 && readOnly.length <= 3) {
147
- suggestions.push({
148
- id: "read-only-variables",
149
- priority: "low",
150
- category: "structure",
151
- title: `${readOnly.length} input-only variable(s)`,
152
- description: `These variables trigger rules but are never modified: ${readOnly.join(", ")}. They act as fixed inputs.`,
153
- action: "This is fine for configuration inputs. If they should evolve, add rules that target them.",
154
- affectedFiles: ["state-schema.json"]
155
- });
156
- }
157
- }
158
- function analyzeGateCoverage(world, suggestions) {
159
- const gates = world.gates?.viability_classification ?? [];
160
- if (gates.length === 0) return;
161
- const statuses = new Set(gates.map((g) => g.status));
162
- const standard = ["THRIVING", "STABLE", "COMPRESSED", "CRITICAL", "MODEL_COLLAPSES"];
163
- const missing = standard.filter((s) => !statuses.has(s));
164
- if (missing.length > 0 && missing.length <= 2) {
165
- suggestions.push({
166
- id: "incomplete-viability-gates",
167
- priority: "medium",
168
- category: "structure",
169
- title: `Missing viability level(s): ${missing.join(", ")}`,
170
- description: "A complete viability ladder gives finer-grained status classification.",
171
- action: `Add gates for: ${missing.join(", ")}`,
172
- affectedFiles: ["gates.json"]
173
- });
174
- }
175
- }
176
- function analyzeAssumptions(world, suggestions) {
177
- const profiles = Object.keys(world.assumptions?.profiles ?? {});
178
- if (profiles.length === 1) {
179
- suggestions.push({
180
- id: "single-assumption-profile",
181
- priority: "medium",
182
- category: "completeness",
183
- title: "Only one assumption profile",
184
- description: "A single profile means no scenario comparison. Add an alternative profile to enable what-if analysis.",
185
- action: "Add a second profile with different parameter values to assumptions.json.",
186
- affectedFiles: ["assumptions.json"]
187
- });
188
- }
189
- }
190
- function analyzeSimulationDynamics(world, suggestions) {
191
- if (!world.rules || world.rules.length === 0) return;
192
- if (!world.stateSchema?.variables || Object.keys(world.stateSchema.variables).length === 0) return;
193
- try {
194
- const result = simulateWorld(world, { steps: 1 });
195
- const step = result.steps[0];
196
- if (step && step.rulesFired === 0) {
197
- suggestions.push({
198
- id: "no-rules-fire-default",
199
- priority: "high",
200
- category: "balance",
201
- title: "No rules fire with default state",
202
- description: "With all variables at their defaults, zero rules trigger. The world is inert until state changes.",
203
- action: "Adjust rule thresholds or state defaults so at least some rules fire in the baseline scenario.",
204
- affectedFiles: ["rules/", "state-schema.json"]
205
- });
206
- }
207
- if (result.collapsed && result.collapseStep === 1) {
208
- suggestions.push({
209
- id: "immediate-collapse",
210
- priority: "critical",
211
- category: "balance",
212
- title: "World collapses on first step",
213
- description: `Rule "${result.collapseRule}" triggers collapse immediately with default state. The world cannot sustain itself.`,
214
- action: "Adjust collapse thresholds or state defaults to prevent immediate collapse.",
215
- affectedFiles: ["rules/", "state-schema.json"]
216
- });
217
- }
218
- if (!result.collapsed) {
219
- const multiStep = simulateWorld(world, { steps: 5 });
220
- if (multiStep.collapsed) {
221
- suggestions.push({
222
- id: "eventual-collapse",
223
- priority: "high",
224
- category: "balance",
225
- title: `World collapses by step ${multiStep.collapseStep}`,
226
- description: `Starting from defaults, the world collapses after ${multiStep.collapseStep} steps. Consider adding stabilizing advantage rules.`,
227
- action: "Add advantage rules or adjust degradation rates to allow sustainable states.",
228
- affectedFiles: ["rules/"]
229
- });
230
- }
231
- }
232
- } catch {
233
- }
234
- }
235
- function analyzeCompleteness(world, suggestions) {
236
- if (!world.guards) {
237
- suggestions.push({
238
- id: "add-guards",
239
- priority: "low",
240
- category: "completeness",
241
- title: "No guards defined",
242
- description: "Guards enable runtime enforcement in Action Space. Without them, the world has no runtime protection.",
243
- action: "Add guards.json with structural guards backing each invariant.",
244
- affectedFiles: ["guards.json"]
245
- });
246
- }
247
- if (!world.roles) {
248
- suggestions.push({
249
- id: "add-roles",
250
- priority: "low",
251
- category: "completeness",
252
- title: "No roles defined",
253
- description: "Roles enable multi-agent governance with different permission levels.",
254
- action: "Add roles.json with at least an observer and steward role.",
255
- affectedFiles: ["roles.json"]
256
- });
257
- }
258
- if (!world.kernel) {
259
- suggestions.push({
260
- id: "add-kernel",
261
- priority: "low",
262
- category: "completeness",
263
- title: "No kernel configuration",
264
- description: "A kernel config provides Thinking Space governance with forbidden patterns and response vocabulary.",
265
- action: "Add kernel.json with input/output boundaries.",
266
- affectedFiles: ["kernel.json"]
267
- });
268
- }
269
- const outcomes = world.outcomes?.computed_outcomes ?? [];
270
- if (outcomes.length > 0 && !outcomes.some((o) => o.primary)) {
271
- suggestions.push({
272
- id: "no-primary-outcome",
273
- priority: "medium",
274
- category: "structure",
275
- title: "No primary outcome defined",
276
- description: "Marking one outcome as primary helps tools identify the main metric to display.",
277
- action: "Set primary: true on the most important computed outcome.",
278
- affectedFiles: ["outcomes.json"]
279
- });
280
- }
281
- }
282
- function computeHealthScore(world, suggestions) {
283
- let score = 100;
284
- for (const s of suggestions) {
285
- switch (s.priority) {
286
- case "critical":
287
- score -= 15;
288
- break;
289
- case "high":
290
- score -= 5;
291
- break;
292
- case "medium":
293
- score -= 2;
294
- break;
295
- case "low":
296
- score -= 1;
297
- break;
298
- }
299
- }
300
- return Math.max(0, Math.min(100, score));
301
- }
302
- function renderImproveText(report) {
303
- const lines = [];
304
- lines.push(`IMPROVE: ${report.worldName}`);
305
- lines.push(`Health Score: ${report.score}/100`);
306
- lines.push("");
307
- if (report.suggestions.length === 0) {
308
- lines.push("No suggestions \u2014 this world is in great shape.");
309
- return lines.join("\n");
310
- }
311
- const groups = [
312
- ["CRITICAL (must fix)", "critical", "x"],
313
- ["HIGH PRIORITY", "high", "!"],
314
- ["SUGGESTIONS", "medium", "-"],
315
- ["NICE TO HAVE", "low", "."]
316
- ];
317
- for (const [header, priority, icon] of groups) {
318
- const items = report.suggestions.filter((s) => s.priority === priority);
319
- if (items.length === 0) continue;
320
- lines.push(header);
321
- for (const s of items) {
322
- lines.push(` ${icon} ${s.title}`);
323
- lines.push(` Action: ${s.action}`);
324
- }
325
- lines.push("");
326
- }
327
- const { stats } = report;
328
- const parts = [];
329
- if (stats.critical > 0) parts.push(`${stats.critical} critical`);
330
- if (stats.high > 0) parts.push(`${stats.high} high`);
331
- if (stats.medium > 0) parts.push(`${stats.medium} medium`);
332
- if (stats.low > 0) parts.push(`${stats.low} low`);
333
- lines.push(`Total: ${report.suggestions.length} suggestions (${parts.join(", ")})`);
334
- return lines.join("\n");
335
- }
336
-
337
- export {
338
- improveWorld,
339
- renderImproveText
340
- };
@@ -1,11 +0,0 @@
1
- // src/contracts/validate-contract.ts
2
- var VALIDATE_EXIT_CODES = {
3
- PASS: 0,
4
- FAIL: 1,
5
- WARN: 2,
6
- ERROR: 3
7
- };
8
-
9
- export {
10
- VALIDATE_EXIT_CODES
11
- };