"use strict"; let currentState = {}; const byId = (id) => document.getElementById(id); const setText = (id, value) => { const node = byId(id); if (node) node.textContent = String(value ?? "—"); }; function createLearningTabButton() { const nav = document.querySelector(".tab-nav"); if (!nav || nav.querySelector('[data-tab="learning"]')) return; const button = document.createElement("button"); button.className = "tab-btn"; button.dataset.tab = "learning"; button.type = "button"; button.textContent = "🧭 LEARNING"; const control = nav.querySelector('[data-tab="control"]'); if (control?.nextSibling) nav.insertBefore(button, control.nextSibling); else nav.append(button); } function createLearningWorkspace() { if (byId("tab-learning")) return; const main = document.querySelector("main"); if (!main) return; const section = document.createElement("section"); section.className = "tab-content"; section.id = "tab-learning"; section.innerHTML = `
PREPARE · OBSERVE · COMPARE

Learning Preparation Studio

KI darf Lernbedingungen vorbereiten. Muster, Gewichte, Ströme und Rewardwerte bleiben außerhalb ihrer Autorität.

Engineunknown STDPunknown Rewardunknown Sessionnone
1LernzielMessbare Aufgabe statt gewĂĽnschtes Neuronenmuster
→
2BaselineVerhalten und optionale Impulsantwort vor Lernen
→
3VorbereitungQuellen, Partitionen, Kontrollen, Stop-Regel
→
4ExperienceEnvironment → SNN → LearningEngine
→
5VergleichPost-Evaluation, Holdout und Evidence
LIVE

Aktueller Lernzustand

—
STDP Updates—
Reward Updates—
Rewards—
Pending—
Knowledge Items—
Modeoperator
BOUNDARY

KI-Autorität

PROPOSAL ONLY

Erlaubt: Lernziel strukturieren, Quellen/Partitionen prĂĽfen, Baseline, Kontrollen, Evaluation und Stop-Kriterien vorschlagen.

Nicht erlaubt: Synapsengewichte, Spikefolgen, Strominjektionen, Eligibility-Zustände, Plasticity-Updates oder Rewardwerte vorgeben.

1–3

Lernen vorbereiten

nicht ausfĂĽhrend
Die Schaltfläche ruft den bestehenden read-only Research Assistant auf. Sie startet keinen Lauf und ändert keine Lernparameter.
AI PROPOSAL

Vorbereitungsentwurf

not requested
Noch kein KI-Vorschlag erstellt.
DIAGNOSTIK

Pre / Post Learning

secondary measures
Pre Task Baselinerequired
Pre Impulse Probeoptional
Temporal Referenceoptional
Post Task Evaluationrequired
Post Impulse Probeoptional
Holdout / Generalizationrequired for claim

Eine veränderte NetworkResponseSignature oder TemporalDiscrepancy ist allein noch kein Lernerfolg. Primär zählt die preregistrierte Aufgabenleistung gegenüber Kontrollen.

`; const research = byId("tab-research"); if (research) main.insertBefore(section, research); else main.append(section); byId("learning-ai-prepare")?.addEventListener("click", prepareWithAI); byId("learning-run")?.addEventListener("click", runLearning); byId("learning-clear-proposal")?.addEventListener("click", () => { ["learning-goal", "learning-success-metric", "learning-source-notes", "learning-constraints"].forEach((id) => { const field = byId(id); if (field) field.value = ""; }); setText("learning-ai-status", "not requested"); setText("learning-ai-proposal", "Noch kein KI-Vorschlag erstellt."); }); } function learningPrompt() { const goal = byId("learning-goal")?.value?.trim() || ""; const metric = byId("learning-success-metric")?.value?.trim() || "not specified"; const sources = byId("learning-source-notes")?.value?.trim() || "not specified"; const controls = byId("learning-constraints")?.value?.trim() || "not specified"; const contextLength = Number(byId("learning-context-length")?.value || 24000); const learning = currentState.learning || {}; const mode = currentState.experiment_state?.current_mode || currentState.experiment_state?.mode || "operator"; return `You are preparing a Brain-5D learning experiment. Produce a proposal only; do not execute anything.\n\nLearning goal: ${goal}\nSuccess metric: ${metric}\nSources/environment/provenance: ${sources}\nControls/constraints: ${controls}\nRequested context length: ${contextLength} characters\nCurrent mode: ${mode}\nCurrent learning status: STDP enabled=${Boolean(learning.stdp_enabled)}, eligibility enabled=${Boolean(learning.eligibility_enabled)}, reward enabled=${Boolean(learning.reward_enabled)}.\n\nReturn a concise preparation proposal with exactly these sections: Objective, Source and partition plan, Pre-learning baseline, Exposure plan at task/environment level, Controls, Evaluation and holdout, Stopping rule, Confounds and safety, Required human decisions.\n\nHard boundary: never provide synaptic weights, a weight matrix, target spike trains/patterns, injected-current values/arrays, eligibility traces, direct plasticity updates, or reward values. Do not propose that the LLM writes a neural representation. The SNN must form its own representation through the registered environment and LearningEngine. Label the result AI PROPOSAL — NOT APPLIED.`; } async function prepareWithAI() { const goal = byId("learning-goal")?.value?.trim(); if (!goal) { setText("learning-ai-status", "goal required"); setText("learning-ai-proposal", "Bitte zuerst ein Lernziel formulieren."); return; } const button = byId("learning-ai-prepare"); if (button) button.disabled = true; setText("learning-ai-status", "preparing"); setText("learning-ai-proposal", "KI erstellt einen proposal-only Vorbereitungsentwurf …"); try { const response = await fetch("/api/research/chat", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ action: "ask", message: learningPrompt(), response_mode: "scientific", web_search: false, max_context_chars: Number(byId("learning-context-length")?.value || 24000), }), }); const payload = await response.json(); if (!response.ok) throw new Error(payload.error || `HTTP ${response.status}`); setText("learning-ai-status", "AI PROPOSAL · NOT APPLIED"); setText("learning-ai-proposal", payload.answer || "Keine Antwort geliefert."); } catch (error) { setText("learning-ai-status", "unavailable"); setText("learning-ai-proposal", `KI-Vorbereitung nicht verfügbar: ${error.message}`); } finally { if (button) button.disabled = false; } } async function runLearning() { const goal = byId("learning-goal")?.value?.trim(); const metric = byId("learning-success-metric")?.value?.trim(); if (!goal || !metric) { setText("learning-ai-status", "goal and metric required"); setText("learning-ai-proposal", "Lernziel und Erfolgskriterium sind vor dem Lernlauf erforderlich."); return; } const button = byId("learning-run"); if (button) button.disabled = true; setText("learning-ai-status", "running registered learning workflow"); setText("learning-ai-proposal", "Lernlauf wird ausgeführt; KI-Ausgabe und Freitext werden nicht als Lernparameter verwendet."); const suffix = `${Date.now()}`.slice(-10); try { const response = await fetch("/api/learning/run", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ operator_confirmed: true, experiment_id: `EXP-LEARN-${suffix}`, question_id: "RQ-SNN-005", hypothesis_id: "H-SNN-005-A", title: goal, conditions: `success_metric=${metric}; ${byId("learning-constraints")?.value?.trim() || "operator-defined controls"}`, ticks: 100, notes: `Sources/provenance: ${byId("learning-source-notes")?.value?.trim() || "not specified"}`, }), }); const payload = await response.json(); if (!response.ok) throw new Error(payload.error || `HTTP ${response.status}`); setText("learning-ai-status", "learning completed · data recorded"); setText("learning-ai-proposal", JSON.stringify(payload, null, 2)); } catch (error) { setText("learning-ai-status", "learning unavailable"); setText("learning-ai-proposal", `Lernlauf nicht verfügbar: ${error.message}`); } finally { if (button) button.disabled = false; } } export function ensureLearningStudio() { createLearningTabButton(); createLearningWorkspace(); } export function renderLearningStudio(state) { currentState = state || {}; ensureLearningStudio(); const learning = state?.learning || {}; const knowledge = state?.knowledge_intake || {}; const experiment = state?.experiment_state || {}; const activeSession = experiment.active_session || null; setText("learning-studio-engine", learning.engine_attached ? "ACTIVE" : "UNAVAILABLE"); setText( "learning-studio-stdp", learning.stdp_enabled ? (Number(learning.stdp_updates || 0) > 0 ? "ACTIVE" : "ARMED") : "DISABLED", ); setText( "learning-studio-reward", learning.reward_enabled ? (Number(learning.reward_updates || 0) > 0 ? "ACTIVE" : "ARMED") : "DISABLED", ); setText("learning-studio-session", activeSession?.session_id || "none"); setText("learning-studio-learning-ms", `${Number(learning.update_ms || 0).toFixed(3)} ms`); setText("learning-studio-stdp-updates", Number(learning.stdp_updates || 0).toLocaleString()); setText("learning-studio-reward-updates", Number(learning.reward_updates || 0).toLocaleString()); setText( "learning-studio-rewards", `${Number(learning.rewards_applied || 0).toLocaleString()} / ${Number(learning.rewards_received || 0).toLocaleString()}`, ); setText("learning-studio-pending", Number(learning.pending_rewards || 0).toLocaleString()); setText("learning-studio-knowledge", Number(knowledge.items_processed || 0).toLocaleString()); setText("learning-studio-mode", experiment.current_mode || experiment.mode || "operator"); }