ASELSANMicrokernel
S425 · SOURCE-BOUND GATE EVIDENCE

S425 · S212 consumption reconciliation

tam S425 implementation modülü → Operations --test hedefi ile bağlı tam focused test → ayrı Operations kaydı Bu sayfa yalnız S425 kapısına aittir; komşu kapıların kaynakları bu kabulün içine katılmaz.

S425Focused kod testiOperations id exactsource SHA exacttest target exact

operation: g8l-s425-s212-consumption-reconciliation-partial

uygulama/model · focused test · Operations · 3 exact excerpt

sequence-bound=true · implementation-bound=true
01 · Yürütme / doğrulama kodu

Kapının gerçek repository sözleşmesi

tam dosyaL1–L214
kernel/src/g8l_target_dispatch_scheduler_owner_scheduler_mutation_production_migration_lifecycle_s425_s212_consumption_reconciliation.rs::S425 s212 consumption reconciliation implementation
#![allow(unexpected_cfgs)]

//! S425 reconciliation of S424 continuation with the real S212 service result.
//!
//! A queued S187 continuation is not considered downstream-published until the
//! same CPU1 IRQ observes S212 consume its tuple and publish the S211 request.
//! Idle preserves S424; an unbound S212 publication fails closed. S210 remains
//! a separate next gate.

use crate::g8l_target_dispatch_scheduler_owner_scheduler_mutation_production_migration_lifecycle_s424_continuation_receipt_publication::{
    G8lS424ContinuationReceipt, G8lS424ContinuationReceiptError,
    G8lS424ContinuationReceiptState, S424_DIRECT_SCHEDULER_ACCESS_SITES,
    S424_PRODUCTION_GUARDED_DIRECT_ACCESS_SITES, S424_SOURCE_AUDIT_UNITS,
    S424_SOURCE_MODEL_COVERED_DIRECT_ACCESS_SITES, S424_UNROUTED_DIRECT_ACCESS_SITES,
};

pub const S425_SOURCE_AUDIT_UNITS: usize = S424_SOURCE_AUDIT_UNITS;
pub const S425_DIRECT_SCHEDULER_ACCESS_SITES: usize = S424_DIRECT_SCHEDULER_ACCESS_SITES;
pub const S425_SOURCE_MODEL_COVERED_DIRECT_ACCESS_SITES: usize =
    S424_SOURCE_MODEL_COVERED_DIRECT_ACCESS_SITES;
pub const S425_PRODUCTION_GUARDED_DIRECT_ACCESS_SITES: usize =
    S424_PRODUCTION_GUARDED_DIRECT_ACCESS_SITES;
pub const S425_UNROUTED_DIRECT_ACCESS_SITES: usize = S424_UNROUTED_DIRECT_ACCESS_SITES;
pub const S425_S212_COMPLETION_SLOT_CAPACITY: usize = 1;
pub const S425_PRODUCTION_RECONCILIATION_CALLSITES: usize = 1;
pub const S425_S212_CONSUMPTION_RECONCILIATION_COMPLETE: bool = true;
pub const S425_S210_COMPLETION_RECONCILIATION_COMPLETE: bool = false;

#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct G8lS425S212Completion {
    pub attempt_id: u64,
    pub provider_request_id: u64,
    pub exclusive_token: u64,
    pub s212_tuple_consumed: bool,
    pub s211_request_published: bool,
    pub s210_completed: bool,
    pub runtime_observed: bool,
}

#[derive(Debug)]
pub struct G8lS425S212CompletionState {
    pending: Option<G8lS425S212Completion>,
}

impl G8lS425S212CompletionState {
    pub const fn new() -> Self {
        Self { pending: None }
    }
    pub const fn pending(&self) -> bool {
        self.pending.is_some()
    }
    pub fn pending_completion(
        &self,
        caller_cpu: usize,
    ) -> Result<Option<G8lS425S212Completion>, G8lS425S212ConsumptionReconciliationError> {
        if caller_cpu != 1 {
            return Err(G8lS425S212ConsumptionReconciliationError::WrongCpu);
        }
        Ok(self.pending)
    }
    pub(crate) fn publish(
        &mut self,
        completion: G8lS425S212Completion,
    ) -> Result<(), G8lS425S212ConsumptionReconciliationError> {
        if self.pending.is_some() {
            return Err(G8lS425S212ConsumptionReconciliationError::CompletionSlotOccupied);
        }
        self.pending = Some(completion);
        Ok(())
    }
    pub fn take(
        &mut self,
        caller_cpu: usize,
    ) -> Result<Option<G8lS425S212Completion>, G8lS425S212ConsumptionReconciliationError> {
        if caller_cpu != 1 {
            return Err(G8lS425S212ConsumptionReconciliationError::WrongCpu);
        }
        Ok(self.pending.take())
    }
}

impl Default for G8lS425S212CompletionState {
    fn default() -> Self {
        Self::new()
    }
}

#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum G8lS425S212ConsumptionReconciliationOutcome {
    Idle,
    AwaitingS212Publication,
    CompletionPublished(G8lS425S212Completion),
    CompletionPending(G8lS425S212Completion),
}

#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum G8lS425S212ConsumptionReconciliationError {
    WrongCpu,
    S424(G8lS424ContinuationReceiptError),
    ReceiptBindingDrift,
    UnboundS212Publication,
    ReceiptDisappeared,
    ReceiptDrift,
    CompletionSlotOccupied,
}

fn completion_from_receipt(
    receipt: G8lS424ContinuationReceipt,
) -> Result<G8lS425S212Completion, G8lS425S212ConsumptionReconciliationError> {
    if receipt.attempt_id == 0
        || receipt.provider_request_id == 0
        || receipt.exclusive_token == 0
        || !receipt.s421_envelope_consumed
        || !receipt.s223_to_s212_chain_returned
        || receipt.is_authority
        || receipt.runtime_observed
    {
        return Err(G8lS425S212ConsumptionReconciliationError::ReceiptBindingDrift);
    }
    Ok(G8lS425S212Completion {
        attempt_id: receipt.attempt_id,
        provider_request_id: receipt.provider_request_id,
        exclusive_token: receipt.exclusive_token,
        s212_tuple_consumed: true,
        s211_request_published: true,
        s210_completed: false,
        runtime_observed: false,
    })
}

pub fn service_s425_model_s212_consumption_reconciliation(
    receipts: &mut G8lS424ContinuationReceiptState,
    completions: &mut G8lS425S212CompletionState,
    caller_cpu: usize,
    s212_published: bool,
) -> Result<G8lS425S212ConsumptionReconciliationOutcome, G8lS425S212ConsumptionReconciliationError>
{
    if caller_cpu != 1 {
        return Err(G8lS425S212ConsumptionReconciliationError::WrongCpu);
    }
    if let Some(existing) = completions.pending_completion(caller_cpu)? {
        return Ok(G8lS425S212ConsumptionReconciliationOutcome::CompletionPending(existing));
    }
    let receipt = receipts
        .pending_receipt(caller_cpu)
        .map_err(G8lS425S212ConsumptionReconciliationError::S424)?;
    if !s212_published {
        return Ok(if receipt.is_some() {
            G8lS425S212ConsumptionReconciliationOutcome::AwaitingS212Publication
        } else {
            G8lS425S212ConsumptionReconciliationOutcome::Idle
        });
    }
    let receipt =
        receipt.ok_or(G8lS425S212ConsumptionReconciliationError::UnboundS212Publication)?;
    let completion = completion_from_receipt(receipt)?;
    let taken = receipts
        .take(caller_cpu)
        .map_err(G8lS425S212ConsumptionReconciliationError::S424)?
        .ok_or(G8lS425S212ConsumptionReconciliationError::ReceiptDisappeared)?;
    if taken != receipt {
        return Err(G8lS425S212ConsumptionReconciliationError::ReceiptDrift);
    }
    completions.publish(completion)?;
    Ok(G8lS425S212ConsumptionReconciliationOutcome::CompletionPublished(completion))
}

#[cfg(all(target_arch = "aarch64", target_os = "none", feature = "board-rpi5"))]
static S425_PRODUCTION_COMPLETIONS: spin::Mutex<G8lS425S212CompletionState> =
    spin::Mutex::new(G8lS425S212CompletionState::new());

#[cfg(all(target_arch = "aarch64", target_os = "none", feature = "board-rpi5"))]
pub fn service_s425_s212_consumption_reconciliation_on_cpu1(
    outcome: crate::g8l_target_dispatch_scheduler_owner_scheduler_mutation_production_current_task_runtime_owner_s197_tuple::G8lRuntimeOwnerS197TupleServiceOutcome,
) -> Result<G8lS425S212ConsumptionReconciliationOutcome, G8lS425S212ConsumptionReconciliationError>
{
    use crate::g8l_target_dispatch_scheduler_owner_scheduler_mutation_production_current_task_runtime_owner_s197_tuple::G8lRuntimeOwnerS197TupleServiceOutcome;
    if let Some(existing) = S425_PRODUCTION_COMPLETIONS.lock().pending_completion(1)? {
        return Ok(G8lS425S212ConsumptionReconciliationOutcome::CompletionPending(existing));
    }
    let receipt = crate::g8l_target_dispatch_scheduler_owner_scheduler_mutation_production_migration_lifecycle_s424_continuation_receipt_publication::inspect_s424_continuation_receipt_on_cpu1()
        .map_err(G8lS425S212ConsumptionReconciliationError::S424)?;
    if outcome != G8lRuntimeOwnerS197TupleServiceOutcome::Published {
        return Ok(if receipt.is_some() {
            G8lS425S212ConsumptionReconciliationOutcome::AwaitingS212Publication
        } else {
            G8lS425S212ConsumptionReconciliationOutcome::Idle
        });
    }
    let receipt =
        receipt.ok_or(G8lS425S212ConsumptionReconciliationError::UnboundS212Publication)?;
    let completion = completion_from_receipt(receipt)?;
    let taken = crate::g8l_target_dispatch_scheduler_owner_scheduler_mutation_production_migration_lifecycle_s424_continuation_receipt_publication::take_s424_continuation_receipt_on_cpu1()
        .map_err(G8lS425S212ConsumptionReconciliationError::S424)?
        .ok_or(G8lS425S212ConsumptionReconciliationError::ReceiptDisappeared)?;
    if taken != receipt {
        return Err(G8lS425S212ConsumptionReconciliationError::ReceiptDrift);
    }
    S425_PRODUCTION_COMPLETIONS.lock().publish(completion)?;
    Ok(G8lS425S212ConsumptionReconciliationOutcome::CompletionPublished(completion))
}

#[cfg(all(target_arch = "aarch64", target_os = "none", feature = "board-rpi5"))]
pub fn inspect_s425_s212_completion_on_cpu1(
) -> Result<Option<G8lS425S212Completion>, G8lS425S212ConsumptionReconciliationError> {
    S425_PRODUCTION_COMPLETIONS.lock().pending_completion(1)
}

#[cfg(all(target_arch = "aarch64", target_os = "none", feature = "board-rpi5"))]
pub fn take_s425_s212_completion_on_cpu1(
) -> Result<Option<G8lS425S212Completion>, G8lS425S212ConsumptionReconciliationError> {
    S425_PRODUCTION_COMPLETIONS.lock().take(1)
}
snippet sha256: d38f5b5e18b8file sha256: d38f5b5e18b8
02 · Doğrulayan test kodu

Operations komutuna bağlı focused test

tam dosyaL1–L119
simulation/tests/g8l_target_dispatch_scheduler_owner_scheduler_mutation_production_migration_lifecycle_s425_s212_consumption_reconciliation.rs::S425 s212 consumption reconciliation focused tests
use aselsan_microkernel_simulation::g8l_target_dispatch_scheduler_owner_scheduler_mutation_production_migration_lifecycle_s424_continuation_receipt_publication::{service_s424_model_continuation_receipt_publication, G8lS424ContinuationReceiptState};
use aselsan_microkernel_simulation::g8l_target_dispatch_scheduler_owner_scheduler_mutation_production_migration_lifecycle_s425_s212_consumption_reconciliation::*;

fn receipt() -> G8lS424ContinuationReceiptState {
    let mut state = G8lS424ContinuationReceiptState::new();
    service_s424_model_continuation_receipt_publication(&mut state, 1, 7, 8, 9, None, true)
        .unwrap();
    state
}

#[test]
fn constants_define_one_s212_reconciliation_slot() {
    assert_eq!(S425_S212_COMPLETION_SLOT_CAPACITY, 1);
    assert_eq!(S425_PRODUCTION_RECONCILIATION_CALLSITES, 1);
    assert!(S425_S212_CONSUMPTION_RECONCILIATION_COMPLETE);
    assert!(!S425_S210_COMPLETION_RECONCILIATION_COMPLETE);
}

#[test]
fn exact_s424_receipt_and_s212_publish_create_completion() {
    let mut receipt = receipt();
    let mut completions = G8lS425S212CompletionState::new();
    let outcome =
        service_s425_model_s212_consumption_reconciliation(&mut receipt, &mut completions, 1, true)
            .unwrap();
    let G8lS425S212ConsumptionReconciliationOutcome::CompletionPublished(done) = outcome else {
        panic!("completion")
    };
    assert_eq!(
        (
            done.attempt_id,
            done.provider_request_id,
            done.exclusive_token
        ),
        (7, 8, 9)
    );
    assert!(done.s212_tuple_consumed && done.s211_request_published);
    assert!(!done.s210_completed && !done.runtime_observed);
    assert!(!receipt.pending() && completions.pending());
}

#[test]
fn idle_s212_preserves_s424_receipt() {
    let mut receipt = receipt();
    let mut completions = G8lS425S212CompletionState::new();
    assert_eq!(
        service_s425_model_s212_consumption_reconciliation(
            &mut receipt,
            &mut completions,
            1,
            false
        )
        .unwrap(),
        G8lS425S212ConsumptionReconciliationOutcome::AwaitingS212Publication
    );
    assert!(receipt.pending() && !completions.pending());
}

#[test]
fn s212_publish_without_s424_receipt_fails_closed() {
    let mut receipt = G8lS424ContinuationReceiptState::new();
    let mut completions = G8lS425S212CompletionState::new();
    assert_eq!(
        service_s425_model_s212_consumption_reconciliation(&mut receipt, &mut completions, 1, true),
        Err(G8lS425S212ConsumptionReconciliationError::UnboundS212Publication)
    );
}

#[test]
fn occupied_completion_preserves_next_receipt() {
    let mut first = receipt();
    let mut completions = G8lS425S212CompletionState::new();
    service_s425_model_s212_consumption_reconciliation(&mut first, &mut completions, 1, true)
        .unwrap();
    let pending = completions.pending_completion(1).unwrap().unwrap();
    let mut next = receipt();
    assert_eq!(
        service_s425_model_s212_consumption_reconciliation(&mut next, &mut completions, 1, true)
            .unwrap(),
        G8lS425S212ConsumptionReconciliationOutcome::CompletionPending(pending)
    );
    assert!(next.pending());
}

#[test]
fn production_inspects_s424_before_take_and_maps_exact_s212_outcome() {
    let source = include_str!("../../kernel/src/g8l_target_dispatch_scheduler_owner_scheduler_mutation_production_migration_lifecycle_s425_s212_consumption_reconciliation.rs");
    let start = source
        .find("service_s425_s212_consumption_reconciliation_on_cpu1")
        .unwrap();
    let body = &source[start..];
    let inspect = body
        .find("inspect_s424_continuation_receipt_on_cpu1")
        .unwrap();
    let published = body
        .find("G8lRuntimeOwnerS197TupleServiceOutcome::Published")
        .unwrap();
    let take = body.find("take_s424_continuation_receipt_on_cpu1").unwrap();
    assert!(inspect < published && published < take);
}

#[test]
fn timer_orders_s212_then_s425_then_s210() {
    let source = include_str!("../../kernel/src/arch/aarch64/exceptions.rs");
    let s212 = source
        .find("service_runtime_owner_s197_tuple_from_current_scheduler_task")
        .unwrap();
    let s425 = source
        .find("service_s425_s212_consumption_reconciliation_on_cpu1")
        .unwrap();
    let s210 = source
        .find("service_runtime_owned_current_task_owner_invocation")
        .unwrap();
    assert!(s212 < s425 && s425 < s210);
    let name = "g8l_target_dispatch_scheduler_owner_scheduler_mutation_production_migration_lifecycle_s425_s212_consumption_reconciliation";
    assert!(include_str!("../../kernel/src/main.rs").contains(&format!("mod {name};")));
    assert!(include_str!("../src/lib.rs").contains(&format!("pub mod {name};")));
}
snippet sha256: f5b2fb08c032file sha256: f5b2fb08c032
03 · Kapı kimlik kaydı

Operations sıra, kimlik ve başlık bağı

tam Operations kaydıL508–L524
website/src/lib/operations.ts::g8l-s425-s212-consumption-reconciliation-partial
  {
    id: "g8l-s425-s212-consumption-reconciliation-partial",
    sequence: 425,
    slug: "s212_consumption_reconciliation",
    title: "S212 consumption reconciliation",
    focusedTests: 7,
    sourceBytes: 8973,
    sourceSha256:
      "d38f5b5e18b890e7c38a50b6db59bfd5557cccb9200036f63ea5e46164c3df85",
    testBytes: 4802,
    testSha256:
      "f5b2fb08c032fae5199887c780d819f61209c9205e36cb82f734458314958347",
    acceptance:
      "S424 receipt, continuation'ın S212 ingress tüketimine ulaştığını exact-once reconciliation sonucu ve capacity-one completion ile sabitler.",
    retainedBoundary:
      "S210 terminal completion reconciliation S426'ya ayrılmıştır.",
  },
snippet sha256: 4b5f886ca7d0file sha256: 9726dbf00f84
Focused test komutu
CARGO_INCREMENTAL=0 cargo test -p aselsan_microkernel_simulation --test g8l_target_dispatch_scheduler_owner_scheduler_mutation_production_migration_lifecycle_s425_s212_consumption_reconciliation -- --test-threads=1
proof: docs/M8.1-RPi5-G8l-S425-S212-Consumption-Reconciliation-Proof.md
Registry schema v5 · generator website/scripts/generate-code-gates.mjs · Tam SHA-256: 91d38c7b6222f0b4c117be786454853543da55a160e543d9b951057cc20dcc06