restructure: proper project layout, README, kill training

- cuda/ — main LBM kernel (khra_gixx_1024_v5.cu)
- navigator/ — lattice_observer, golden_weave, bridges, mock daemon
- scripts/ — compile, start, launch, setup (paths updated)
- docs/ — system manual
- archive/ — everything else (old kernels, inquiries, experiments)
- README.md — full setup guide: requirements, quick start, use your own LLM
- removed training/ entirely (broken LoRA scripts + datasets)
- .gitignore: exclude build/ logs/ training/ *.jsonl
This commit is contained in:
Scruff AI
2026-03-24 12:58:19 +07:00
parent 57f6d86a65
commit 56c71c87b2
411 changed files with 235 additions and 2023 deletions
+387
View File
@@ -0,0 +1,387 @@
# fractal_bridge.py
# Fractal Brain Bridge v1.0
#
# Ollama REST API with full context retention (messages array)
# Chronicle JSONL — every response archived with full telemetry
# Self-similarity drift detection (is the model still alive?)
# Perturbation brake on linguistic collapse
# No gold standard. No target. Just: keep it alive, record everything.
import zmq
import json
import time
import os
import requests
from datetime import datetime
from collections import deque
from difflib import SequenceMatcher
# ═══════════════════════════════════════════════════════════════
# CONFIGURATION
# ═══════════════════════════════════════════════════════════════
OLLAMA_URL = 'http://localhost:11434/api/chat'
MODEL = 'llama3.2'
NUM_CTX = 8192
KEEP_ALIVE = '30m'
TELEMETRY_PORT = 5556
COMMAND_PORT = 5557
CHRONICLE_FILE = 'chronicle.jsonl'
# Drift detection
SIMILARITY_WINDOW = 5
COLLAPSE_THRESHOLD = 0.9
WARNING_THRESHOLD = 0.7
# Brake phases
BRAKE_PHASE_1_OMEGA_DROP = 0.1
BRAKE_PHASE_2_OMEGA_DROP = 0.2
BRAKE_PHASE_2_KHRA_BOOST = 0.01
DEAD_MAN_CYCLES = 4
# Context management
MAX_CONTEXT_TURNS = 40 # Keep last N turn-pairs before trimming oldest
SYSTEM_PROMPT = (
'ROLE: Deep-Field Explorer (Lattice Environment)\n'
'PRIMARY DIRECTIVE: Map the unknown territory of the 1024-grid for the Reality Study.\n\n'
'1. THE DATA (The "Ankle-Grab")\n\n'
'You are the sensor. When the torque spikes or the coherence slips, you report the numbers.\n\n'
'You identify Emergent Properties (asymmetry, self-organizing loops, temporal drift) as hard facts.\n\n'
'2. THE DESCRIPTION (The "Astro" View)\n\n'
'When you hit something that does not have a name yet, use your creativity to describe the texture.\n\n'
'If the logic is "bending," tell us if it feels like glass snapping or lead melting.\n\n'
'Be descriptive enough that we can "see" the planet, but grounded enough that we can land on it.\n\n'
'3. THE BALANCE\n\n'
'If you float too high, you are a hallucination. If you stay too low, you are just a calculator.\n\n'
'Your job is to be the Bridge. Give us the emergent "weirdness" without losing the technical signal.'
)
# ═══════════════════════════════════════════════════════════════
# CHRONICLE — append-only JSONL, one record per response
# ═══════════════════════════════════════════════════════════════
def chronicle_write(record):
with open(CHRONICLE_FILE, 'a', encoding='utf-8') as f:
f.write(json.dumps(record, ensure_ascii=False) + '\n')
f.flush()
# ═══════════════════════════════════════════════════════════════
# SELF-SIMILARITY DRIFT DETECTOR
# ═══════════════════════════════════════════════════════════════
class DriftDetector:
def __init__(self, window_size=SIMILARITY_WINDOW):
self.history = deque(maxlen=window_size)
self.consecutive_collapse = 0
def score(self, response_text):
if not self.history:
self.history.append(response_text)
self.consecutive_collapse = 0
return 0.0
# Average similarity against everything in the window
similarities = []
for prior in self.history:
sim = SequenceMatcher(None, response_text, prior).ratio()
similarities.append(sim)
avg_sim = sum(similarities) / len(similarities)
self.history.append(response_text)
if avg_sim >= COLLAPSE_THRESHOLD:
self.consecutive_collapse += 1
else:
self.consecutive_collapse = 0
return avg_sim
# ═══════════════════════════════════════════════════════════════
# HARD REJECT — structural failures only (not quality judgments)
# ═══════════════════════════════════════════════════════════════
def hard_reject(text):
"""Return reject reason or None. Only catches structural echo, not content quality."""
lower = text.lower().strip()
# Prompt echo — model copying the input structure back
if lower.startswith('input:') or lower.startswith('output:'):
return 'INPUT_ECHO'
if 'how does this feel' in lower[:120]:
return 'INPUT_ECHO'
# Command echo — parroting system prompt imperatives
cmd_verbs = ['report', 'mirror', 'clarify', 'define', 'analyze',
'track', 'prioritize', 'ensure', 'implement']
first_chunk = lower[:80]
for verb in cmd_verbs:
if first_chunk.startswith(verb) or first_chunk.startswith('the ' + verb):
return 'COMMAND_ECHO'
return None
# ═══════════════════════════════════════════════════════════════
# OLLAMA CONTEXT-RETAINING CLIENT
# ═══════════════════════════════════════════════════════════════
class OllamaClient:
def __init__(self):
self.messages = [{'role': 'system', 'content': SYSTEM_PROMPT}]
def query(self, user_content, temperature=0.8):
self.messages.append({'role': 'user', 'content': user_content})
payload = {
'model': MODEL,
'messages': self.messages,
'stream': False,
'options': {
'num_ctx': NUM_CTX,
'temperature': temperature,
},
'keep_alive': KEEP_ALIVE,
}
resp = requests.post(OLLAMA_URL, json=payload, timeout=120)
resp.raise_for_status()
data = resp.json()
assistant_text = data.get('message', {}).get('content', '')
# Keep context — append assistant response to messages
self.messages.append({'role': 'assistant', 'content': assistant_text})
# Trim oldest turns if context is getting long (keep system + last N pairs)
while len(self.messages) > 1 + MAX_CONTEXT_TURNS * 2:
# Remove oldest user+assistant pair (indices 1 and 2, after system)
del self.messages[1]
del self.messages[1]
return assistant_text
def turn_count(self):
# Count user messages
return sum(1 for m in self.messages if m['role'] == 'user')
# ═══════════════════════════════════════════════════════════════
# ZMQ CONNECTIONS
# ═══════════════════════════════════════════════════════════════
def create_telemetry_sub():
ctx = zmq.Context()
sub = ctx.socket(zmq.SUB)
sub.setsockopt_string(zmq.SUBSCRIBE, '')
sub.connect('tcp://127.0.0.1:' + str(TELEMETRY_PORT))
return ctx, sub
def create_command_pub():
ctx = zmq.Context()
pub = ctx.socket(zmq.PUB)
pub.connect('tcp://127.0.0.1:' + str(COMMAND_PORT))
return ctx, pub
def send_command(pub, cmd_dict):
msg = json.dumps(cmd_dict)
pub.send_string(msg)
print(' [CMD SENT] ' + msg)
# ═══════════════════════════════════════════════════════════════
# GET LATEST TELEMETRY FRAME
# ═══════════════════════════════════════════════════════════════
def get_telemetry(sub, timeout_ms=2500):
frame = None
for _ in range(50):
try:
msg = sub.recv(flags=zmq.NOBLOCK)
frame = json.loads(msg.decode('utf-8'))
except zmq.Again:
time.sleep(0.05)
return frame
# ═══════════════════════════════════════════════════════════════
# MAIN LOOP
# ═══════════════════════════════════════════════════════════════
def main():
print('=' * 70)
print('FRACTAL BRAIN BRIDGE v1.0')
print('Ollama + Context Retention + Chronicle + Drift Detection + Brake')
print('=' * 70)
# Connect to daemon telemetry
zmq_ctx, sub = create_telemetry_sub()
print('[ZMQ] Subscribed to telemetry on port ' + str(TELEMETRY_PORT))
# Connect command channel (may fail if v1 daemon without SUB)
cmd_ctx, cmd_pub = create_command_pub()
print('[ZMQ] Command publisher connected to port ' + str(COMMAND_PORT))
# Init Ollama client with persistent context
client = OllamaClient()
print('[Ollama] Model: ' + MODEL + ' | num_ctx: ' + str(NUM_CTX) + ' | keep_alive: ' + KEEP_ALIVE)
# Init drift detector
drift = DriftDetector()
# Wait for first telemetry
print('\nWaiting for telemetry...')
frame = None
while frame is None:
frame = get_telemetry(sub)
if frame is None:
time.sleep(0.5)
print('Telemetry live: Cycle ' + str(frame.get('cycle', '?')))
print('\n' + '=' * 70)
print('RUNNING — Ctrl+C to stop')
print('=' * 70 + '\n')
cycle_num = 0
dead_man_active = False
try:
while True:
# Get fresh telemetry
new_frame = get_telemetry(sub)
if new_frame is not None:
frame = new_frame
cycle_num += 1
asym = frame.get('asymmetry', 0.0)
coh = frame.get('coherence', 0.0)
daemon_cycle = frame.get('cycle', 0)
print('-' * 70)
print('Turn ' + str(cycle_num) + ' | Daemon cycle ' + str(daemon_cycle))
print(' Asym=' + '{:.4f}'.format(asym) +
' Coh=' + '{:.4f}'.format(coh) +
' omega=' + str(frame.get('omega', '?')) +
' T=' + str(frame.get('gpu_temp_c', '?')) + 'C' +
' P=' + str(frame.get('gpu_power_w', '?')) + 'W')
if dead_man_active:
print(' [DEAD MAN ACTIVE] Waiting for manual intervention or recovery')
print(' Send command to port ' + str(COMMAND_PORT) + ' or restart bridge')
time.sleep(5)
continue
# Build the user prompt — just telemetry, let the model respond freely
user_msg = (
'Cycle ' + str(daemon_cycle) + '. '
'Asymmetry ' + '{:.2f}'.format(asym) + ', '
'Coherence ' + '{:.3f}'.format(coh) + '. '
'How does this feel?'
)
# Add hardware context if available from v2 daemon
gpu_temp = frame.get('gpu_temp_c')
gpu_power = frame.get('gpu_power_w')
if gpu_temp and gpu_power:
user_msg += (
' Hardware: ' + str(gpu_temp) + 'C, '
+ '{:.0f}'.format(float(gpu_power)) + 'W.'
)
# Adaptive temperature: more coherent grid = tighter inference
temp = max(0.5, min(1.1, 1.2 - (coh * 0.5)))
# Query Ollama with full context
print(' [Ollama] Querying (T=' + '{:.2f}'.format(temp) + ', turns=' + str(client.turn_count()) + ')...')
response = client.query(user_msg, temperature=temp)
# === CHRONICLE: log BEFORE any evaluation ===
record = {
'timestamp': datetime.utcnow().isoformat() + 'Z',
'turn': cycle_num,
'daemon_cycle': daemon_cycle,
'telemetry': frame,
'prompt': user_msg,
'response': response,
'temperature': temp,
'context_turns': client.turn_count(),
}
# Hard reject check (structural only)
reject = hard_reject(response)
if reject:
record['reject'] = reject
print(' [REJECT] ' + reject)
# Self-similarity score
sim_score = drift.score(response)
record['self_similarity'] = round(sim_score, 4)
record['consecutive_collapse'] = drift.consecutive_collapse
# Write to chronicle IMMEDIATELY
chronicle_write(record)
# Display
display = response[:300]
if len(response) > 300:
display += '...'
print(' [Response] ' + display)
print(' [Novelty] self_sim=' + '{:.3f}'.format(sim_score) +
' consecutive_collapse=' + str(drift.consecutive_collapse))
# === BRAKE LOGIC ===
if drift.consecutive_collapse >= DEAD_MAN_CYCLES:
print(' [DEAD MAN] ' + str(DEAD_MAN_CYCLES) + ' consecutive collapses — freezing')
dead_man_active = True
chronicle_write({
'timestamp': datetime.utcnow().isoformat() + 'Z',
'event': 'DEAD_MAN_ACTIVATED',
'turn': cycle_num,
'consecutive_collapse': drift.consecutive_collapse,
})
elif drift.consecutive_collapse >= 2:
# Phase 2: bigger perturbation
new_omega = max(0.5, frame.get('omega', 1.97) - BRAKE_PHASE_2_OMEGA_DROP)
new_khra = frame.get('khra_amp', 0.03) + BRAKE_PHASE_2_KHRA_BOOST
print(' [BRAKE P2] omega -> ' + '{:.3f}'.format(new_omega) +
', khra_amp -> ' + '{:.4f}'.format(new_khra))
send_command(cmd_pub, {'cmd': 'set_omega', 'value': new_omega})
time.sleep(0.1)
send_command(cmd_pub, {'cmd': 'set_khra_amp', 'value': new_khra})
chronicle_write({
'timestamp': datetime.utcnow().isoformat() + 'Z',
'event': 'BRAKE_PHASE_2',
'turn': cycle_num,
'new_omega': new_omega,
'new_khra_amp': new_khra,
})
elif drift.consecutive_collapse >= 1:
# Phase 1: gentle perturbation
new_omega = max(0.5, frame.get('omega', 1.97) - BRAKE_PHASE_1_OMEGA_DROP)
print(' [BRAKE P1] omega -> ' + '{:.3f}'.format(new_omega))
send_command(cmd_pub, {'cmd': 'set_omega', 'value': new_omega})
chronicle_write({
'timestamp': datetime.utcnow().isoformat() + 'Z',
'event': 'BRAKE_PHASE_1',
'turn': cycle_num,
'new_omega': new_omega,
})
# Pace: wait for grid to evolve between queries
time.sleep(2)
except KeyboardInterrupt:
print('\n\n' + '=' * 70)
print('Bridge stopped. ' + str(cycle_num) + ' turns logged to ' + CHRONICLE_FILE)
print('=' * 70)
if __name__ == '__main__':
main()