Files
organism/elements/astrocyte/appunti/2026-06-06-tripartite_synapse_v2.md
T

29 KiB
Raw Blame History

Table of Contents
include_toc
include_toc
true

Tripartite Synapse — Scope & Context Aware Pseudocode v2


Conventions

SCOPE    = { DAY, NIGHT }
CONTEXT  = { AP, NOT_AP, bAP, NOT_bAP, CONTINUOUS }

Compartments:
  PRE    = presynaptic bouton
  POST   = dendritic spine (postsynapse)
  ASTRO  = astrocyte
  DEND   = dendritic branch (segment between soma and spines)
  SOMA   = cell body / nucleus

Budget pools:
  BUD    = shared resource pool (one per territory)

Trace:
  A variable modified by a behavior that persists beyond
  the current context and biases future behaviors.

Shared Resource Pools

// ── Axonal arbor ──────────────────────────────────────────────────────
BUD axon_vesicle_protein_pool   // RIM, Munc13, VGCC subunits for AZ expansion
BUD axon_mitochondria_capacity  // ATP ceiling for vesicle release + refill
BUD axon_tagged_boutons         // boutons in competition for drifting proteins

// ── Dendritic branch ──────────────────────────────────────────────────
BUD dend_receptor_reserve       // local endosomal AMPA pool per branch
BUD dend_actin_machinery        // Rac1/RhoA + actin monomers per branch
BUD dend_protein_flux           // plasticity proteins flowing from soma
BUD dend_tagged_spines          // spines competing for protein flux
BUD dend_mitochondria_capacity  // local ATP budget for branch-level operations
BUD dend_mRNA_pool              // locally stored mRNAs for rapid translation

// ── Astrocyte territory ───────────────────────────────────────────────
BUD astro_serine_racemase_cap   // enzyme ceiling for D-serine synthesis
BUD astro_EAAT_pool             // transporter protein for glutamate clearance
BUD astro_ECM_protein_pool      // Glypicans, Thrombospondins for sealing
BUD astro_process_extensions    // finite perisynaptic processes
BUD astro_ATP_budget            // total ATP: clearance + synthesis + motility
BUD astro_lactate_ceiling       // hard cap from capillary glucose supply

// ── Soma ──────────────────────────────────────────────────────────────
BUD soma_ATP_budget             // mitochondrial capacity of cell body
BUD soma_protein_synthesis_rate // CREB-driven — peaks in NIGHT scope
BUD soma_receptor_synthesis_rate// new AMPA/NMDA subunits per hour
BUD soma_organelle_pool         // mitochondria + ribosomes available for shipping
BUD soma_mRNA_transcription_rate// rate of new mRNA production (Arc, BDNF, etc.)

Global State Variables

// ── PRE: presynaptic bouton ───────────────────────────────────────────
PRE pre_Ca_residual             // TRACE: leftover Ca²⁺ between spikes
PRE vesicle_release_prob        // P(0.11.0) per docking slot
PRE RRP_pool                    // readily-releasable vesicle pool
PRE reserve_pool                // chained vesicles in deep storage
PRE active_zone_size            // SLOW TRACE: docking slot count
PRE RRP_pool_capacity           // SLOW TRACE: max RRP
PRE VGCC_clustering             // SLOW TRACE: Ca²⁺ channels beneath AZ

// ── POST: dendritic spine ─────────────────────────────────────────────
POST membrane_potential         // Vm — local depolarization state
POST NMDA_Mg_block              // bool — mechanical clamp on/off
POST post_Ca_amplitude          // TRACE: peak [Ca²⁺] rise in spine
POST post_Ca_rise_speed         // TRACE: d(Ca)/dt — fast=LTP, slow=LTD
POST spine_tag                  // TRACE: bool — synaptic tag planted
POST AMPA_count                 // SLOW TRACE: surface receptors
POST spine_volume               // SLOW TRACE: physical spine size

// ── DEND: dendritic branch ────────────────────────────────────────────
DEND branch_voltage             // local depolarization propagating from spines
DEND bAP_amplitude              // strength of back-propagating AP at this branch
DEND branch_Ca                  // TRACE: Ca²⁺ in branch shaft (from bAP + spines)
DEND branch_tag                 // TRACE: bool — branch-level plasticity tag
DEND local_protein_translation  // rate of mRNA→protein at branch ribosomes
DEND mitochondria_density       // SLOW TRACE: local energy capacity
DEND branch_BDNF_level          // TRACE: local BDNF secreted by active spines

// ── SOMA: cell body ───────────────────────────────────────────────────
SOMA membrane_potential         // somatic Vm — integrates all dendritic input
SOMA AP_threshold               // firing threshold — modulated by neuromodulators
SOMA CREB_phospho               // TRACE: bool — transcription factor active
SOMA Arc_mRNA_level             // TRACE: activity-regulated mRNA — ships to branches
SOMA BDNF_production_rate       // TRACE: neurotrophin synthesis rate
SOMA nuclear_Ca                 // TRACE: Ca²⁺ in nucleus — gates CREB
SOMA organelle_shipping_queue   // queue of mitochondria/ribosomes being sent out

// ── ASTRO: astrocyte ──────────────────────────────────────────────────
ASTRO glutamate_cleft           // [glu] in synaptic cleft
ASTRO glutamate_spillover       // extrasynaptic [glu] — saturates mGluRs
ASTRO astro_Ca_local            // TRACE: IP3-triggered local rise
ASTRO astro_Ca_global           // TRACE: soma-wide wave — overload flag
ASTRO D_serine_release          // gliotransmitter pulse — NMDA co-agonist
ASTRO D_serine_tonic_level      // SLOW TRACE: baseline co-agonist supply
ASTRO perisynaptic_distance     // SLOW TRACE: wall distance from synapse
ASTRO ECM_integrity             // SLOW TRACE: extracellular matrix density
ASTRO glutamate_clearance_rate  // SLOW TRACE: EAAT transporter density
ASTRO lactate_out               // fuel export to pre + post + dend

// ── SIG: signaling intermediates ─────────────────────────────────────
SIG mGluR2_3_activation         // presynaptic Gi — autoinhibitory brake
SIG mGluR5_activation           // astrocytic Gq — IP3→Ca²⁺→D-serine
SIG cAMP_level                  // TRACE: set by dopamine/NE via Gs
SIG PKA_activity                // downstream of cAMP
SIG GluA1_Ser845_primed         // TRACE: bool — AMPA insertion primed
SIG DARPP32_phospho             // TRACE: bool — LTD phosphatase silenced
SIG CREB_active                 // TRACE: bool — gene expression enabled
SIG dopamine_level              // broadcast: "save" context signal
SIG NE_level                    // broadcast: arousal / gain signal
SIG ACh_level                   // broadcast: attention / threshold signal
SIG BDNF_TrkB_signaling         // local: branch survival + growth signal

Budget Allocation Functions

function request_axon_resources(bouton_id, req_AZ):
    available = axon_vesicle_protein_pool × tag_priority(bouton_id, axon_tagged_boutons)
    granted   = min(req_AZ, available)
    axon_vesicle_protein_pool -= granted
    if granted < req_AZ:
        trigger(heterosynaptic_depression, neighbors(bouton_id))
    return granted

function request_dend_resources(spine_id, req_AMPA, req_actin):
    priority = tag_priority(spine_id, dend_tagged_spines)
    g_AMPA   = min(req_AMPA,  dend_receptor_reserve  × priority)
    g_actin  = min(req_actin, dend_actin_machinery   × priority)
    dend_receptor_reserve -= g_AMPA
    dend_actin_machinery  -= g_actin
    if g_AMPA < req_AMPA:
        queue(spine_id, deficit, dend_protein_flux)  // wait for soma delivery
        trigger(heterosynaptic_depression, neighbors(spine_id))
    return (g_AMPA, g_actin)

function request_astro_resources(syn_id, req_Ds, req_ECM, req_proc):
    g_Ds   = min(req_Ds,   astro_serine_racemase_cap)
    g_ECM  = min(req_ECM,  astro_ECM_protein_pool)
    g_proc = min(req_proc, astro_process_extensions)
    ATP_cost = compute_ATP(g_Ds, g_ECM, g_proc)
    if ATP_cost > astro_ATP_budget: scale_down(g_Ds, g_ECM, g_proc)
    astro_serine_racemase_cap -= g_Ds
    astro_ECM_protein_pool    -= g_ECM
    astro_process_extensions  -= g_proc
    astro_ATP_budget          -= ATP_cost
    return (g_Ds, g_ECM, g_proc)

function request_soma_resources(req_proteins, req_receptors, req_organelles):
    g_prot  = min(req_proteins,   soma_protein_synthesis_rate)
    g_rec   = min(req_receptors,  soma_receptor_synthesis_rate)
    g_org   = min(req_organelles, soma_organelle_pool)
    ATP_cost = compute_ATP(g_prot, g_rec, g_org)
    if ATP_cost > soma_ATP_budget: scale_down(g_prot, g_rec, g_org)
    soma_protein_synthesis_rate  -= g_prot
    soma_receptor_synthesis_rate -= g_rec
    soma_organelle_pool          -= g_org
    soma_ATP_budget              -= ATP_cost
    return (g_prot, g_rec, g_org)

function replenish_budgets(Δt):
    // Axon
    axon_vesicle_protein_pool  += protein_transport_rate(axon) × Δt
    // Dendritic branch
    dend_receptor_reserve      += soma_receptor_synthesis_rate × delivery_fraction() × Δt
    dend_actin_machinery       += actin_recovery_rate() × Δt
    dend_protein_flux           = soma_protein_synthesis_rate
    dend_mRNA_pool             += soma_mRNA_transcription_rate × Δt
    dend_mitochondria_capacity += organelle_delivery_rate() × Δt
    // Astrocyte
    astro_serine_racemase_cap  += enzyme_synthesis_rate() × Δt
    astro_ECM_protein_pool     += ECM_synthesis_rate() × Δt
    astro_process_extensions   += process_recovery_rate() × Δt   // slow: hours
    astro_ATP_budget           += glycolysis(astro_lactate_ceiling) × Δt
    astro_lactate_ceiling       = capillary_glucose_supply()      // vascular ceiling
    // Soma
    soma_protein_synthesis_rate = CREB_driven_expression()        // peaks in NIGHT
    soma_receptor_synthesis_rate += ribosome_activity() × Δt
    soma_organelle_pool        += biogenesis_rate() × Δt
    soma_ATP_budget            += mitochondria_output() × Δt
    soma_mRNA_transcription_rate = AP_history_driven(SOMA.AP_rate) // scales with use


SCOPE: DAY

All fast and intermediate behaviors. Structural variables only READ, not written.


PRE — Presynaptic Bouton

CONTEXT: AP (action potential arriving)

scope DAY | context AP:

    // Gate 1: energy budget
    if axon_mitochondria_capacity < release_ATP_cost:
        suppress(release)                    // silent bouton — budget exhausted
        exit context

    // Ca²⁺ dynamics — primary fast trace
    pre_Ca_residual += spike_influx(input_freq)
    pre_Ca_residual *= decay(τ ≈ 100ms)     // TRACE: fades unless spikes keep arriving

    // Release — gated by residual trace from prior APs
    vesicle_release_prob  *= facilitation(pre_Ca_residual)
    released               = binomial(RRP_pool, vesicle_release_prob)
    glutamate_cleft        = released × quantal_content
    RRP_pool              -= released
    axon_mitochondria_capacity -= release_ATP_cost

    // Overflow sensing — activates mGluR brake (cross-compartment)
    glutamate_spillover = extrasynaptic_diffusion(glutamate_cleft)
    if glutamate_spillover > spillover_threshold:
        mGluR2_3_activation  = True
        cAMP_level          -= Gi_inhibition(adenylyl_cyclase)
        vesicle_release_prob -= VGCC_suppression()  // autoinhibitory brake

    // Fuel consumed — refill gated by lactate supply
    RRP_pool refilled by VATPase(astro.lactate_out)

CONTEXT: NOT_AP (between spikes)

scope DAY | context NOT_AP:

    // Residual Ca²⁺ decays — trace erodes passively
    pre_Ca_residual *= decay(τ ≈ 100ms)

    // Reserve pool mobilization — intermediate tuning, pool-limited
    if input_freq_history > 20Hz:
        mobilize(reserve_pool → RRP_pool)   // only if reserve_pool > 0
                                             // TRACE: RRP_pool now larger
    elif input_freq_history < 5Hz:
        vesicle_release_prob *= 0.7         // TRACE: depression accumulates

    // Neuromodulator context gate — sets axonal tag if save signal present
    if dopamine_level > D1_threshold or NE_level > β_threshold:
        cAMP_level  += Gs_activation(adenylyl_cyclase)
        PKA_activity = proportional_to(cAMP_level)
        axon_tagged_boutons.add(bouton_id)  // TRACE: tag — competes for axonal proteins

POST — Dendritic Spine

CONTEXT: NOT_bAP (before back-propagating AP — Hebbian anticipation window)

scope DAY | context NOT_bAP:

    // AMPA current from incoming glutamate
    AMPA_current        = glutamate_cleft × AMPA_count
    membrane_potential += AMPA_current

    // NMDA gate: coincidence check with D-serine from astrocyte
    if membrane_potential > -40mV and D_serine_release > threshold:
        NMDA_Mg_block      = False
        post_Ca_amplitude += NMDA_influx(glutamate_cleft)
        post_Ca_rise_speed = d(post_Ca_amplitude) / dt  // TRACE: encodes LTP vs LTD

    // TAG PLANTED HERE — before bAP confirms coincidence
    // Condition: Ca²⁺ rising, NMDA open, ion channels activated
    if post_Ca_amplitude > Ca_TAG_threshold and NMDA_Mg_block == False:
        spine_tag = True                    // TRACE: tag planted in anticipation window
        dend_tagged_spines.add(spine_id)    // enters competition for drifting proteins

    // PKA priming — if neuromodulator context already set
    if GluA1_Ser845_primed:
        AMPA_insertion_threshold *= 0.7     // easier to anchor receptors later

CONTEXT: bAP (back-propagating action potential arriving)

scope DAY | context bAP:

    // bAP depolarizes spine — confirms or rejects the tag planted in NOT_bAP
    membrane_potential += bAP_depolarization(dend.bAP_amplitude)

    // Coincidence validation: was the tag planted just before bAP?
    if spine_tag == True and post_Ca_amplitude > Ca_TAG_threshold:
        // Confirmed Hebbian coincidence — escalate Ca²⁺
        post_Ca_amplitude  += bAP_Ca_boost()  // TRACE: amplitude now crosses LTP threshold
        post_Ca_rise_speed  = d(post_Ca_amplitude) / dt

    elif spine_tag == False:
        // bAP arrived but no prior glutamate signal — no coincidence
        // membrane_potential rises transiently but no Ca²⁺ amplification
        pass

    // Fuel: NaK pump resets membrane — gated by lactate from astrocyte
    membrane_potential restored by NaK_ATPase(astro.lactate_out)
    soma_ATP_budget   -= bAP_propagation_cost

DEND — Dendritic Branch

CONTEXT: CONTINUOUS (branch is always active as integrator)

scope DAY | context CONTINUOUS:

    // Branch integrates spine activity and propagates bAP
    branch_voltage     = integrate(POST.membrane_potential, all_spines_on_branch)
    bAP_amplitude      = propagate_bAP(SOMA.AP_fired, branch_geometry)
                                         // TRACE: bAP_amplitude decays with distance from soma

    // Branch Ca²⁺ — driven by bAP and local NMDA spillover
    branch_Ca         += bAP_Ca_influx(bAP_amplitude)
    branch_Ca         *= decay(τ ≈ 300ms)  // TRACE: slower than spine Ca²⁺

    // Branch tag — planted when multiple co-active spines detected
    if co_active_spines(branch) > branch_tag_threshold:
        branch_tag = True               // TRACE: branch-level tag for coordinated plasticity
        BDNF_TrkB_signaling += local_BDNF_release(branch_Ca)  // TRACE: survival signal

    // Local translation — mRNA → protein at branch ribosomes
    // Only runs if branch_tag is set and mRNA pool available
    if branch_tag and dend_mRNA_pool > 0:
        local_protein_translation = translate(dend_mRNA_pool, dend_mitochondria_capacity)
        dend_mRNA_pool           -= local_protein_translation × cost
        dend_protein_flux        += local_protein_translation  // TRACE: locally produced proteins

    // Branch energy budget
    dend_mitochondria_capacity -= branch_ATP_cost(branch_voltage, local_protein_translation)

    // Intermediate tuning: ACh modulates branch excitability globally
    LTP_threshold *= (1 / (1 + ACh_level × mAChR_gain))

SOMA — Cell Body

CONTEXT: AP (somatic action potential fired)

scope DAY | context AP:

    // Somatic AP triggered when branch_voltage integration crosses threshold
    if SOMA.membrane_potential > AP_threshold:
        AP_fired = True

        // Nuclear Ca²⁺ — key trace for slow-scale gene expression
        nuclear_Ca += Ca_influx_from_AP()   // TRACE: accumulates with firing rate
        nuclear_Ca *= decay(τ ≈ seconds)

        // CREB phosphorylation — gated by nuclear Ca²⁺ AND PKA
        if nuclear_Ca > Ca_CREB_threshold and PKA_activity > PKA_threshold:
            CREB_phospho = True             // TRACE: enables gene expression in NIGHT scope
            SOMA.Arc_mRNA_level    += transcribe(Arc_gene)   // TRACE: ships to active branches
            SOMA.BDNF_production_rate += transcribe(BDNF_gene)

        soma_ATP_budget -= AP_generation_cost

CONTEXT: NOT_AP (between somatic spikes)

scope DAY | context NOT_AP:

    // Integrate dendritic input — build toward next AP or not
    SOMA.membrane_potential = integrate(DEND.branch_voltage, all_branches)

    // Ship mRNA to active dendritic branches — tagged branches receive priority
    for branch in dend_tagged_spines:
        Arc_mRNA_level  → ship_to(branch, priority_fraction)  // TRACE: Arc arrives at branch
        BDNF_production_rate → modulate(branch_BDNF_level)

    // Ship organelles to high-demand branches
    if soma_organelle_pool > 0:
        soma_organelle_queue.add(branches_ranked_by(branch_Ca))
        dend_mitochondria_capacity[top_branch] += deliver_organelle()
        soma_organelle_pool -= delivery_cost

    // Neuromodulator context received — PKA gate set for all compartments
    if dopamine_level > D1_threshold or NE_level > β_threshold:
        PKA_activity    = proportional_to(cAMP_level)
        GluA1_Ser845_primed = True          // TRACE: primes all tagged spines
        DARPP32_phospho     = True          // TRACE: silences LTD phosphatase
        CREB_active         = True          // TRACE: gene expression gate open

ASTRO — Astrocyte

CONTEXT: CONTINUOUS (astrocyte monitors territory at all times)

scope DAY | context CONTINUOUS:

    // Clearance — always running, rate limited by EAAT pool and ATP budget
    glutamate_cleft     -= glutamate_clearance_rate × Δt
    astro_ATP_budget    -= clearance_ATP_cost(glutamate_clearance_rate)

    // Overflow detection — gated by spillover threshold (low-affinity mGluR5)
    glutamate_spillover  = extrasynaptic_diffusion(glutamate_cleft)
    if glutamate_spillover > spillover_threshold:
        mGluR5_activation  = True
        astro_Ca_local    += IP3_cascade(PLC)    // TRACE: local Ca²⁺ rises
        (g_Ds, _, _)       = request_astro_resources(syn_id, proportional_to(astro_Ca_local), 0, 0)
        D_serine_release  += g_Ds                // NMDA co-agonist — may be budget-limited
        mGluR2_3_activation = True               // simultaneously brakes PRE

    // Global overload check
    astro_Ca_global = soma_wave(astro_Ca_local > OVERLOAD_threshold)
    if astro_Ca_global: trigger(shockwave_lockdown)

    // Fuel pipeline — hard-capped at vascular ceiling
    lactate_out = min(glycolysis_rate(glutamate_clearance_rate), astro_lactate_ceiling)
    deliver(lactate_out → PRE, POST, DEND)      // all three compartments draw from this
    astro_ATP_budget += glycolysis(lactate_out) × Δt

Special Case — Shockwave Lockdown (>100Hz, uncoordinated, any scope)

scope DAY or NIGHT | context OVERLOAD:

    astro_Ca_global     = GLOBAL_WAVE
    release(GABA, ATP)                          // emergency — bypasses budget gate
    rec_AMPA            = POST.mass_internalization()
    POST.AMPA_count    -= rec_AMPA
    dend_receptor_reserve += rec_AMPA           // returned to branch reserve
    POST.membrane_potential = HYPERPOLARIZED
    cluster(PRE.VGCC → beneath_active_zone)     // overdrive — signal preserved in chaos
    astro_ATP_budget   -= emergency_response_cost()


SCOPE: NIGHT

Structural commit, resource replenishment, consolidation. All compartments are modulated. Slow variables now WRITTEN.


ALL COMPARTMENTS — Structural Commit

scope NIGHT:

    // Step 1: replenish all budgets — soma protein synthesis peaks here
    replenish_budgets(Δt_night)

    // Step 2: process somatic shipping queue — fulfill deferred organelle deliveries
    for branch in soma_organelle_queue:
        dend_mitochondria_capacity[branch] += deliver_organelle()
        soma_organelle_pool -= delivery_cost

    // Step 3: evaluate structural commit for each tagged synapse
    for each (bouton_id, spine_id, syn_id) where spine_tag == True:
        commit_to_structural_change(bouton_id, spine_id, syn_id)

    // Step 4: homeostatic downscaling — prune unvalidated potentiations
    for each synapse where spine_tag == False and disuse_duration > disuse_threshold:
        passive_LTD(synapse)

    // Step 5: clear all DAY-scope traces that were not committed
    for each expired_tag in dend_tagged_spines + axon_tagged_boutons:
        expire_tag(expired_tag)

PRE — Structural Commit (NIGHT)

scope NIGHT | PRE:

    g_AZ = request_axon_resources(bouton_id, AZ_expansion_cost)

    // Commit proportional to granted budget
    active_zone_size     += g_AZ                    // SLOW TRACE: permanent AZ expansion
    RRP_pool_capacity    += pool_expansion(active_zone_size)
    VGCC_clustering      += cluster_beneath_AZ(g_AZ)
    vesicle_release_prob += scale_with(g_AZ)

    // If partial grant: deficit queued for next NIGHT cycle
    if g_AZ < AZ_expansion_cost:
        queue(bouton_id, deficit, axon_vesicle_protein_pool)

    axon_tagged_boutons.remove(bouton_id)

    // LTD branch: resources returned to pool
    if LTD_signal:
        rec_AZ = docking_slot_removal()
        active_zone_size          -= rec_AZ
        axon_vesicle_protein_pool += rec_AZ         // returned for reuse
        RRP_pool_capacity         -= pool_contraction()
        VGCC_clustering           -= scatter_VGCCs()
        vesicle_release_prob      *= 0.6

POST — Structural Commit (NIGHT)

scope NIGHT | POST:

    (g_AMPA, g_actin) = request_dend_resources(spine_id, AMPA_cost, actin_cost)

    // Commit proportional to granted budget
    activate(CaMKII)
    AMPA_count   += receptor_insertion(CaMKII, g_AMPA)  // SLOW TRACE: permanent receptor gain
    spine_volume *= (1 + spine_scale(g_actin))           // SLOW TRACE: spine head enlarged

    // Deficit queued for next NIGHT cycle
    if g_AMPA < AMPA_cost:
        queue(spine_id, deficit, dend_protein_flux)

    dend_tagged_spines.remove(spine_id)
    spine_tag = False                                    // tag cleared after commit

    // LTD branch: resources returned to branch pool
    if LTD_signal:
        activate(PP1)
        rec_AMPA              = receptor_internalization(PP1)
        AMPA_count           -= rec_AMPA
        dend_receptor_reserve += rec_AMPA               // returned to branch pool
        spine_volume         *= 0.7
        dend_actin_machinery += actin_depolymerization()

DEND — Structural Commit (NIGHT)

scope NIGHT | DEND:

    // Branch receives organelles shipped from soma during NIGHT
    dend_mitochondria_capacity += soma_organelle_delivery(branch_id)  // SLOW TRACE

    // Arc mRNA translated into structural proteins at branch ribosomes
    if dend_mRNA_pool > Arc_threshold:
        new_proteins = translate(dend_mRNA_pool, dend_mitochondria_capacity)
        dend_protein_flux     += new_proteins            // SLOW TRACE: local supply expanded
        dend_mRNA_pool        -= translation_cost

    // Branch BDNF consolidates active branch architecture
    if branch_BDNF_level > BDNF_survival_threshold:
        dend_mitochondria_density += BDNF_TrkB_signaling × Δt  // SLOW TRACE: branch reinforced
    else:
        dend_mitochondria_density -= pruning_rate() × Δt       // SLOW TRACE: branch weakened

    // Branch tag cleared
    branch_tag = False

SOMA — Structural Commit (NIGHT)

scope NIGHT | SOMA:

    // CREB drives transcription — highest rate during NIGHT (slow-wave sleep replay)
    if CREB_phospho:
        soma_protein_synthesis_rate  += CREB_driven_expression()  // SLOW TRACE
        soma_receptor_synthesis_rate += CREB_driven_expression()
        soma_mRNA_transcription_rate += transcription_burst()

    // Replenish organelle pool — biogenesis peaks during rest
    soma_organelle_pool += mitochondria_biogenesis() × Δt         // SLOW TRACE
    soma_ATP_budget     += overnight_mitochondria_recovery() × Δt

    // Homeostatic scaling: if overall firing was too high, scale down all synapses
    if soma_AP_rate_history > homeostatic_ceiling:
        for each synapse:
            AMPA_count[synapse]          *= homeostatic_scale_down_factor
            vesicle_release_prob[synapse] *= homeostatic_scale_down_factor

    // Clear CREB trace if no further consolidation needed
    if soma_organelle_queue.empty() and dend_tagged_spines.empty():
        CREB_phospho = False
        CREB_active  = False

ASTRO — Structural Commit (NIGHT)

scope NIGHT | ASTRO:

    // Perisynaptic process remodeling — most expensive astrocyte operation
    // LTP: walls move IN — seals and insulates the channel
    if LTP_signal:
        (g_Ds, g_ECM, g_pr) = request_astro_resources(syn_id, Ds_cost, ECM_cost, proc_cost)
        perisynaptic_distance    -= g_pr      // SLOW TRACE: tighter wrap
        ECM_integrity            += g_ECM    // SLOW TRACE: matrix sealed
        D_serine_tonic_level     += g_Ds     // SLOW TRACE: sustained co-agonist
        glutamate_clearance_rate *= (1 - clearance_scale(g_pr))  // SLOW TRACE

    // LTD: walls move OUT — loosens diffusion barrier, dissolves matrix
    if LTD_signal:
        rec_ECM = secrete(MMPs)
        ECM_integrity            -= rec_ECM
        astro_ECM_protein_pool   += rec_ECM × recycling_fraction  // partial recovery
        D_serine_tonic_level      = 0                              // SLOW TRACE: starved
        perisynaptic_distance    += process_extension()
        astro_process_extensions += freed_process                  // freed for reallocation
        glutamate_clearance_rate *= 1.2                            // SLOW TRACE

    // Replenish astrocyte pools overnight
    replenish_budgets(Δt_night)

Heterosynaptic Depression — Passive Resource Depletion (any scope)

scope DAY or NIGHT | triggered by budget exhaustion:

    function heterosynaptic_depression(neighbor_ids):
        // No active signal — purely consequence of pool depletion
        for n in neighbor_ids:
            if n not in dend_tagged_spines and n not in axon_tagged_boutons:
                POST.AMPA_count[n]           -= passive_depletion_rate()
                PRE.vesicle_release_prob[n]  -= passive_depletion_rate()

Energy Supply Chain — Metabolic Gating (DAY scope, CONTINUOUS)

scope DAY | context CONTINUOUS:

    function metabolic_loop(Δt):
        glucose_uptake = blood_capillary_supply()          // vascular hard ceiling
        lactate_out    = min(glycolysis(glucose_uptake, glutamate_clearance_rate),
                             astro_lactate_ceiling)
        lactate_out   *= load_factor(glutamate_clearance_rate)

        // Distribute fuel to all three consumer compartments
        PRE.RRP_pool       refilled by VATPase(lactate_out × pre_fraction)
        POST.membrane_potential reset by NaK_ATPase(lactate_out × post_fraction)
        DEND.branch_ops    powered by lactate_out × dend_fraction

        astro_ATP_budget  += glycolysis(lactate_out) × Δt

Key Asymmetries and Closure Summary

// PERISYNAPTIC DISTANCE — amplifies both directions
// LTP: walls IN  → clearance_rate ↓, D_serine_tonic ↑  → self-reinforcing
// LTD: walls OUT → clearance_rate ↑, D_serine_tonic = 0 → self-reinforcing
// Cost: astro_process_extensions budget — slow to recover (hours)

// SYNAPTIC TAG — the bridge between DAY and NIGHT
// Planted in DAY (NOT_bAP context) when Ca²⁺ rises before bAP confirms coincidence
// Consumed in NIGHT when structural commit runs and budget is available
// Expires in NIGHT if no save signal arrived during DAY — no structural trace left

// BUDGET CONSERVATION — the system is closed
// LTP draws from shared pools → neighbors passively depressed (heterosynaptic LTD)
// LTD returns resources to pools → neighbors passively enriched
// Net: one synapse's gain is its neighbors' loss, bounded by vascular glucose ceiling

// SLEEP (NIGHT scope) — not passive recovery but active execution
// soma_protein_synthesis_rate peaks → queued deficits fulfilled
// CREB_driven_expression peaks → new structural proteins shipped to tagged branches
// Homeostatic downscaling runs → unvalidated potentiations pruned
// All DAY traces either committed to structure or cleared