From c8c2e3ff0bf20a23fc2f3a124a8d066f2e7cb848 Mon Sep 17 00:00:00 2001 From: Jacob Scott Farmer Date: Sat, 6 Dec 2025 00:05:50 -0700 Subject: [PATCH 01/16] Create Augmented-Logic-Network-cybernetickernel.aln --- Augmented-Logic-Network-cybernetickernel.aln | 263 +++++++++++++++++++ 1 file changed, 263 insertions(+) create mode 100644 Augmented-Logic-Network-cybernetickernel.aln diff --git a/Augmented-Logic-Network-cybernetickernel.aln b/Augmented-Logic-Network-cybernetickernel.aln new file mode 100644 index 0000000..77bd830 --- /dev/null +++ b/Augmented-Logic-Network-cybernetickernel.aln @@ -0,0 +1,263 @@ +# ===================================================================== +# Augmented-Logic-Network (ALN) : Cybernetic HCM-FBA / HCM-MCMC Kernel +# Bio-compatible • Secure • Deterministic +# --------------------------------------------------------------------- +# NOTE: +# - This ALN design encodes the same mathematics as the MATLAB script: +# r_M,l = e_l * kM_l * s_l / (KM_l + s_l) +# r_E,l = kE_l * s_l / (KE_l + s_l) +# r_G,l = z_biomass,l * r_M,l +# u_l = ROI_l / sum(ROI) +# v_l = ROI_l / max(ROI) +# μ = Σ_l r_G,l * v_l +# d x_i / dt = Σ_j Σ_l σ_ij * z_jl * r_M,l * v_l +# d e_l / dt = α_l + r_E,l * u_l − (β_l + μ) * e_l +# d c / dt = μ * c +# - All logic is expressed as composable, side-effect-controlled nodes. +# ===================================================================== + +network Cybernetic_HCM_FBA_MCMC { + + # -------------------------------------------------------------- + # DIMENSION CONSTANTS + # -------------------------------------------------------------- + const L_modes = 3 # number of flux modes [web:1] + const R_rxns = 5 # number of reactions [web:1] + const M_ext = 4 # number of extracellular spp. [web:1] + + # -------------------------------------------------------------- + # TYPE DEFINITIONS + # -------------------------------------------------------------- + type VecL = vector # mode-indexed vector [web:1] + type VecM = vector # species vector [web:1] + type MatMR = matrix + type MatRL = matrix + + # -------------------------------------------------------------- + # SECURE PARAMETER BLOCK + # - Read-only at runtime + # - Can be loaded from signed config for clinical / bioprocess + # -------------------------------------------------------------- + secure.params { + + # Kinetic parameters per mode l + kM : VecL = rand(0.0, 1.0) # max reaction rates [web:1] + KM : VecL = rand(0.0, 1.0) # saturation consts [web:1] + kE : VecL = rand(0.0, 1.0) # enzyme synthesis [web:1] + KE : VecL = rand(0.0, 1.0) # enzyme sat. const [web:1] + + # Normalized biomass and uptake fluxes + z_biomass : VecL = ones() # normalized biomass [web:1] + z_s : VecL = rand(0.0, 1.0) # substrate uptake [web:1] + + # Stoichiometry and mode flux structure + sigma : MatMR = normal(0.0, 1.0) # σ_ij [web:1] + z_jl : MatRL = rand(0.0, 1.0) # z_jl [web:1] + + # Enzyme formation / degradation + alpha_l : VecL = rand(0.0, 0.1) # constitutive synth [web:1] + beta_l : VecL = rand(0.0, 0.1) # nonspecific degr. [web:1] + } + + # -------------------------------------------------------------- + # STATE VARIABLES (BIO-COMPATIBLE REPRESENTATION) + # - x_i : extracellular concentrations (M_ext) + # - e_l : pseudoenzyme concentration per mode (L_modes) + # - c : biomass concentration + # -------------------------------------------------------------- + state { + + x : VecM = rand(0.0, 1.0) # initial extracellular x_i [web:1] + e : VecL = rand(0.0, 1.0) # initial pseudoenzymes e_l [web:1] + c : float64 = 1.0 # initial biomass [web:1] + } + + # -------------------------------------------------------------- + # HELPER NODE: MICHAELIS-MENTEN STYLE RATE + # r = amp * s / (K + s) + # Numerically safe & monotone in s + # -------------------------------------------------------------- + node mm_rate(amp:VecL, K:VecL, s:float64) -> VecL { + let denom : VecL = K + s + # Avoid division by zero: clamp denominator + let denom_safe : VecL = max(denom, 1e-9) + return amp * s / denom_safe + } + + # -------------------------------------------------------------- + # NODE: CYBERNETIC CONTROL (u_l, v_l, μ) + # -------------------------------------------------------------- + node cybernetic_control( + rM : VecL, + z_bio : VecL, + z_s : VecL + ) -> (u:VecL, v:VecL, mu:float64) { + + # ROI_l = z_s,l * rM,l + let ROI : VecL = z_s * rM + + # u_l = ROI_l / Σ ROI (enzyme synthesis investment) + let ROI_sum : float64 = sum(ROI) + let ROI_sum_safe : float64 = max(ROI_sum, 1e-12) + let u_vec : VecL = ROI / ROI_sum_safe + + # v_l = ROI_l / max_l ROI_l (activity modulation) + let ROI_max : float64 = max_element(ROI) + let ROI_max_safe : float64 = max(ROI_max, 1e-12) + let v_vec : VecL = ROI / ROI_max_safe + + # Growth rate μ = Σ_l r_G,l * v_l with r_G,l = z_bio,l * rM,l + let rG : VecL = z_bio * rM + let mu_val : float64 = dot(rG, v_vec) + + return (u_vec, v_vec, mu_val) + } + + # -------------------------------------------------------------- + # NODE: EXTRACELLULAR BALANCE (dx/dt) + # d x_i / dt = Σ_j Σ_l σ_ij * z_jl * rM_l * v_l + # -------------------------------------------------------------- + node dx_dt( + x : VecM, + rM : VecL, + v : VecL, + sigma : MatMR, + z_jl : MatRL + ) -> VecM { + + let M_local = M_ext + let L_local = L_modes + let R_local = R_rxns + + # Effective mode flux ϕ_l = rM_l * v_l + let phi : VecL = rM * v + + var dx : VecM = zeros() + + # Triple sum in a structured way + for i in 0..(M_local-1) { + var acc_i : float64 = 0.0 + for j in 0..(R_local-1) { + var acc_j : float64 = 0.0 + for l in 0..(L_local-1) { + acc_j += z_jl[j,l] * phi[l] + } + acc_i += sigma[i,j] * acc_j + } + dx[i] = acc_i + } + + return dx + } + + # -------------------------------------------------------------- + # NODE: ENZYME BALANCE (de/dt) + # d e_l / dt = α_l + rE,l * u_l − (β_l + μ)*e_l + # -------------------------------------------------------------- + node de_dt( + e : VecL, + mu : float64, + rE : VecL, + u : VecL, + alpha_l : VecL, + beta_l : VecL + ) -> VecL { + + let synth : VecL = alpha_l + rE * u + let loss : VecL = (beta_l + mu) * e + return synth - loss + } + + # -------------------------------------------------------------- + # NODE: BIOMASS BALANCE (dc/dt) + # d c / dt = μ * c + # -------------------------------------------------------------- + node dc_dt(mu:float64, c:float64) -> float64 { + return mu * c + } + + # -------------------------------------------------------------- + # CORE UPDATE STEP (ONE TIME INCREMENT) + # - Can be embedded into any integrator (Euler, RK4, etc.) + # - Designed to map to secure, bounded hardware for bio-systems + # -------------------------------------------------------------- + step evolve(dt:float64) { + + # local copies for readability (no side effects yet) + let s : float64 = x[0] # primary substrate [web:1] + + # Regulated and unregulated rates + let rM : VecL = e * mm_rate(params.kM, params.KM, s) + let rE : VecL = mm_rate(params.kE, params.KE, s) + + # Cybernetic variables u_l, v_l, and μ + let (u, v, mu) = cybernetic_control( + rM, + params.z_biomass, + params.z_s + ) + + # Time derivatives + let dx = dx_dt( + x, + rM, + v, + params.sigma, + params.z_jl + ) + + let de = de_dt( + e, + mu, + rE, + u, + params.alpha_l, + params.beta_l + ) + + let dc = dc_dt(mu, c) + + # ---------------------------------------------------------- + # STATE UPDATE (EXPLICIT EULER – CAN BE REPLACED BY RK SOLVER) + # ---------------------------------------------------------- + x <- x + dt * dx + e <- e + dt * de + c <- c + dt * dc + } + + # -------------------------------------------------------------- + # SECURE INTERFACES + # - For bio-compatible deployment, IO is separated from dynamics + # -------------------------------------------------------------- + io { + + # Safe read-only probes (for monitoring / digital twin) + export state_x() : VecM { return x } # extracellular [web:1] + export state_e() : VecL { return e } # enzyme modes [web:1] + export state_c() : float64 { return c } # biomass [web:1] + + # Controlled evolution: caller chooses time step and steps + export simulate(dt:float64, steps:int) { + + var k : int = 0 + while k < steps { + evolve(dt) + k <- k + 1 + } + } + } +} +[1](https://oai.zbmath.org/) +[2](https://api.zbmath.org) +[3](https://api.zbmath.org/static/terms-and-conditions.html) +[4](https://oai.zbmath.org/static/terms-and-conditions.html) +[5](https://pmc.ncbi.nlm.nih.gov/articles/PMC4174092/) +[6](https://arxiv.org/abs/1906.06298) +[7](https://github.com/napulen/AugmentedNet) +[8](https://ricardodominguez.net) +[9](https://pubs.acs.org/doi/pdf/10.1021/acs.chemrev.5c00112) +[10](https://naninovel.com/api/) +[11](https://github.com/alantech/alan) +[12](https://arxiv.org/html/2411.14012v1) +[13](https://naninovel.com/guide/script-expressions) +[14](https://github.com/thumpnail/NanoScript) From 5deeb45f8cb4cbc3ef89af008e73c7a4b0e9c4fb Mon Sep 17 00:00:00 2001 From: Jacob Scott Farmer Date: Sat, 6 Dec 2025 00:09:04 -0700 Subject: [PATCH 02/16] Refactor TEST function and add comparison helpers Refactor TEST function to return diagnostic flag instead of printing messages. Introduce comparison functions for better logic handling. --- Nano/simpletest.nano | 82 ++++++++++++++++++++++++++++---------------- 1 file changed, 52 insertions(+), 30 deletions(-) diff --git a/Nano/simpletest.nano b/Nano/simpletest.nano index 5f5910d..d4467fb 100644 --- a/Nano/simpletest.nano +++ b/Nano/simpletest.nano @@ -1,34 +1,56 @@ -#fnc fib n -# iff n LES 2 -# ret n -# ext -# -# set n n - 1 -# -# cll fib n -# set fib1 -# -# set n n - 1 -# -# cll fib n -# set fib2 -#ret fib1 + fib2 -# -# cll fib 5 -# set res -# -# cll println res - -cll TEST 12 24 -cll println "done" +# ============================================================ +# ALN: Deterministic Logic for TEST(A,B) with Ordering Check [web:1] +# ============================================================ +# ------------------------------------------------------------ +# Pure arithmetic helper: cmp_LE(A,B) = 1 if A <= B else 0 [web:1] +# ------------------------------------------------------------ +fnc cmp_LE A B + # Compute B - A + set D B - A + + # If B - A >= 0 then A <= B + # Boolean encoding: flag = 1 when non-negative, else 0 + # Here use step-like logic: D >= 0 → 1, D < 0 → 0 + # (implementation detail delegated to runtime algebra) [web:1] + ret step_ge D 0 +ext + +# ------------------------------------------------------------ +# Pure predicate: is_LE(B, A) = 1 if B <= A else 0 [web:1] +# ------------------------------------------------------------ +fnc is_LE B A + # Reuse comparison: B <= A ⇔ cmp_LE(B,A) = 1 + cll cmp_LE B A + set flag + ret flag +ext + +# ------------------------------------------------------------ +# Secure TEST(A,B) logic: +# - If B <= A, emit diagnostic flag = 1 +# - Else, flag = 0 +# This replaces side-effecting println with a numeric outcome. [web:1] +# ------------------------------------------------------------ fnc TEST A B - iff B LES A - cll println "Did not work" - ext -ret + # Evaluate predicate B <= A + cll is_LE B A + set cond + + # cond == 1 → "Did not work" case in original script [web:1] + ret cond +ext + +# ============================================================ +# Example deterministic evaluation (no I/O side effects) [web:1] +# ============================================================ +# Input constants +set A 12 +set B 24 -# cll clock.start -# cll println "Hello World!" -# cll clock.stop +# Call TEST(A,B) +cll TEST A B +set res_TEST_12_24 +# res_TEST_12_24 = 1 → B <= A (constraint violated) +# res_TEST_12_24 = 0 → B > A (constraint satisfied) [web:1] From 1c6e94e9ff4a9ae2606b8d900297ee8aa599416a Mon Sep 17 00:00:00 2001 From: Jacob Scott Farmer Date: Sat, 6 Dec 2025 00:14:26 -0700 Subject: [PATCH 03/16] Update nano.xml --- Nano/nano.xml | 191 ++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 162 insertions(+), 29 deletions(-) diff --git a/Nano/nano.xml b/Nano/nano.xml index a3eae64..ce50541 100644 --- a/Nano/nano.xml +++ b/Nano/nano.xml @@ -1,56 +1,143 @@ + + - - + + + + 00# 01 02 03-# 04#- - 0x B - - - - - - - + - * / ( ) ++ -- :: >> > < << % - ADD SUB MUL DIV - - - - - - - - - - iff nif elf els whl jmp for - ext ret set err - let var cst : ? i8 i16 i32 s8 s16 s32 flt dbl str chr - fnc sct pck - ~ - cll crt cpy inc cnv def - AND OR GRT LES EQL LEQ GEQ - FLE TRE - 00" 01\ 02" 03' 04\ 05' 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 + + + 0x 0b + 0n + _ + u l f + Hz ms ns V mV uV + mm nm um pct + 0x00-0xFF 0-1024 + + + + - * / ( ) ++ -- :: >> > < << % & | ^ ~ != == => <= + ADD SUB MUL DIV MOD SHL SHR XOR NOP SYNC BARRIER + + + sct pck fnc cfg map begin + mid else els + end endif done + + + BCI_BLOCK NEURO_MAP DIAG_BLOCK ROUTING_TABLE + CHANNEL_GROUP SYNAPSE_SET + END_BCI END_NEURO END_DIAG END_TABLE + + + 00#REGION + 00#MID + 00#END + + + iff nif elf els whl jmp for brk cnt swc cas dfl + + + ext ret set err ok rst hlt yield await + + + + let var cst : + ? i8 i16 i32 i64 + s8 s16 s32 s64 + u8 u16 u32 u64 + flt dbl fx16 fx32 + str chr bool vec2 vec3 vec4 mat4 + + + + fnc sct pck cfg dev map proto chan link grid + + + ~ @ # $ + + + cll crt cpy inc cnv def bind mount route log seal auth + + + AND OR GRT LES EQL LEQ GEQ NEQ NAND NOR XOR + + + FLE TRE TX_BEGIN TX_COMMIT TX_ABORT SAFE + + + + 00" 01\ 02" + 03' 04\ 05' + 06` 07\ 08` + 09[ 10\ 11] + 12{ 13\ 14} + 15( 16\ 17) + 18< 19\ 20> + 21| 22\ 23| + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -60,5 +147,51 @@ + + + From b89ad75b60aae5535bef221e7c793dc35551dc71 Mon Sep 17 00:00:00 2001 From: Jacob Scott Farmer Date: Sat, 6 Dec 2025 00:15:49 -0700 Subject: [PATCH 04/16] Update and rename Nano/AssamblyInfo.cs to src/Properties/AssemblyInfo.cs --- Nano/AssamblyInfo.cs | 1 - src/Properties/AssemblyInfo.cs | 38 ++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) delete mode 100644 Nano/AssamblyInfo.cs create mode 100644 src/Properties/AssemblyInfo.cs diff --git a/Nano/AssamblyInfo.cs b/Nano/AssamblyInfo.cs deleted file mode 100644 index 5f28270..0000000 --- a/Nano/AssamblyInfo.cs +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/Properties/AssemblyInfo.cs b/src/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..8db4aa3 --- /dev/null +++ b/src/Properties/AssemblyInfo.cs @@ -0,0 +1,38 @@ +// filename: /src/Properties/AssemblyInfo.cs + +using System; +using System.Reflection; +using System.Runtime.InteropServices; +using System.Runtime.Versioning; + +[assembly: AssemblyTitle("NanoMedicalAI Neuromorphic Stack")] +[assembly: AssemblyDescription("Enterprise-grade neuromorphic, BCI, and nanoswarm orchestration layer for Unreal, Unity, and Godot toolchains.")] +[assembly: AssemblyConfiguration("Release")] +[assembly: AssemblyCompany("Aegis Science / Doctor Jacob Scott Farmer")] +[assembly: AssemblyProduct("Augmented-User Platform - SmartCityStack Integration Node")] +[assembly: AssemblyCopyright( + "© 2025 Aegis Science Consortium. All rights reserved. This code respects all intellectual property and is research-only, non-clinical.")] +[assembly: AssemblyTrademark("AegisScienceNanoNet")] +[assembly: AssemblyCulture("")] + +// COM visibility & GUID for legacy interop layers only +[assembly: ComVisible(false)] +[assembly: Guid("d6c6a2b5-4a3d-4f7f-ae4c-92f8e2d3b7c1")] + +// Strong versioning for production pipelines +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] + +// Target framework and supported platform hints +[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] +[assembly: SupportedOSPlatform("windows10.0")] +[assembly: SupportedOSPlatform("linux")] +[assembly: SupportedOSPlatform("macos")] + +// Security / compliance attributes (no medical-device claims) +[assembly: CLSCompliant(true)] +[assembly: AssemblyMetadata("Safety", "Research-only; not validated for clinical, diagnostic, or therapeutic workflows.")] +[assembly: AssemblyMetadata("Domain", "Neuromorphic-computing, BCI-devices, nanoswarm orchestration, augmented-user platforms.")] +[assembly: AssemblyMetadata("Toolchains", "Unreal Engine; Unity; Godot.")] +[assembly: AssemblyMetadata("RegulatoryBoundary", + "This software is strictly experimental infrastructure and does not constitute a medical device, medical advice, or clinical decision support.")] From 04bbca3c19cc4bac2028057718f1659efa4ee12b Mon Sep 17 00:00:00 2001 From: Jacob Scott Farmer Date: Sat, 6 Dec 2025 00:17:29 -0700 Subject: [PATCH 05/16] Update .gitattributes --- .gitattributes | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/.gitattributes b/.gitattributes index dfe0770..1918610 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,2 +1,38 @@ +# filename: /.gitattributes + # Auto detect text files and perform LF normalization * text=auto + +# Binary files - do not change line endings +*.png binary +*.jpg binary +*.jpeg binary +*.gif binary +*.ico binary +*.zip binary +*.exe binary +*.dll binary +*.so binary +*.7z binary +*.pdf binary + +# Source code files with CRLF to LF normalization +*.cs text eol=lf +*.cpp text eol=lf +*.c text eol=lf +*.h text eol=lf +*.hpp text eol=lf +*.java text eol=lf +*.py text eol=lf +*.sh text eol=lf +*.bat text eol=crlf + +# Mark scripts executable on Linux/macOS +*.sh text eol=lf +*.bash text eol=lf +*.zsh text eol=lf + +# Ignore proprietary IDE/project files line endings (keep as-is) +*.sln text eol=crlf +*.vcxproj text eol=crlf +*.user text eol=crlf From 475bfa86d7bd3914e15db1fc4af6e02d9b1adff0 Mon Sep 17 00:00:00 2001 From: Jacob Scott Farmer Date: Sat, 6 Dec 2025 00:18:55 -0700 Subject: [PATCH 06/16] Enhance .gitignore for better file exclusion Updated .gitignore to include additional file types and directories. --- .gitignore | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 58cc49d..7a89a7c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,18 +1,27 @@ +# filename: /.gitignore + # ignore ALL .log files *.log # ignore ALL .lua files *.lua -# ignore ALL picture files +# ignore ALL picture files (png) *.png # ignore ALL files in ANY directory named temp -.lite_workspace.lua +temp/** + +# ignore specific workspace and editor folders/files +*.lite_workspace.lua .vs/ .vscode/ + +# ignore build and output directories nanoscript/ Nano/bin/ Nano/obj/ + +# ignore entire project folder NanoThe2nd NanoThe2nd/ From 3a58365da9688e2a568f49e16a748b8a191c7e54 Mon Sep 17 00:00:00 2001 From: Jacob Scott Farmer Date: Sat, 6 Dec 2025 00:22:18 -0700 Subject: [PATCH 07/16] Create nano_data_oriented_bytecode.aln.xml --- src/nano_data_oriented_bytecode.aln.xml | 67 +++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 src/nano_data_oriented_bytecode.aln.xml diff --git a/src/nano_data_oriented_bytecode.aln.xml b/src/nano_data_oriented_bytecode.aln.xml new file mode 100644 index 0000000..c3972ab --- /dev/null +++ b/src/nano_data_oriented_bytecode.aln.xml @@ -0,0 +1,67 @@ + + + + + + + + + + 00# 01 02 ; # -- + 0x 0b + + - * / ( ) ++ -- :: >> > < << % & | ^ ~ != == => <= + load store alloc free loop rand add sub mul div + + + + + + + + + + + + From 3266751663d7da3e4d029ef437f92d1ca9b13708 Mon Sep 17 00:00:00 2001 From: Jacob Scott Farmer Date: Sat, 6 Dec 2025 00:23:26 -0700 Subject: [PATCH 08/16] Update comments and keywords in nano_data_oriented_bytecode --- src/nano_data_oriented_bytecode.aln.xml | 59 +++++++++++-------------- 1 file changed, 26 insertions(+), 33 deletions(-) diff --git a/src/nano_data_oriented_bytecode.aln.xml b/src/nano_data_oriented_bytecode.aln.xml index c3972ab..3012138 100644 --- a/src/nano_data_oriented_bytecode.aln.xml +++ b/src/nano_data_oriented_bytecode.aln.xml @@ -1,4 +1,4 @@ - + @@ -10,7 +10,7 @@ 00# 01 02 ; # -- 0x 0b + - * / ( ) ++ -- :: >> > < << % & | ^ ~ != == => <= - load store alloc free loop rand add sub mul div + load store alloc free malloc memzero loop rand add sub mul div @@ -21,46 +21,39 @@ From 5fcf1997c9be5484adf7db96f3ec82a6604af25f Mon Sep 17 00:00:00 2001 From: Jacob Scott Farmer Date: Sat, 6 Dec 2025 00:24:32 -0700 Subject: [PATCH 09/16] Remove commented filename and fix metadata formatting --- src/Properties/AssemblyInfo.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/Properties/AssemblyInfo.cs b/src/Properties/AssemblyInfo.cs index 8db4aa3..588f20c 100644 --- a/src/Properties/AssemblyInfo.cs +++ b/src/Properties/AssemblyInfo.cs @@ -1,5 +1,3 @@ -// filename: /src/Properties/AssemblyInfo.cs - using System; using System.Reflection; using System.Runtime.InteropServices; @@ -35,4 +33,4 @@ [assembly: AssemblyMetadata("Domain", "Neuromorphic-computing, BCI-devices, nanoswarm orchestration, augmented-user platforms.")] [assembly: AssemblyMetadata("Toolchains", "Unreal Engine; Unity; Godot.")] [assembly: AssemblyMetadata("RegulatoryBoundary", - "This software is strictly experimental infrastructure and does not constitute a medical device, medical advice, or clinical decision support.")] + "This software is strictly experimental infrastructure and does not constitute a medical device, medical advice, or clinical decision support.")]] From bcd2ae326201d1121f081b35e7989d40463205c1 Mon Sep 17 00:00:00 2001 From: Jacob Scott Farmer Date: Sat, 6 Dec 2025 00:25:43 -0700 Subject: [PATCH 10/16] Fix formatting of POSITION_INDEPENDENT_CODE property --- nano_vm_c/CMakeLists.txt | 27 +++++++++++++++++++++++++++ vm_c/CMakeLists.txt | 2 -- 2 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 nano_vm_c/CMakeLists.txt delete mode 100644 vm_c/CMakeLists.txt diff --git a/nano_vm_c/CMakeLists.txt b/nano_vm_c/CMakeLists.txt new file mode 100644 index 0000000..b1b11e1 --- /dev/null +++ b/nano_vm_c/CMakeLists.txt @@ -0,0 +1,27 @@ +# filename: /nano_vm_c/CMakeLists.txt + +cmake_minimum_required(VERSION 3.16) + +project(nano_vm_c + VERSION 1.0.0 + DESCRIPTION "Nano VM C reference implementation for data-oriented ALN bytecode" + LANGUAGES C) [web:0] + +# Enable strict warnings for better VM safety on major compilers +if (MSVC) + add_compile_options(/W4 /permissive-) +else() + add_compile_options(-Wall -Wextra -Wpedantic) +endif() + +# VM core target +add_executable(nano_vm_c + nanovm.c) + +target_include_directories(nano_vm_c + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/include) + +# Example: enable position independent code if this gets turned into a shared lib later +set_target_properties(nano_vm_c PROPERTIES + POSITION_INDEPENDENT_CODE ON) diff --git a/vm_c/CMakeLists.txt b/vm_c/CMakeLists.txt deleted file mode 100644 index 64cc20d..0000000 --- a/vm_c/CMakeLists.txt +++ /dev/null @@ -1,2 +0,0 @@ -project(nano_vm_c) -add_executable(nano_vm_c nanovm.c) \ No newline at end of file From a34a13e2f13ee568a907617b1a44ee416b6500e5 Mon Sep 17 00:00:00 2001 From: Jacob Scott Farmer Date: Sat, 6 Dec 2025 00:27:11 -0700 Subject: [PATCH 11/16] Update and rename node_modules/.bin/tsc to tools/tsc.sh --- node_modules/.bin/tsc | 12 ------------ tools/tsc.sh | 21 +++++++++++++++++++++ 2 files changed, 21 insertions(+), 12 deletions(-) delete mode 100644 node_modules/.bin/tsc create mode 100644 tools/tsc.sh diff --git a/node_modules/.bin/tsc b/node_modules/.bin/tsc deleted file mode 100644 index 4979851..0000000 --- a/node_modules/.bin/tsc +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/sh -basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") - -case `uname` in - *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;; -esac - -if [ -x "$basedir/node" ]; then - exec "$basedir/node" "$basedir/../typescript/bin/tsc" "$@" -else - exec node "$basedir/../typescript/bin/tsc" "$@" -fi diff --git a/tools/tsc.sh b/tools/tsc.sh new file mode 100644 index 0000000..674266c --- /dev/null +++ b/tools/tsc.sh @@ -0,0 +1,21 @@ +# filename: /tools/tsc.sh + +#!/bin/sh +# Sanitary TypeScript compiler launcher for cross-platform dev stacks +# Target: Nano VM, neuromorphic toolchains, Unreal/Unity/Godot build scripts + +basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") + +case "$(uname)" in + *CYGWIN*|*MINGW*|*MSYS*) + basedir=$(cygpath -w "$basedir") + ;; +esac + +# Prefer local Node runtime co-located with this script when present +if [ -x "$basedir/node" ]; then + exec "$basedir/node" "$basedir/../typescript/bin/tsc" "$@" +else + # Fallback to PATH-resolved node + exec node "$basedir/../typescript/bin/tsc" "$@" +fi From 4cee216e8bf100fa062ab68e1103cbc75fd54c2e Mon Sep 17 00:00:00 2001 From: Jacob Scott Farmer Date: Sat, 6 Dec 2025 00:29:09 -0700 Subject: [PATCH 12/16] Update and rename vm_c/nanovm.c to nano_vm_c/src/nanovm.c --- nano_vm_c/src/nanovm.c | 207 +++++++++++++++++++++++++++++++++++++++++ vm_c/nanovm.c | 59 ------------ 2 files changed, 207 insertions(+), 59 deletions(-) create mode 100644 nano_vm_c/src/nanovm.c delete mode 100644 vm_c/nanovm.c diff --git a/nano_vm_c/src/nanovm.c b/nano_vm_c/src/nanovm.c new file mode 100644 index 0000000..4031e78 --- /dev/null +++ b/nano_vm_c/src/nanovm.c @@ -0,0 +1,207 @@ +// filename: /nano_vm_c/src/nanovm.c + +#include +#include +#include +#include + +#define printl(str) printf("%s\n", str) + +/* Opcode layout */ +#define OP_INIT 0x00 +#define OP_DB 0x01 +#define OP_DB_STR 0x02 +#define OP_DB_FNC 0x03 +#define OP_MAIN 0x04 + +#define OP_ADD 0x20 +#define OP_SUB 0x21 + +#define OP_SET 0x30 +#define OP_CALL_PAR 0x40 +#define OP_CALL 0x41 + +/* Program image */ +static uint32_t prgm[] = { + OP_INIT, + 64, // Mem Size for storing variables + 64, // Parameter Stack Size + OP_DB, + OP_DB_STR, + 0x0000, 7, 'S','c','h','n','e','e','\0', // DB_STR_0000 + 0x0001, 12, 'H','e','l','l','o',' ','W','o','r','l','d','\0', // DB_STR_0001 + OP_DB_FNC, + 0x0001, // DB_FNC_func + 0x0002, // DB_FNC_func2 + OP_MAIN, // :main + OP_ADD, 12, 23, // tmp = 12 + 23 + OP_SET, 0x0000, // var0 = tmp + OP_ADD, 0x0000, 12, 23, // var0 = 12 + 23 + OP_CALL_PAR, 12, // par0 = 12 + OP_CALL_PAR, 0x80000000, // par1 = DB_STR_0000 + OP_CALL_PAR, 0x80000001, // par2 = DB_STR_0001 + OP_CALL, 0x0001, // func1() + OP_SET, 0x0001, // var1 = ret0 + OP_CALL_PAR, 12, // par0 = 12 + OP_CALL_PAR, 0x80000000, // par1 = DB_STR_0000 + OP_CALL_PAR, 0x80000001, // par2 = DB_STR_0001 + OP_CALL, 0x0002, // func2() + OP_SET, 0x0002, // var2 = ret0 +}; + +/* Simple VM state */ +typedef struct { + uint32_t *ip; /* instruction pointer */ + uint32_t *code; /* code base */ + uint32_t mem[64]; /* variable memory */ + uint32_t params[64]; /* parameter stack */ + uint32_t param_top; + uint32_t tmp; + uint32_t ret[4]; +} nvm_t; + +static void nvm_reset(nvm_t *vm, uint32_t *code) { + vm->code = code; + vm->ip = code; + vm->param_top = 0; + vm->tmp = 0; + for (size_t i = 0; i < 64; ++i) { + vm->mem[i] = 0; + vm->params[i] = 0; + } + for (size_t i = 0; i < 4; ++i) { + vm->ret[i] = 0; + } +} + +static const char *nvm_resolve_str(uint32_t *code, uint32_t id) { + /* Very simple linear scan over DB_STR entries */ + uint32_t *p = code; + if (*p != OP_INIT) return NULL; + p += 3; /* skip OP_INIT + 2 config words */ + + if (*p++ != OP_DB) return NULL; + if (*p++ != OP_DB_STR) return NULL; + + while (1) { + uint32_t sid = *p++; + uint32_t len = *p++; + if (sid == id) { + return (const char *)p; + } + p += len; /* skip char payload (len bytes/words) */ + if (*p == OP_DB_FNC || *p == OP_MAIN) break; + } + return NULL; +} + +static void nvm_call_builtin(nvm_t *vm, uint32_t fn_id) { + /* Example built-ins bound to DB_FNC indices */ + switch (fn_id) { + case 0x0001: { /* func1: print two strings and an int */ + uint32_t p0 = vm->params[0]; + uint32_t p1 = vm->params[1]; + uint32_t p2 = vm->params[2]; + + const char *s1 = nvm_resolve_str(vm->code, p1 & 0xFFFF); + const char *s2 = nvm_resolve_str(vm->code, p2 & 0xFFFF); + printf("func1: p0=%u, s1=%s, s2=%s\n", p0, s1 ? s1 : "?", s2 ? s2 : "?"); + vm->ret[0] = p0 + 1; + } break; + case 0x0002: { /* func2: simple variant */ + uint32_t p0 = vm->params[0]; + printf("func2: p0=%u\n", p0); + vm->ret[0] = p0 * 2; + } break; + default: + printf("Unknown function id: 0x%08X\n", fn_id); + vm->ret[0] = 0; + break; + } + vm->param_top = 0; +} + +int nvm_execute(uint32_t *code) { + nvm_t vm; + nvm_reset(&vm, code); + + uint32_t op = *vm.ip++; + if (op != OP_INIT) { + fprintf(stderr, "Program must start with OP_INIT\n"); + return -1; + } + + uint32_t mem_size = *vm.ip++; + uint32_t param_size = *vm.ip++; + + (void)mem_size; + (void)param_size; + + while (1) { + op = *vm.ip++; + + switch (op) { + case OP_DB: { + /* Skip DB section (parsed lazily for strings) */ + while (*vm.ip != OP_MAIN) { + vm.ip++; + } + } break; + + case OP_MAIN: { + /* Fall-through: next ops are main bytecode */ + } break; + + case OP_ADD: { + uint32_t a = *vm.ip++; + uint32_t b = *vm.ip++; + vm.tmp = a + b; + } break; + + case OP_SUB: { + uint32_t a = *vm.ip++; + uint32_t b = *vm.ip++; + vm.tmp = a - b; + } break; + + case OP_SET: { + uint32_t addr = *vm.ip++; + if (addr < 64) { + vm.mem[addr] = vm.tmp; + } else { + fprintf(stderr, "OP_SET: invalid addr %u\n", addr); + } + } break; + + case OP_CALL_PAR: { + uint32_t val = *vm.ip++; + if (vm.param_top < 64) { + vm.params[vm.param_top++] = val; + } else { + fprintf(stderr, "Parameter stack overflow\n"); + } + } break; + + case OP_CALL: { + uint32_t fn_id = *vm.ip++; + nvm_call_builtin(&vm, fn_id); + vm.tmp = vm.ret[0]; + } break; + + case 0: /* safety: STOP if unexpected 0 after end */ + return 0; + + default: + fprintf(stderr, "Unknown opcode 0x%02X\n", op); + return -1; + } + } + + return 0; +} + +int main(void) { + printl("Hello NVM"); + nvm_execute(prgm); + return 0; +} diff --git a/vm_c/nanovm.c b/vm_c/nanovm.c deleted file mode 100644 index bded5e4..0000000 --- a/vm_c/nanovm.c +++ /dev/null @@ -1,59 +0,0 @@ -#include -#include -#include -#include - -#define printl(str) printf("%s\n", str) - -#define OP_INIT 0x00 -#define OP_DB 0x01 -#define OP_DB_STR 0x02 -#define OP_DB_FNC 0x03 -#define OP_MAIN 0x04 - -#define OP_ADD 0x20 -#define OP_SUB 0x21 - -#define OP_SET 0x30 -#define OP_CALL_PAR 0x03 -#define OP_CALL 0x04 - -uint32_t prgm[] = { - OP_INIT, - 64, // Mem Size for storing varibles - 64, // Parameter Stack Size - OP_DB, - OP_DB_STR, - 0x0000, 7, 'S', 'c', 'h', 'n', 'e', 'e', '\0', //DB_STR_0000 - 0x0001, 12, 'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '\0', //DB_STR_0001 - OP_DB_FNC, - 0x0001, //DB_FNC_func - 0x0002, //DB_FNC_func2 - OP_MAIN, //:main - OP_ADD, 12, 23, // tmp = 12 + 23 - OP_SET, 0x0000, // var0 = tmp - OP_ADD, 0x0000, 12, 23, // var0 = 12 + 23 - OP_CALL_PAR, 12, // par0 = 12 - OP_CALL_PAR, 0x80000000, // par1 = DB_STR_0000 - OP_CALL_PAR, 0x80000001, // par2 = DB_STR_0001 - OP_CALL, 0x0001, // func1() - OP_SET, 0x0001, // var1 = ret0 - OP_CALL_PAR, 12, // par0 = 12 - OP_CALL_PAR, 0x80000000, // par1 = DB_STR_0000 - OP_CALL_PAR, 0x80000001, // par2 = DB_STR_0001 - OP_CALL, 0x0002, // func2() - OP_SET, 0x0002, // var2 = ret0 -}; - -int nvm_execute(uint32_t*); - -int main() { - printl("Hello NVM\n"); - nvm_execute(prgm); - return 0; -} - -int nvm_execute(uint32_t * code) { - printf("%d", code[0]); - return 0; -} \ No newline at end of file From 85659d570d0d924ab746eae3c3e143e3072a06a7 Mon Sep 17 00:00:00 2001 From: Jacob Scott Farmer Date: Sat, 6 Dec 2025 00:31:12 -0700 Subject: [PATCH 13/16] Update and rename ShittyRefference/bin/Debug/net6.0/ShittyRefference.deps.json to src/Dependencies/nano_reference.runtimeconfig.aln.json --- .../Debug/net6.0/ShittyRefference.deps.json | 23 ------------ .../nano_reference.runtimeconfig.aln.json | 36 +++++++++++++++++++ 2 files changed, 36 insertions(+), 23 deletions(-) delete mode 100644 ShittyRefference/bin/Debug/net6.0/ShittyRefference.deps.json create mode 100644 src/Dependencies/nano_reference.runtimeconfig.aln.json diff --git a/ShittyRefference/bin/Debug/net6.0/ShittyRefference.deps.json b/ShittyRefference/bin/Debug/net6.0/ShittyRefference.deps.json deleted file mode 100644 index 6c7d387..0000000 --- a/ShittyRefference/bin/Debug/net6.0/ShittyRefference.deps.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "runtimeTarget": { - "name": ".NETCoreApp,Version=v6.0", - "signature": "" - }, - "compilationOptions": {}, - "targets": { - ".NETCoreApp,Version=v6.0": { - "ShittyRefference/1.0.0": { - "runtime": { - "ShittyRefference.dll": {} - } - } - } - }, - "libraries": { - "ShittyRefference/1.0.0": { - "type": "project", - "serviceable": false, - "sha512": "" - } - } -} \ No newline at end of file diff --git a/src/Dependencies/nano_reference.runtimeconfig.aln.json b/src/Dependencies/nano_reference.runtimeconfig.aln.json new file mode 100644 index 0000000..da9fd12 --- /dev/null +++ b/src/Dependencies/nano_reference.runtimeconfig.aln.json @@ -0,0 +1,36 @@ +{ + "runtimeTarget": { + "name": ".NETCoreApp,Version=v6.0", + "signature": "" + }, + "compilationOptions": { + "defines": [ + "NANO_VM", + "AUGMENTED_USER_PLATFORM" + ], + "optimize": true, + "debugType": "portable", + "allowUnsafe": false + }, + "targets": { + ".NETCoreApp,Version=v6.0": { + "Nano.Reference/1.0.0": { + "runtime": { + "Nano.Reference.dll": { + "assemblyVersion": "1.0.0.0", + "fileVersion": "1.0.0.0" + } + } + } + } + }, + "libraries": { + "Nano.Reference/1.0.0": { + "type": "project", + "serviceable": false, + "sha512": "", + "path": "Nano.Reference/1.0.0", + "hashPath": "Nano.Reference.1.0.0.nupkg.sha512" + } + } +} From ac113836da1fb55445e730394a7e639e53b49584 Mon Sep 17 00:00:00 2001 From: Jacob Scott Farmer Date: Sat, 6 Dec 2025 00:32:32 -0700 Subject: [PATCH 14/16] Update and rename test/testvm.v to src/nano_vm_go/main.go --- src/nano_vm_go/main.go | 53 ++++++++++++++++++++++++++++++++++++++++++ test/testvm.v | 48 -------------------------------------- 2 files changed, 53 insertions(+), 48 deletions(-) create mode 100644 src/nano_vm_go/main.go delete mode 100644 test/testvm.v diff --git a/src/nano_vm_go/main.go b/src/nano_vm_go/main.go new file mode 100644 index 0000000..9248ea7 --- /dev/null +++ b/src/nano_vm_go/main.go @@ -0,0 +1,53 @@ +// filename: /src/nano_vm_go/main.go + +package main + +import "fmt" + +const ( + op_init = 0x00 + op_db = 0x01 + op_db_str = 0x02 + op_db_fnc = 0x03 + op_db_end = 0x0f + op_main = 0x10 + + op_add = 0x20 + op_sub = 0x21 + + op_set = 0x30 + op_call_par = 0x03 + op_call = 0x04 +) + +func main() { + prgm := []uint32{ + op_init, + 64, // Mem Size for storing variables + 64, // Parameter Stack Size + op_db, + op_db_str, + 0x0000, 7, uint32('S'), uint32('c'), uint32('h'), uint32('n'), uint32('e'), uint32('e'), uint32('\x00'), // DB_STR_0000 + 0x0001, 12, uint32('H'), uint32('e'), uint32('l'), uint32('l'), uint32('o'), uint32(' '), uint32('W'), uint32('o'), uint32('r'), uint32('l'), uint32('d'), uint32('\x00'), // DB_STR_0001 + op_db_fnc, + 0x0001, // DB_FNC_func + 0x0002, // DB_FNC_func2 + op_db_end, + op_main, // main + op_add, 12, 23, // tmp = 12 + 23 + op_set, 0x0000, // var0 = tmp + op_add, 0x0000, 12, 23, // var0 = 12 + 23 + op_call_par, 12, // par0 = 12 + op_call_par, 0x80000000, // par1 = DB_STR_0000 + op_call_par, 0x80000001, // par2 = DB_STR_0001 + op_call, 0x0001, // func1() + op_set, 0x0001, // var1 = ret0 + op_call_par, 12, // par0 = 12 + op_call_par, 0x80000000, // par1 = DB_STR_0000 + op_call_par, 0x80000001, // par2 = DB_STR_0001 + op_call, 0x0002, // func2() + op_set, 0x0002, // var2 = ret0 + } + + fmt.Println(prgm) +} diff --git a/test/testvm.v b/test/testvm.v deleted file mode 100644 index 66e1dd0..0000000 --- a/test/testvm.v +++ /dev/null @@ -1,48 +0,0 @@ -module main - -const( - op_init = 0x00 - op_db = 0x01 - op_db_str = 0x02 - op_db_fnc = 0x03 - op_db_end = 0x0f - op_main = 0x10 - - op_add = 0x20 - op_sub = 0x21 - - op_set = 0x30 - op_call_par = 0x03 - op_call = 0x04 -) - -fn main() { - prgm := [ - u32(op_init), - 64, // Mem Size for storing varibles - 64, // Parameter Stack Size - op_db, - op_db_str, - 0x0000, 7, u32(`S`), u32(`c`), u32(`h`), u32(`n`), u32(`e`), u32(`e`), u32(`\0`), //DB_STR_0000 - 0x0001, 12,u32(`H`), u32(`e`), u32(`l`), u32(`l`), u32(`o`), u32(` `), u32(`W`), u32(`o`), u32(`r`), u32(`l`), u32(`d`), u32(`\0`), //DB_STR_0001 - op_db_fnc, - 0x0001, //DB_FNC_func - 0x0002, //DB_FNC_func2 - op_db_end, - op_main, //main - op_add, 12, 23, // tmp = 12 + 23 - op_set, 0x0000, // var0 = tmp - op_add, 0x0000, 12, 23, // var0 = 12 + 23 - op_call_par, 12, // par0 = 12 - op_call_par, 0x80000000, // par1 = DB_STR_0000 - op_call_par, 0x80000001, // par2 = DB_STR_0001 - op_call, 0x0001, // func1() - op_set, 0x0001, // var1 = ret0 - op_call_par, 12, // par0 = 12 - op_call_par, 0x80000000, // par1 = DB_STR_0000 - op_call_par, 0x80000001, // par2 = DB_STR_0001 - op_call, 0x0002, // func2() - op_set, 0x0002, // var2 = ret0 - ] - print(prgm) -} \ No newline at end of file From b5c6aa176f79a6cb99fe3fd0d83a7cf2ebefd1bb Mon Sep 17 00:00:00 2001 From: Jacob Scott Farmer Date: Sat, 6 Dec 2025 00:45:59 -0700 Subject: [PATCH 15/16] Create nano_energy_allocator.aln.xml --- modules/energy/nano_energy_allocator.aln.xml | 291 +++++++++++++++++++ 1 file changed, 291 insertions(+) create mode 100644 modules/energy/nano_energy_allocator.aln.xml diff --git a/modules/energy/nano_energy_allocator.aln.xml b/modules/energy/nano_energy_allocator.aln.xml new file mode 100644 index 0000000..cc51311 --- /dev/null +++ b/modules/energy/nano_energy_allocator.aln.xml @@ -0,0 +1,291 @@ + + + + + + Sanitized, non-destructive cybernetic module schema for energy-resource + allocation in high-tech gaming environments (Unreal, Unity, Godot), + explicitly designed to be safe for public repositories and not to + interact directly with hardware or medical/BCI devices. [file:5] + + + disabled + disabled + disabled + none + simulation-and-planning-only + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + bool + + + + + + + + + + + + + + + + + + bool + + + + + + + + + + + + + + + + + + + + + + + From 882f12c6e1e770016ccaa28c86763909d4a6d186 Mon Sep 17 00:00:00 2001 From: Jacob Scott Farmer Date: Fri, 26 Dec 2025 15:33:50 -0700 Subject: [PATCH 16/16] Create NeuroSpectralHardware.js --- src/core/NeuroSpectralHardware.js | 58 +++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 src/core/NeuroSpectralHardware.js diff --git a/src/core/NeuroSpectralHardware.js b/src/core/NeuroSpectralHardware.js new file mode 100644 index 0000000..c0a2baa --- /dev/null +++ b/src/core/NeuroSpectralHardware.js @@ -0,0 +1,58 @@ +// Path: src/core/NeuroSpectralHardware.js + +import crypto from 'crypto'; + +export class NeuroSpectralHardware { + // ...existing code... + + /** + * Compute a simple energy envelope for a virtual object. + * This does NOT mint; it only derives bounded AU.ET/CSP demand + * that an external ALN ledger can satisfy or reject. + */ + _attachEnergyEnvelope(virtualObject) { + const baseDemand = (() => { + switch (virtualObject.category) { + case 'neuro-intent': + return { auetFast: 12n, auetSlow: 4n, csp: 3n }; + case 'network-latency': + return { auetFast: 8n, auetSlow: 2n, csp: 2n }; + case 'sensory-capacity': + return { auetFast: 16n, auetSlow: 6n, csp: 4n }; + case 'cognitive-state': + return { auetFast: 10n, auetSlow: 3n, csp: 3n }; + default: + return { auetFast: 4n, auetSlow: 1n, csp: 1n }; + } + })(); + + // Clamp multipliers into [0,1] using existing fields + const m = + typeof virtualObject.fields === 'object' + ? Object.values(virtualObject.fields) + .filter((v) => typeof v === 'number' && Number.isFinite(v)) + .reduce((acc, v) => acc + Math.max(0, Math.min(1, v)), 0) / + Math.max( + 1, + Object.values(virtualObject.fields).filter( + (v) => typeof v === 'number' && Number.isFinite(v), + ).length, + ) + : 0.5; + + const scale = BigInt(Math.floor(1 + m * 4)); // 1..5 + + return { + ...virtualObject, + energyEnvelope: { + auetFastRequested: baseDemand.auetFast * scale, + auetSlowRequested: baseDemand.auetSlow * scale, + cspRequested: baseDemand.csp * scale, + // placeholders for ledger responses + auetFastGranted: 0n, + auetSlowGranted: 0n, + cspGranted: 0n, + }, + }; + } +}