"Auto-commit via make git"
Some checks failed
Build NFDOS ISO / build (push) Has been cancelled

This commit is contained in:
neo.webmaster.2@gmail.com 2026-01-03 16:28:44 +01:00
parent 607750f4da
commit d40302f2dd
28 changed files with 826 additions and 171 deletions

View File

@ -44,58 +44,9 @@ GRUB_GFXPAYLOAD_LINUX=keep
└──────────────────────────────────────────────────────────────────────────────────────────────┘
```
```
ok a forma geral funcionou. temos um dashboard fixo com o pane status a funcionar:
```
MODE: PERSISTENT TRM: ACTIVE
CogState: STABLE Depth: 1 Valence: -2.40 Energy: 7.300
temos neurotron no qemu em modo VGA 😍: print em anexo (modo diagnostico)
agora sim a aventura ganhou forma 😍.
temos o que fazer que, quando entra em modo persistente: : print em anexo (modo persistente)
com a mensagem do kernel "desconfigura" o "design" do dashboard, alem de nem ter linhas que chegue para o dashboard completo (falta o painel do chat).
mas por hoje checkpoint garantido 😍
────────────────────────────────────────────────────────────────────────────────
KERNEL MESSAGES (placeholder)
────────────────────────────────────────────────────────────────────────────────
MEMORY MESSAGES (placeholder)
────────────────────────────────────────────────────────────────────────────────
TRM MESSAGES (placeholder)
────────────────────────────────────────────────────────────────────────────────
CHAT MESSAGES (placeholder)[00:48:18] [debug] telemetry state=stable temp=3.7 cpu=16.7% mem=10.6% load=0.14 jitter=0.744s.60 is too large:
[00:48:18] [debug] [trm.explorer] cpu tendência ↑ (+16.7) → energia -0.5ad=0.07 jitter=0.756s3.40 is too large:
[00:48:18] [debug] [trm.thought] Δcpu elevado (+16.7) — reduzir complexidadeepth=1 valence=-2.400. Quota mode: disabled.f
[00:48:18] [debug] [trm.thought] mem estável — tendência favorável.6% load=0.14 jitter=0.764s2.60. Quota mode: disabled.f
[00:48:18] [debug] [trm.thought] sistema frio — margem para explorargy=19.6 depth=1 valence=-2.60mask: ffffffffffffffff
[00:48:18] [debug] [trm.engine] step ok: mode=active cog=stable energy=7.3 depth=1 valence=-2.400mask: ffffffffffffffff
[00:48:18] [heart] cpu=0.0% mem=10.6% tick=0.50stive cog=stable energy=9.3 depth=1 valence=-2.400refined-jiffies' interval of 480030000 ns (480 ms)
[00:47:55] [heart] cpu=0.0% mem=10.6% tick=0.50stive cog=stable energy=40.6 depth=1 valence=-3.60refined-jiffies' interval of 480030000 ns (480 ms)
[00:47:44] [debug] [trm.engine] step ok: mode=active cog=stable energy=43.4 depth=1 valence=-3.60
clocksource: 'tsc' is current clocksource.
tsc: Marking TSC unstable due to clocksource watchdog
tsc: Marking TSC unstable due to clocksource watchdog
TSC found unstable after boot, most likely due to broken BIOS. Use 'tsc=unstable'.
TSC found unstable after boot, most likely due to broken BIOS. Use 'tsc=unstable'.
sched_clock: Marking unstable (3566043715, 47405219)<-(3626634341, -13185437)
sched_clock: Marking unstable (3566043715, 47405219)<-(3626634341, -13185437)
clocksource: Not enough CPUs to check clocksource 'tsc'.
clocksource: Not enough CPUs to check clocksource 'tsc'.
clocksource: Switched to clocksource refined-jiffies
clocksource: Switched to clocksource refined-jiffies
```
agora temos de ajustar onde as mensagens aparecem nos outros panes, ou como falaste e bem ... definir a API mínima de cada pane

View File

@ -47,7 +47,7 @@ $(ISO_FILE):
cp $(INITRAMFS) $(DIST_DIR)/iso/boot/
@echo "[ISO] Gerando grub.cfg..."
@printf "set timeout=3\nset default=0\n\nmenuentry 'NFDOS Linux' {\n\tlinux /boot/bzImage console=ttyS0 root=/dev/ram0 loglevel=8\n\tinitrd /boot/initramfs.cpio.gz\n}\n" > $(ISO_DIR)/grub.cfg
@printf "set timeout=3\nset default=0\n\nmenuentry 'NFDOS Linux' {\n\tlinux /boot/bzImage console=tty0 console=ttyS0 root=/dev/ram0 loglevel=8\n\tinitrd /boot/initramfs.cpio.gz\n}\n" > $(ISO_DIR)/grub.cfg
@echo "[ISO] Gerando imagem ISO..."
grub-mkrescue -o $(ISO_FILE) $(DIST_DIR)/iso --compress=xz -V NFDOS
@ -58,7 +58,7 @@ $(ISO_FILE):
# ===========================
qemu: $(ISO_FILE)
@echo "[QEMU] Iniciando NFDOS ISO..."
qemu-system-x86_64 -cdrom $(ISO_FILE) -m 1024 -nographic -serial mon:stdio -no-reboot
qemu-system-x86_64 -cdrom $(ISO_FILE) -m 1024 -serial mon:stdio -no-reboot
# ===========================
# Empacotamento do código-fonte

View File

@ -4,18 +4,28 @@ PYTHON="/usr/bin/python3"
NEUROTRON_HOME="/opt/kernel/neurotron"
SRC="$NEUROTRON_HOME/src"
# Garante diretórios básicos
# --- Filesystems base ---
mkdir -p /proc /sys /dev
# Montar proc, sysfs e devtmpfs (idempotente, falha silenciosa se já montado)
mount -t proc proc /proc 2>/dev/null || true
mount -t sysfs sys /sys 2>/dev/null || true
mount -t devtmpfs devtmpfs /dev 2>/dev/null || true
# Ambiente Python minimalista
# --- Ambiente ---
export HOME=/
export TERM=linux
export PYTHONHOME="/usr"
export PYTHONPATH="$SRC:/usr/lib/python3.13:/usr/lib/python3.13/site-packages"
export PATH="/sbin:/bin:/usr/sbin:/usr/bin:$PATH"
export PATH="/sbin:/bin:/usr/sbin:/usr/bin"
# Arrancar o cérebro principal como módulo do package
exec "$PYTHON" -m neurotron "$@"
# --- Garante VT ---
mkdir -p /dev/pts
mount -t devpts devpts /dev/pts 2>/dev/null || true
# --- Mudar para tty1 (VGA) ---
chvt 1
# --- Criar sessão e ligar ao VGA ---
exec setsid sh -c '
exec </dev/tty1 >/dev/tty1 2>&1
exec '"$PYTHON"' -m neurotron
'

View File

@ -73,6 +73,7 @@ def main():
Path(log_dir).mkdir(parents=True, exist_ok=True)
ctx = Cortex(runtime_dir=runtime_dir, log_dir=log_dir)
logbus.subscribe(ctx._on_log_event)
# threads
t_dash = threading.Thread(target=dashboard_loop, args=(ctx,), daemon=True)

View File

@ -72,6 +72,16 @@ class Cortex:
self.telemetry_path = Path(NEUROTRON_DATASET_PATH) / "telemetry.json"
self.telemetry_path.parent.mkdir(parents=True, exist_ok=True)
# ---- Dashboard ----
self.memory = Hippocampus(
log_dir=self.log_dir,
on_remember=self._on_memory_event,
)
self.ui_bus = defaultdict(lambda: deque(maxlen=200))
self.ui_publish("kernel", "[Placeholder (No futuro /dev/kmsg, dmesg reader ou ring buffer próprio)] ACPI: Core revision 20240415")
self.ui_publish("kernel", "[Placeholder (No futuro /dev/kmsg, dmesg reader ou ring buffer próprio)] EXT4-fs mounted filesystem")
def _init_paths(self):
"""
Inicializa todos os paths canónicos do runtime Neurotron.
@ -192,6 +202,16 @@ class Cortex:
return float(x)
except:
return fallback
def ui_publish(self, pane: str, msg: str):
self.ui_bus[pane].append(msg)
def ui_tail(self, pane: str, n: int):
q = self.ui_bus.get(pane)
if not q:
return []
return list(q)[-n:]
# ----------------------------------------
# heartbeat — apenas visual, não cognitivo
@ -286,4 +306,45 @@ class Cortex:
except Exception:
pass
return snap
return snap
def _on_memory_event(self, kind: str, data: dict):
"""
Observador de eventos lembrados (UI / TRM / futuro).
"""
summary = self._summarize_memory(kind, data)
if summary:
self.ui_publish("memory", summary)
def _summarize_memory(self, kind: str, data: dict) -> str:
"""
Converte eventos ricos em linhas humanas (dashboard).
"""
try:
if kind == "boot":
return f"[boot] mode={data.get('mode')} tick={data.get('tick')}"
if kind.startswith("telemetry.event"):
return f"[tele] {kind.split('.')[-1]}"
if kind == "trm.snapshot":
st = data.get("state", {})
return (
f"[trm] cog={st.get('cog_state')} "
f"val={st.get('valence', 0):+.2f} "
f"depth={st.get('depth')}"
)
return f"[{kind}] {str(data)[:60]}"
except Exception:
return None
def _on_log_event(self, ev):
# sempre disponível para UI
self.ui_publish("log", ev)
# opcional: persistência
if ev.level in ("error", "warn"):
self.memory.remember("log", {
"level": ev.level,
"msg": ev.msg
})

View File

@ -2,4 +2,13 @@ import sys
class ChatPane:
def render(self, ctx, x, y, w, h):
sys.stdout.write(f"\033[{y};{x}HCHAT MESSAGES (placeholder)")
# título
sys.stdout.write(f"\033[{y};{x}HCHAT MESSAGES:")
sys.stdout.write("\033[K")
# consumir linhas já publicadas
lines = ctx.ui_tail("log", h-1)
for i, ev in enumerate(lines):
sys.stdout.write(
f"\033[{y+1+i};{x}H{ev.format()[:w]}"
)

View File

@ -1,6 +1,20 @@
# panes/kernel.py
# neurotron/dashboard/panes/kernel.py
import sys
class KernelPane:
def render(self, ctx, x, y, w, h):
sys.stdout.write(f"\033[{y};{x}HKERNEL MESSAGES (placeholder)")
# título
sys.stdout.write(f"\033[{y};{x}HKERNEL MESSAGES:")
sys.stdout.write("\033[K")
# consumir linhas já publicadas
lines = ctx.ui_tail("kernel", h - 1)
row = y + 1
for line in lines:
truncated = line[:w]
sys.stdout.write(f"\033[{row};{x}H{truncated}")
sys.stdout.write("\033[K")
row += 1

View File

@ -1,5 +1,18 @@
# neurotron/dashboard/panes/memory.py
import sys
class MemoryPane:
def render(self, ctx, x, y, w, h):
sys.stdout.write(f"\033[{y};{x}HMEMORY MESSAGES (placeholder)")
# título
sys.stdout.write(f"\033[{y};{x}HMEMORY MESSAGES:")
sys.stdout.write("\033[K")
# consumir memória recente (já filtrada!)
lines = ctx.ui_tail("memory", h - 1)
row = y + 1
for line in lines:
truncated = line[:w]
sys.stdout.write(f"\033[{row};{x}H{truncated}")
sys.stdout.write("\033[K")
row += 1

View File

@ -2,4 +2,30 @@ import sys
class TRMPane:
def render(self, ctx, x, y, w, h):
sys.stdout.write(f"\033[{y};{x}HTRM MESSAGES (placeholder)")
snap = ctx.cognitive_snapshot()
sys.stdout.write(
f"\033[{y};{x}HTRM STATE:"
)
line1 = (
f"State:{snap['cog_state']} "
f"Depth:{snap['depth']} "
f"Val:{snap['valence']:+.2f} "
f"Energy:{snap['energy']}"
)
sys.stdout.write(f"\033[{y+1};{x}H{line1[:w]}\033[K")
# Separador
sys.stdout.write(f"\033[{y+2};{x}H" + "" * w)
# Pensamentos recentes
thoughts = ctx.ui_tail("trm", h - 3)
row = y + 3
for t in thoughts:
sys.stdout.write(
f"\033[{row};{x}H• {t[:w-2]}\033[K"
)
row += 1

View File

@ -1,18 +1,24 @@
# neurotron/hippocampus.py
from pathlib import Path
from datetime import datetime
import json
from typing import Optional, Callable
class Hippocampus:
"""
Memória contextual simples (JSON Lines): append-only.
Guarda perceções, decisões e ações para replays futuros.
Apenas stdlib JSON 100% compatível com Python estático.
"""
def __init__(self, log_dir: Path):
def __init__(
self,
log_dir: Path,
on_remember: Optional[Callable[[str, dict], None]] = None,
):
self.log_dir = log_dir
self.log_dir.mkdir(parents=True, exist_ok=True)
self.events_file = self.log_dir / "events.jsonl"
self.on_remember = on_remember
def remember(self, kind: str, data: dict) -> None:
rec = {
@ -22,11 +28,15 @@ class Hippocampus:
}
try:
# stdlib json → sempre string
blob = json.dumps(rec, separators=(",", ":")) # compacto
blob = json.dumps(rec, separators=(",", ":"))
with self.events_file.open("a", encoding="utf-8") as f:
f.write(blob + "\n")
except Exception:
# nunca crashar o Neurotron por logs
pass
# 🔔 notificação opcional (não quebra nunca)
if self.on_remember:
try:
self.on_remember(kind, data)
except Exception:
pass

View File

@ -1,33 +1,39 @@
# neurotron/logbus.py
from collections import deque
from dataclasses import dataclass
from datetime import datetime
import sys
@dataclass
class LogEvent:
ts: str
level: str
msg: str
def format(self) -> str:
return f"[{self.ts}] [{self.level}] {self.msg}"
class LogBus:
"""
Canal central de logs do Neurotron.
- escreve tudo em stdout (texto simples, sem Rich)
- mantém um buffer em memória para o dashboard (tail)
"""
def __init__(self):
self._subscribers = []
def __init__(self, maxlen: int = 1000):
self._buffer = deque(maxlen=maxlen)
def subscribe(self, fn):
self._subscribers.append(fn)
# -------------------------
# núcleo
# -------------------------
def _emit(self, level: str, msg: str):
ts = datetime.utcnow().strftime("%H:%M:%S")
line = f"[{ts}] [{level}] {msg}"
# guarda em memória para o dashboard
self._buffer.append(line)
# escreve em stdout (uma linha)
sys.stdout.write(line + "\n")
sys.stdout.flush()
ev = LogEvent(
ts=datetime.utcnow().strftime("%H:%M:%S"),
level=level,
msg=msg,
)
for fn in self._subscribers:
try:
fn(ev)
except Exception:
pass
# -------------------------
# API pública de logs
@ -61,16 +67,5 @@ class LogBus:
# fallback para chamadas antigas tipo logbus.emit("...")
self.info(msg)
# -------------------------
# Para o dashboard
# -------------------------
def tail(self, n: int = 150):
"""Devolve as últimas n linhas de log como lista de strings."""
if n <= 0:
return []
buf = list(self._buffer)
return buf[-n:]
# instância global
logbus = LogBus()
logbus: "LogBus" = LogBus()

View File

@ -171,6 +171,10 @@ class TRMEngine:
if len(self._history) % 10 == 0 and hasattr(self.ctx, "memory"):
payload = make_trm_snapshot_payload(st9, telemetry)
self.ctx.memory.remember("trm.snapshot", payload)
self.ctx.ui_publish(
"memory",
f"[trm] cog={st9.cog_state} val={st9.valence:+.2f} depth={st9.depth}"
)
except Exception as e:
self._dbg(f"erro ao gravar snapshot no Hippocampus: {e}")

View File

@ -136,6 +136,9 @@ class ThoughtAgent:
payload = {"thought": t}
try:
self.ctx.memory.remember("trm.thought", payload)
if hasattr(self.ctx, "ui_publish"):
self.ctx.ui_publish("trm", t)
except Exception:
pass

View File

@ -4,18 +4,28 @@ PYTHON="/usr/bin/python3"
NEUROTRON_HOME="/opt/kernel/neurotron"
SRC="$NEUROTRON_HOME/src"
# Garante diretórios básicos
# --- Filesystems base ---
mkdir -p /proc /sys /dev
# Montar proc, sysfs e devtmpfs (idempotente, falha silenciosa se já montado)
mount -t proc proc /proc 2>/dev/null || true
mount -t sysfs sys /sys 2>/dev/null || true
mount -t devtmpfs devtmpfs /dev 2>/dev/null || true
# Ambiente Python minimalista
# --- Ambiente ---
export HOME=/
export TERM=linux
export PYTHONHOME="/usr"
export PYTHONPATH="$SRC:/usr/lib/python3.13:/usr/lib/python3.13/site-packages"
export PATH="/sbin:/bin:/usr/sbin:/usr/bin:$PATH"
export PATH="/sbin:/bin:/usr/sbin:/usr/bin"
# Arrancar o cérebro principal como módulo do package
exec "$PYTHON" -m neurotron "$@"
# --- Garante VT ---
mkdir -p /dev/pts
mount -t devpts devpts /dev/pts 2>/dev/null || true
# --- Mudar para tty1 (VGA) ---
chvt 1
# --- Criar sessão e ligar ao VGA ---
exec setsid sh -c '
exec </dev/tty1 >/dev/tty1 2>&1
exec '"$PYTHON"' -m neurotron
'

View File

@ -73,6 +73,7 @@ def main():
Path(log_dir).mkdir(parents=True, exist_ok=True)
ctx = Cortex(runtime_dir=runtime_dir, log_dir=log_dir)
logbus.subscribe(ctx._on_log_event)
# threads
t_dash = threading.Thread(target=dashboard_loop, args=(ctx,), daemon=True)

View File

@ -72,6 +72,16 @@ class Cortex:
self.telemetry_path = Path(NEUROTRON_DATASET_PATH) / "telemetry.json"
self.telemetry_path.parent.mkdir(parents=True, exist_ok=True)
# ---- Dashboard ----
self.memory = Hippocampus(
log_dir=self.log_dir,
on_remember=self._on_memory_event,
)
self.ui_bus = defaultdict(lambda: deque(maxlen=200))
self.ui_publish("kernel", "[Placeholder (No futuro /dev/kmsg, dmesg reader ou ring buffer próprio)] ACPI: Core revision 20240415")
self.ui_publish("kernel", "[Placeholder (No futuro /dev/kmsg, dmesg reader ou ring buffer próprio)] EXT4-fs mounted filesystem")
def _init_paths(self):
"""
Inicializa todos os paths canónicos do runtime Neurotron.
@ -192,6 +202,16 @@ class Cortex:
return float(x)
except:
return fallback
def ui_publish(self, pane: str, msg: str):
self.ui_bus[pane].append(msg)
def ui_tail(self, pane: str, n: int):
q = self.ui_bus.get(pane)
if not q:
return []
return list(q)[-n:]
# ----------------------------------------
# heartbeat — apenas visual, não cognitivo
@ -286,4 +306,45 @@ class Cortex:
except Exception:
pass
return snap
return snap
def _on_memory_event(self, kind: str, data: dict):
"""
Observador de eventos lembrados (UI / TRM / futuro).
"""
summary = self._summarize_memory(kind, data)
if summary:
self.ui_publish("memory", summary)
def _summarize_memory(self, kind: str, data: dict) -> str:
"""
Converte eventos ricos em linhas humanas (dashboard).
"""
try:
if kind == "boot":
return f"[boot] mode={data.get('mode')} tick={data.get('tick')}"
if kind.startswith("telemetry.event"):
return f"[tele] {kind.split('.')[-1]}"
if kind == "trm.snapshot":
st = data.get("state", {})
return (
f"[trm] cog={st.get('cog_state')} "
f"val={st.get('valence', 0):+.2f} "
f"depth={st.get('depth')}"
)
return f"[{kind}] {str(data)[:60]}"
except Exception:
return None
def _on_log_event(self, ev):
# sempre disponível para UI
self.ui_publish("log", ev)
# opcional: persistência
if ev.level in ("error", "warn"):
self.memory.remember("log", {
"level": ev.level,
"msg": ev.msg
})

View File

@ -2,4 +2,13 @@ import sys
class ChatPane:
def render(self, ctx, x, y, w, h):
sys.stdout.write(f"\033[{y};{x}HCHAT MESSAGES (placeholder)")
# título
sys.stdout.write(f"\033[{y};{x}HCHAT MESSAGES:")
sys.stdout.write("\033[K")
# consumir linhas já publicadas
lines = ctx.ui_tail("log", h-1)
for i, ev in enumerate(lines):
sys.stdout.write(
f"\033[{y+1+i};{x}H{ev.format()[:w]}"
)

View File

@ -1,6 +1,20 @@
# panes/kernel.py
# neurotron/dashboard/panes/kernel.py
import sys
class KernelPane:
def render(self, ctx, x, y, w, h):
sys.stdout.write(f"\033[{y};{x}HKERNEL MESSAGES (placeholder)")
# título
sys.stdout.write(f"\033[{y};{x}HKERNEL MESSAGES:")
sys.stdout.write("\033[K")
# consumir linhas já publicadas
lines = ctx.ui_tail("kernel", h - 1)
row = y + 1
for line in lines:
truncated = line[:w]
sys.stdout.write(f"\033[{row};{x}H{truncated}")
sys.stdout.write("\033[K")
row += 1

View File

@ -1,5 +1,18 @@
# neurotron/dashboard/panes/memory.py
import sys
class MemoryPane:
def render(self, ctx, x, y, w, h):
sys.stdout.write(f"\033[{y};{x}HMEMORY MESSAGES (placeholder)")
# título
sys.stdout.write(f"\033[{y};{x}HMEMORY MESSAGES:")
sys.stdout.write("\033[K")
# consumir memória recente (já filtrada!)
lines = ctx.ui_tail("memory", h - 1)
row = y + 1
for line in lines:
truncated = line[:w]
sys.stdout.write(f"\033[{row};{x}H{truncated}")
sys.stdout.write("\033[K")
row += 1

View File

@ -2,4 +2,30 @@ import sys
class TRMPane:
def render(self, ctx, x, y, w, h):
sys.stdout.write(f"\033[{y};{x}HTRM MESSAGES (placeholder)")
snap = ctx.cognitive_snapshot()
sys.stdout.write(
f"\033[{y};{x}HTRM STATE:"
)
line1 = (
f"State:{snap['cog_state']} "
f"Depth:{snap['depth']} "
f"Val:{snap['valence']:+.2f} "
f"Energy:{snap['energy']}"
)
sys.stdout.write(f"\033[{y+1};{x}H{line1[:w]}\033[K")
# Separador
sys.stdout.write(f"\033[{y+2};{x}H" + "" * w)
# Pensamentos recentes
thoughts = ctx.ui_tail("trm", h - 3)
row = y + 3
for t in thoughts:
sys.stdout.write(
f"\033[{row};{x}H• {t[:w-2]}\033[K"
)
row += 1

View File

@ -1,18 +1,24 @@
# neurotron/hippocampus.py
from pathlib import Path
from datetime import datetime
import json
from typing import Optional, Callable
class Hippocampus:
"""
Memória contextual simples (JSON Lines): append-only.
Guarda perceções, decisões e ações para replays futuros.
Apenas stdlib JSON 100% compatível com Python estático.
"""
def __init__(self, log_dir: Path):
def __init__(
self,
log_dir: Path,
on_remember: Optional[Callable[[str, dict], None]] = None,
):
self.log_dir = log_dir
self.log_dir.mkdir(parents=True, exist_ok=True)
self.events_file = self.log_dir / "events.jsonl"
self.on_remember = on_remember
def remember(self, kind: str, data: dict) -> None:
rec = {
@ -22,11 +28,15 @@ class Hippocampus:
}
try:
# stdlib json → sempre string
blob = json.dumps(rec, separators=(",", ":")) # compacto
blob = json.dumps(rec, separators=(",", ":"))
with self.events_file.open("a", encoding="utf-8") as f:
f.write(blob + "\n")
except Exception:
# nunca crashar o Neurotron por logs
pass
# 🔔 notificação opcional (não quebra nunca)
if self.on_remember:
try:
self.on_remember(kind, data)
except Exception:
pass

View File

@ -1,33 +1,39 @@
# neurotron/logbus.py
from collections import deque
from dataclasses import dataclass
from datetime import datetime
import sys
@dataclass
class LogEvent:
ts: str
level: str
msg: str
def format(self) -> str:
return f"[{self.ts}] [{self.level}] {self.msg}"
class LogBus:
"""
Canal central de logs do Neurotron.
- escreve tudo em stdout (texto simples, sem Rich)
- mantém um buffer em memória para o dashboard (tail)
"""
def __init__(self):
self._subscribers = []
def __init__(self, maxlen: int = 1000):
self._buffer = deque(maxlen=maxlen)
def subscribe(self, fn):
self._subscribers.append(fn)
# -------------------------
# núcleo
# -------------------------
def _emit(self, level: str, msg: str):
ts = datetime.utcnow().strftime("%H:%M:%S")
line = f"[{ts}] [{level}] {msg}"
# guarda em memória para o dashboard
self._buffer.append(line)
# escreve em stdout (uma linha)
sys.stdout.write(line + "\n")
sys.stdout.flush()
ev = LogEvent(
ts=datetime.utcnow().strftime("%H:%M:%S"),
level=level,
msg=msg,
)
for fn in self._subscribers:
try:
fn(ev)
except Exception:
pass
# -------------------------
# API pública de logs
@ -61,16 +67,5 @@ class LogBus:
# fallback para chamadas antigas tipo logbus.emit("...")
self.info(msg)
# -------------------------
# Para o dashboard
# -------------------------
def tail(self, n: int = 150):
"""Devolve as últimas n linhas de log como lista de strings."""
if n <= 0:
return []
buf = list(self._buffer)
return buf[-n:]
# instância global
logbus = LogBus()
logbus: "LogBus" = LogBus()

View File

@ -171,6 +171,10 @@ class TRMEngine:
if len(self._history) % 10 == 0 and hasattr(self.ctx, "memory"):
payload = make_trm_snapshot_payload(st9, telemetry)
self.ctx.memory.remember("trm.snapshot", payload)
self.ctx.ui_publish(
"memory",
f"[trm] cog={st9.cog_state} val={st9.valence:+.2f} depth={st9.depth}"
)
except Exception as e:
self._dbg(f"erro ao gravar snapshot no Hippocampus: {e}")

View File

@ -136,6 +136,9 @@ class ThoughtAgent:
payload = {"thought": t}
try:
self.ctx.memory.remember("trm.thought", payload)
if hasattr(self.ctx, "ui_publish"):
self.ctx.ui_publish("trm", t)
except Exception:
pass

192
src/docs/jornada.md Normal file
View File

@ -0,0 +1,192 @@
# Neurotron — Jornada Resumida
## 1. Origem
Este projeto nasce de uma motivação humana simples e persistente:
compreender, preservar e continuar.
A jornada começa ainda na infância, num contexto sem acesso a computador ou internet.
O código era escrito em papel.
A execução existia apenas na imaginação.
Décadas depois, essa intuição inicial transforma-se num sistema operativo experimental (NFDOS) e num sistema cognitivo mínimo (Neurotron).
Este documento resume essa jornada — não como autobiografia, mas como **processo técnico e humano contínuo**.
---
## 2. O Problema Central
A maioria dos sistemas computacionais modernos otimiza:
- performance
- previsão estatística
- eficiência de execução
- escala
Poucos sistemas são projetados para:
- viabilidade contínua
- autorregulação
- preservação de identidade
- degradação graciosa sob stress
O Neurotron parte de uma pergunta diferente:
> O que é o mínimo necessário para um sistema **continuar a existir**?
---
## 3. Hipótese Fundamental
A inteligência não precede a estabilidade.
Ela emerge **depois** dela.
Antes de raciocinar, aprender ou explorar, um sistema precisa:
- não colapsar
- não entrar em loops destrutivos
- não consumir energia além da sua capacidade
- manter coerência interna mínima
Este princípio é tratado operacionalmente como **homeostase**.
---
## 4. Homeostase — Definição Operacional
No contexto do Neurotron, homeostase não é um conceito abstrato.
É uma propriedade mensurável e regulável.
Homeostase é a capacidade do sistema de:
- observar o próprio estado
- detectar desvios críticos
- ajustar o próprio comportamento
- regressar a uma zona viável de operação
A cognição surge **apenas após** essa condição ser satisfeita.
---
## 5. Atuadores Centrais (v0)
A homeostase do Neurotron é implementada através de três atuadores — apenas três.
### `tick` — Ritmo temporal
Controla a velocidade do ciclo cognitivo.
Sob stress, o sistema desacelera.
Sob estabilidade, retoma ritmo normal.
### `depth` — Profundidade cognitiva
Controla o nível de complexidade interna permitido.
Quando os recursos diminuem, o sistema pensa menos — mas melhor.
### `mode` — Modo global
Define o estado operacional macro:
- diagnóstico
- operação normal
- sobrevivência mínima
Não existem outros atuadores nesta fase.
Essa limitação é intencional.
---
## 6. Abordagem Técnica (Resumo)
O Neurotron opera sobre:
- um sistema operativo minimalista (NFDOS)
- Python estático
- módulos cognitivos simples
- memória episódica
- telemetria contínua
O ciclo básico do sistema é:
```
observe → think → act → rest
```
A cada iteração, os atuadores são ajustados com base no estado interno.
Não há aprendizagem estatística neste estágio.
Não há otimização de desempenho.
Há apenas **regulação para viabilidade**.
---
## 7. O Que o Sistema Já Demonstra
Mesmo na sua forma inicial, o Neurotron já apresenta comportamento coerente de autorregulação:
- reduz atividade sob stress
- diminui profundidade cognitiva quando instável
- entra em modos seguros automaticamente
- preserva identidade operacional
Isto **não é inteligência**.
É a **condição de possibilidade da inteligência**.
---
## 8. Dimensão Humana
Este projeto não é apenas técnico.
Ele nasce de uma preocupação humana concreta:
legado, continuidade e comunicação para além dos limites biológicos.
Uma das hipóteses exploradas é a existência de um
**“eu elétrico”** — padrões funcionais de atividade que podem persistir enquanto houver sinal, estrutura e interpretação.
Essa dimensão orienta decisões éticas e arquiteturais,
mas **não substitui o rigor técnico**.
---
## 9. O Que Este Projeto Não É
Este projeto:
- não é um manifesto
- não é ficção científica disfarçada
- não promete consciência artificial
- não é um produto comercial
É um **experimento técnico-filosófico honesto**,
documentado em tempo real,
com falhas visíveis e decisões rastreáveis.
---
## 10. Estado Atual
- Sistema funcional
- Homeostase mínima implementada
- Observabilidade ativa
- Memória episódica integrada
- Documentação extensa disponível
O projeto encontra-se em fase exploratória,
com foco em **compreensão antes de expansão**.
---
## 11. Continuidade
Os documentos completos, logs experimentais, narrativas paralelas e variações técnicas permanecem disponíveis como material de apoio.
Este resumo existe para permitir:
- leitura clara
- análise crítica
- diálogo interdisciplinar
Nada mais.
Nada menos.
---
## 12. Nota Final
Nós não estamos a otimizar resultados.
Nós estamos a aprender **o que mantém um sistema vivo**.
Isso é engenharia de sistemas viáveis.
Não hype.

View File

@ -262,3 +262,199 @@ As lacunas identificadas ao longo deste capítulo fundamentam a motivação do t
- Onde termina regulação técnica e começa cognição?
Estas questões orientam o desenvolvimento contínuo do NFDOS.
# Capítulo 3 — Visão Geral do NFDOS
## 3.1 Motivação e Origem do Projeto
O NFDOS emerge de uma motivação central que atravessa tanto a engenharia de sistemas como a investigação em cognição artificial: compreender quais são as condições mínimas necessárias para a **continuidade operacional viável** de um sistema complexo.
Embora o desenvolvimento do NFDOS seja informado por uma trajetória longa de experimentação prática e reflexão conceptual, este trabalho não se propõe como um relato autobiográfico. Em vez disso, a origem do projeto é aqui apresentada como um **processo técnico contínuo**, no qual questões humanas fundamentais — preservação, continuidade e interpretação — são traduzidas em decisões arquiteturais concretas.
O NFDOS resulta da convergência entre:
- sistemas operativos minimalistas,
- princípios de cibernética e autorregulação,
- arquiteturas cognitivas simbólicas,
- e modelos de vida artificial sob restrições reais de execução.
---
## 3.2 O Problema Estrutural Abordado
A maioria dos sistemas computacionais contemporâneos é projetada para otimizar métricas específicas, tais como:
- desempenho,
- eficiência computacional,
- previsibilidade estatística,
- escalabilidade.
No entanto, estes sistemas raramente são concebidos para lidar explicitamente com:
- viabilidade contínua,
- autorregulação interna,
- preservação de identidade operacional,
- degradação graciosa sob condições adversas.
O NFDOS parte de uma questão distinta das abordagens tradicionais:
> Qual é o conjunto mínimo de mecanismos necessários para que um sistema computacional **continue a existir de forma coerente ao longo do tempo**, mesmo sob stress, falha parcial ou restrição de recursos?
Esta questão desloca o foco da otimização para a **viabilidade sistémica**.
---
## 3.3 Hipótese Fundamental
A hipótese central que orienta o NFDOS é a seguinte:
> A cognição não precede a estabilidade; ela emerge **a partir** da estabilidade.
Antes de qualquer forma de aprendizagem, exploração ou deliberação complexa, um sistema precisa ser capaz de:
- evitar colapso funcional,
- prevenir loops destrutivos,
- operar dentro dos seus limites energéticos,
- manter coerência interna mínima.
Esta condição é tratada, no NFDOS, através do conceito operacional de **homeostase**.
---
## 3.4 Homeostase como Princípio Operacional
No contexto do NFDOS e do Neurotron, homeostase não é utilizada como metáfora biológica, mas como uma **propriedade mensurável, observável e regulável**.
Define-se homeostase como a capacidade do sistema de:
- observar continuamente o seu próprio estado interno,
- detectar desvios críticos relativamente a zonas viáveis,
- ajustar o seu comportamento de forma autónoma,
- regressar a uma região operacional estável.
A cognição simbólica só é ativada plenamente quando esta condição de viabilidade é satisfeita.
---
## 3.5 Atuadores Homeostáticos Fundamentais
A implementação da homeostase no Neurotron baseia-se deliberadamente num conjunto reduzido de atuadores. Na versão atual (v0), existem apenas três:
### 3.5.1 `tick` — Ritmo Temporal
O atuador `tick` controla o intervalo temporal entre ciclos cognitivos.
Quando o sistema deteta condições adversas, o ritmo é desacelerado; em estados estáveis, o ritmo é gradualmente normalizado.
Este mecanismo reduz carga, jitter e risco de instabilidade acumulada.
### 3.5.2 `depth` — Profundidade Cognitiva
O atuador `depth` limita a complexidade interna permitida ao modelo de raciocínio (TRM).
Sob restrição de recursos ou stress elevado, a profundidade cognitiva é reduzida automaticamente.
Este mecanismo impede thrashing cognitivo e preserva energia computacional.
### 3.5.3 `mode` — Modo Operacional Global
O atuador `mode` define o estado macro de operação do sistema, distinguindo entre:
- modos de diagnóstico,
- operação normal,
- sobrevivência mínima.
A transição entre modos é automática e baseada no estado interno observado.
A limitação a apenas três atuadores é uma escolha arquitetural intencional, visando interpretabilidade, robustez e controlo explícito.
---
## 3.6 Abordagem Técnica Geral
O Neurotron opera integrado num sistema operativo minimalista (NFDOS), recorrendo a:
- Python estático,
- módulos cognitivos simples,
- memória episódica persistente,
- telemetria contínua de baixo nível.
O ciclo cognitivo fundamental do sistema é definido como:
```
observe → think → act → rest
```
A cada iteração, os atuadores homeostáticos são ajustados com base no estado interno atual.
Nesta fase do projeto:
- não é utilizada aprendizagem estatística,
- não há otimização de desempenho,
- não existem modelos de linguagem de grande escala (LLMs).
O foco exclusivo é a **regulação para viabilidade contínua**.
---
## 3.7 Comportamentos Observados
Mesmo numa fase inicial, o sistema já demonstra propriedades coerentes de autorregulação:
- redução automática de atividade sob stress,
- diminuição da profundidade cognitiva em estados instáveis,
- entrada precoce em modos seguros,
- preservação de identidade operacional ao longo do tempo.
Estes comportamentos não constituem inteligência no sentido forte, mas representam a **condição necessária para a sua eventual emergência**.
---
## 3.8 Dimensão Conceptual e Humana
Embora este trabalho mantenha rigor técnico, ele é informado por uma preocupação conceptual mais ampla: a continuidade funcional de padrões de atividade significativos ao longo do tempo.
Uma das hipóteses exploradas é a noção de um **“eu elétrico”**, entendido como padrões funcionais persistentes que podem ser observados, interpretados e mantidos enquanto existirem estrutura, sinal e regulação.
Esta dimensão influencia decisões arquiteturais e éticas, mas não substitui nem enfraquece o método científico adotado.
---
## 3.9 Delimitação do Escopo
É importante clarificar o que o NFDOS **não** pretende ser:
- não é um manifesto filosófico,
- não é ficção científica,
- não promete consciência artificial,
- não é um produto comercial.
Trata-se de um **experimento técnico-científico exploratório**, documentado de forma transparente, com falhas, limitações e decisões explicitamente registadas.
---
## 3.10 Estado Atual do Sistema
No estado atual, o NFDOS apresenta:
- sistema funcional e executável,
- mecanismos homeostáticos mínimos implementados,
- observabilidade ativa,
- memória episódica integrada,
- documentação extensiva.
O desenvolvimento encontra-se numa fase exploratória, privilegiando **compreensão estrutural antes de expansão funcional**.
---
## 3.11 Continuidade do Trabalho
Os documentos complementares, logs experimentais, variações arquiteturais e narrativas técnicas permanecem disponíveis como material de apoio.
Este capítulo fornece uma visão consolidada necessária para:
- análise crítica,
- reprodução conceptual,
- diálogo interdisciplinar.
---
## 3.12 Síntese
Nós não estamos a otimizar resultados isolados.
Nós estamos a investigar **quais são as condições que permitem a um sistema permanecer viável ao longo do tempo**.
Este trabalho posiciona-se, assim, no domínio da **engenharia de sistemas viáveis**, distinguindo-se de abordagens orientadas a desempenho ou previsão.
Não se trata de hype, mas de exploração fundamentada.

View File

@ -0,0 +1,22 @@
```
┌───────────────┐
│ Kernel │
│ │
│ console=tty0 │─── VGA (mensagens kernel)
│ console=ttyS0 │─── Serial (debug)
└───────┬───────┘
┌───────▼───────┐
│ init (PID 1) │
│ │
│ chvt 1 │
│ setsid │
│ exec tty1 │
└───────┬───────┘
┌───────▼───────┐
│ Neurotron │
│ Dashboard v2 │
│ Corpo visual │
└───────────────┘
```

View File

@ -146,17 +146,19 @@ def corrigir_kernel_overrides(cross_compile):
"CONFIG_EXT4_USE_FOR_EXT2",
"CONFIG_CMDLINE_PARTITION",
"CONFIG_MCORE2",
# estes estao sendo testados
#"CONFIG_EXT4_FS_POSIX_ACL",
#"CONFIG_EXT4_FS_SECURITY",
# Console VGA (comentado para modo serial-only)
# "CONFIG_VT",
# "CONFIG_VT_CONSOLE",
# "CONFIG_VGA_CONSOLE",
# Console VGA (comentar para modo serial-only)
"CONFIG_VT",
"CONFIG_VT_CONSOLE",
"CONFIG_VGA_CONSOLE",
"CONFIG_FRAMEBUFFER_CONSOLE",
"CONFIG_FONT_8x16",
"CONFIG_FONT_8x8",
"CONFIG_FB_VESA",
# estes estao sendo testados
# "CONFIG_FB",
# "CONFIG_FB_VESA",
# "CONFIG_FRAMEBUFFER_CONSOLE",
# "CONFIG_FONT_8x16",
# "CONFIG_FONT_8x8",
# # "CONFIG_X86_MCE",
# # "CONFIG_X86_MCE_INTEL",
# "CONFIG_X86_LOCAL_APIC",
@ -210,12 +212,12 @@ def corrigir_kernel_overrides(cross_compile):
# "CONFIG_X86_PAT",
# "CONFIG_X86_PSE",
# modo serial-only
"CONFIG_VT",
"CONFIG_VT_CONSOLE",
"CONFIG_VGA_CONSOLE",
"CONFIG_FRAMEBUFFER_CONSOLE",
# "CONFIG_VT",
# "CONFIG_VT_CONSOLE",
# "CONFIG_VGA_CONSOLE",
# "CONFIG_FRAMEBUFFER_CONSOLE",
# "CONFIG_FB",
"CONFIG_DUMMY_CONSOLE",
"CONFIG_FB",
"CONFIG_DRM",
"CONFIG_DRM_I915",
"CONFIG_LOGO",
@ -905,7 +907,7 @@ def run():
# 🧠 Monta a linha base do QEMU
kernel_params = (
"console=ttyS0 earlyprintk=serial,ttyS0,115200 "
"console=tty0 console=ttyS0 earlyprintk=serial,ttyS0,115200 "
"keep_bootcon loglevel=8"
)
@ -918,10 +920,10 @@ def run():
f"-append '{kernel_params}' "
f"-drive file={data_disk},if=virtio,format=raw "
f"-m 1024 "
# f"-vga std "
# f"-display default "
f"-vga std "
f"-display default "
f"-serial mon:stdio "
f"-nographic "
# f"-nographic "
f"-no-reboot"
)