--- include_toc: true --- # Intro The synapse uses three interlocking signal systems to translate present activity into future behavioral bias. Ca²⁺ is the universal event recorder — each compartment reads its concentration dynamics differently (amplitude and speed of rise in the postsynapse, residual accumulation in the presynapse, IP3-triggered waves in the astrocyte), so the same ion encodes distinct instructions depending on where and how it appears. cAMP/PKA is the contextual gate: driven by neuromodulatory broadcast (dopamine, norepinephrine), it doesn't write changes itself but determines whether the Ca²⁺ signal gets committed to permanent structure — by priming AMPA receptor insertion, silencing the LTD phosphatase machinery via DARPP-32, and activating CREB-driven gene expression for structural proteins. mGluRs provide the overflow sensing layer: when glutamate spills beyond the cleft, group II/III mGluRs on the presynapse activate a Gi-mediated autoinhibitory brake, while group I mGluRs on the astrocyte trigger the IP3→Ca²⁺→D-serine cascade that amplifies NMDA coincidence detection — a push-pull architecture that simultaneously throttles excessive release and widens the postsynaptic learning window. Together these three systems form a hierarchical filter: Ca²⁺ asks did something happen?, mGluRs ask was it excessive?, and cAMP/PKA asks was it worth saving? — and only when all three align does the synapse commit to rewriting its future response. ## signal state variables ```Gen // ── Ca²⁺ : event recorder ────────────────────────────────────── pre_Ca_residual // leftover Ca²⁺ between spikes — encodes recent history post_Ca_amplitude // peak rise magnitude in spine post_Ca_rise_speed // rate of rise — fast=LTP, slow=LTD astro_Ca_local // IP3-triggered local rise near synapse astro_Ca_global // soma-wide wave — network overload flag // ── cAMP/PKA : context gate ──────────────────────────────────── cAMP_level // set by dopamine/NE via Gs → adenylyl cyclase PKA_activity // downstream of cAMP GluA1_Ser845_primed // bool — AMPA insertion threshold lowered DARPP32_phospho // bool — PP1 (LTD phosphatase) silenced CREB_active // bool — structural gene expression enabled // ── mGluRs : overflow sensor ─────────────────────────────────── glutamate_spillover // extrasynaptic [glu] — only high when cleft saturated mGluR2_3_activation // presynaptic Gi — autoinhibitory brake mGluR5_activation // astrocytic Gq — IP3 → Ca²⁺ → D-serine cascade ``` ## layer 1 — Ca²⁺: did something happen? ```Gen function Ca_event_recorder(spike_history, input_freq): // Presynapse: residual Ca²⁺ = trace of recent firing pre_Ca_residual += spike_influx(input_freq) pre_Ca_residual *= decay(τ ≈ 100ms) // fades unless spikes keep arriving vesicle_release_prob *= facilitation(pre_Ca_residual) // Postsynapse: amplitude + speed encode the instruction post_Ca_amplitude = NMDA_influx(glutamate_cleft, membrane_potential) post_Ca_rise_speed = d(post_Ca_amplitude) / dt if post_Ca_amplitude > Ca_HIGH and post_Ca_rise_speed > fast_threshold: activate(CaMKII) // → LTP kinase pathway elif post_Ca_amplitude > Ca_LOW and post_Ca_rise_speed < slow_threshold: activate(PP1, PP2B) // → LTD phosphatase pathway else: pass // sub-threshold — no instruction encoded // Astrocyte: local vs global Ca²⁺ = two different alarms astro_Ca_local = IP3_release(mGluR5_activation) // activity-proportional astro_Ca_global = soma_wave(astro_Ca_local > OVERLOAD_threshold) if astro_Ca_local > local_threshold: D_serine_release += gliotransmitter_pulse() // widens NMDA window if astro_Ca_global: trigger(shockwave_lockdown) // circuit-breaker ``` ## layer 2 — mGluRs: was it excessive? ```Gen function mGluR_overflow_sensor(): // Only fires when cleft is genuinely saturated (low-affinity receptors) glutamate_spillover = extrasynaptic_diffusion(glutamate_cleft) if glutamate_spillover > spillover_threshold: // Presynapse arm: Gi → brake mGluR2_3_activation = True cAMP_level -= Gi_inhibition(adenylyl_cyclase) // suppress PKA locally vesicle_release_prob -= VGCC_suppression() // autoinhibitory brake // Astrocyte arm: Gq → amplify (push-pull) mGluR5_activation = True astro_Ca_local += IP3_cascade(PLC_activation) // feeds back into layer 1 D_serine_release += proportional_to(astro_Ca_local) // Net: same overflow signal brakes pre, amplifies post-learning window return (mGluR2_3_activation, mGluR5_activation) ## layer 3 — cAMP/PKA: was it worth saving? function PKA_context_gate(): // Neuromodulators set the gate via Gs protein if dopamine_level > D1_threshold or norepinephrine_level > β_threshold: cAMP_level += Gs_activation(adenylyl_cyclase) PKA_activity = proportional_to(cAMP_level) // Target 1: prime AMPA insertion phosphorylate(GluA1, site=Ser845) GluA1_Ser845_primed = True // lowers threshold for CaMKII to anchor receptors // Target 2: silence the forgetting machinery phosphorylate(DARPP32) DARPP32_phospho = True // inhibits PP1 → LTD pathway blocked // Target 3: enable structural gene expression translocate(PKA → nucleus) phosphorylate(CREB) CREB_active = True // new receptors, cytoskeleton, scaffolding ``` ## hierarchical filter — commit decision ```Gen function commit_to_structural_change(): // All three layers must align event_detected = post_Ca_amplitude > Ca_HIGH // layer 1: did something happen? overflow_sensed = mGluR5_activation == True // layer 2: was it excessive? context_validated = DARPP32_phospho and GluA1_Ser845_primed // layer 3: worth saving? if event_detected and overflow_sensed and context_validated: activate(CaMKII) // Ca²⁺ signal now gets converted AMPA_count += receptor_insertion(CaMKII, GluA1_Ser845_primed) active_zone_size += structural_expansion(CREB_active) ECM_integrity += astrocyte_sealing(astro_Ca_local) return "potentiated" elif event_detected and not context_validated: return "temporary facilitation only" // Ca²⁺ rose but no save signal elif not event_detected and overflow_sensed: activate(PP1) // phosphatase wins — LTD AMPA_count -= receptor_internalization(PP1) return "depressed" else: return "baseline — no change" ``` ## End The key architectural decision in this pseudocode is the separation into three explicit layers that feed into a single commit_to_structural_change function. Each layer answers one question independently before the final AND-gate runs — Ca²⁺ detects the event, mGluRs assess its magnitude, and cAMP/PKA validates its context. Notice also that mGluR layer has a push-pull side effect that feeds back into the Ca²⁺ layer (astro_Ca_local is updated by mGluR5_activation), making the system not a strict pipeline but a loop — the overflow sensor actively reshapes what the event recorder sees next.