ASELSANMicrokernel
S570 · SOURCE-BOUND GATE EVIDENCE

S570 · Tekrar üretilebilir RPi5 aday dondurma ve S571 pre-arm

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

S570Focused kod testiOperations id exactsource SHA exacttest target exact

operation: g8l-s570-r1-frozen-manifest-candidate-freeze-prearm-contract

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–L567
kernel/src/g8l_target_dispatch_scheduler_owner_scheduler_mutation_production_migration_lifecycle_s570_r1_frozen_manifest_candidate_freeze_prearm_contract.rs::S570 r1 frozen manifest candidate freeze prearm contract implementation
//! S570 host-only candidate freeze and S571 pre-arm contract.
//!
//! This gate binds two isolated builds of the S569 production remediation,
//! the read-only machine-layout audit, and an immutable four-file RPi5
//! package. It performs no runtime, physical, SD, UART, or power operation.
//! The S571 authorization string is data only: even an exact request leaves
//! execution permission withheld at this gate.

#![allow(dead_code)]

pub const S570_SEQUENCE: usize = 570;
pub const S570_EXPECTED_PREDECESSOR: usize = 569;
pub const S570_NEXT_SEQUENCE: usize = 571;
pub const S570_R1_STAGE: u8 = 1;
pub const S570_SUPPORTED_PROFILE_RUNTIME_OBSERVATIONS: usize = 0;
pub const S570_PHYSICAL_OBSERVATIONS: usize = 0;
pub const S570_PHYSICAL_OR_DEVICE_OPERATIONS: usize = 0;
pub const S570_SD_WRITES: usize = 0;
pub const S570_UART_OPENS: usize = 0;
pub const S570_POWER_TRANSITIONS: usize = 0;
pub const S570_NEW_IMMUTABLE_RAW_CAPTURES: usize = 0;
pub const S570_HARDWARE_PRESENT: bool = false;
pub const S570_BOOT_TO_UI_PHYSICALLY_OBSERVED: bool = false;
pub const S570_R1_ACCEPTANCE_COMPLETE: bool = false;
pub const S570_AUTOMATIC_PROMOTION: bool = false;
pub const S570_EXECUTION_PERMIT: bool = false;
pub const RUNBOOK_EXECUTED_IN_S570: bool = false;

pub const S570_CANDIDATE_PROFILE: &str = "board-rpi5";
pub const S570_CARGO_FEATURE_FLAGS: &str = "--no-default-features --features board-rpi5";
pub const S570_CARGO_INCREMENTAL: u8 = 0;
pub const S570_ISOLATED_BUILD_COUNT: usize = 2;
pub const S570_ELF_BYTES: u64 = 18_537_440;
pub const S570_ELF_SHA256: &str =
    "3260b2e8b0ae80ee65c3ffaaf6db3b675d505bfc1d18502c4067b7ed535071be";
pub const S570_BUILD_A_LOG_BYTES: u64 = 1_699_854;
pub const S570_BUILD_A_LOG_SHA256: &str =
    "921970cb452bf09ffe8ec45c0fdc299d085aad369709198dc9802d6bf3bd80b5";
pub const S570_BUILD_B_LOG_BYTES: u64 = 1_699_854;
pub const S570_BUILD_B_LOG_SHA256: &str =
    "22b7b4333d1d59ba9d279c8b695c1188f48e20fa35e6696d955fa24c77f43322";
pub const S570_BUILD_WARNING_HEADERS_EACH: usize = 4_497;
pub const S570_ZERO_WARNING_CLAIMED: bool = false;
pub const S570_POST_REGISTRATION_REPRO_LOG_BYTES: u64 = 1_699_854;
pub const S570_POST_REGISTRATION_REPRO_LOG_SHA256: &str =
    "ee42becd114aa3e1ec05fb4406da79a3f469cd3922b2edc876550590cd7c1a7c";
pub const S570_POST_REGISTRATION_ELF_IDENTICAL: bool = true;
pub const S570_POST_REGISTRATION_IMAGE_IDENTICAL: bool = true;

pub const S570_IMAGE_BYTES: u64 = 945_920;
pub const S570_IMAGE_SHA256: &str =
    "a24f4d24e838cd7d1a6b2ff217d864e9c4b08f12ce7dd165b302e8073a980b04";
pub const S570_PACKAGE_DIRECTORY: &str = "evidence/rpi5/r1/sequence-570-candidate-freeze/package";
pub const S570_PACKAGE_ENTRIES: usize = 4;
pub const S570_PACKAGE_MODE: u32 = 0o444;
pub const S570_PACKAGE_NLINK: u32 = 1;
pub const S570_IMAGE_NAME: &str = "aselsanos-rpi5.img";
pub const S570_DTB_NAME: &str = "bcm2712-rpi-5-b.dtb";
pub const S570_CONFIG_NAME: &str = "config.txt";
pub const S570_MANIFEST_NAME: &str = "SHA256SUMS";
pub const S570_DTB_BYTES: u64 = 78_703;
pub const S570_DTB_SHA256: &str =
    "40a2fbe9c29e8b9a4912cf726a943068defb779fc052ec38e457a79c58abca00";
pub const S570_CONFIG_BYTES: u64 = 401;
pub const S570_CONFIG_SHA256: &str =
    "f1fd182fec3a6b46639195881b2b452efe019ca88556c58081aff0a05daee865";
pub const S570_MANIFEST_BYTES: u64 = 248;
pub const S570_MANIFEST_SHA256: &str =
    "83e8eb41c5fa0b81f5d05557cc1445c1d9834617126de3b798037e6d96025fe1";
pub const S570_MANIFEST_LINES: usize = 3;

pub const S570_LAYOUT_VERIFIER_PATH: &str = "scripts/verify-rpi5-s570-layout.sh";
pub const S570_LAYOUT_VERIFIER_BYTES: u64 = 11_301;
pub const S570_LAYOUT_VERIFIER_SHA256: &str =
    "f178a3f56027d7499197dcf13e8acd17ceb7b08e32695716540a635342904590";
pub const S570_FREEZE_TOOL_PATH: &str = "scripts/freeze-rpi5-s570-r1-candidate.sh";
pub const S570_FREEZE_TOOL_BYTES: u64 = 10_336;
pub const S570_FREEZE_TOOL_SHA256: &str =
    "2aadd1fa57d6fcc26907701bfe4275357f29bac34f522dc76366709ea83aa22a";
pub const S570_FIRMWARE_CONFIG_PATH: &str = "firmware/config-r1-s570.txt";
pub const S570_FREEZE_LOG_BYTES: u64 = 616;
pub const S570_FREEZE_LOG_SHA256: &str =
    "4c2b3a2a37a84380556d42cfb88ea75f81071656366e288e28b88bf04993120c";

pub const S570_ENTRY_ADDRESS: u64 = 0x80000;
pub const S570_KERNEL_START: u64 = 0x80000;
pub const S570_KERNEL_END: u64 = 0x11f_9000;
pub const S570_LINKED_SPAN: u64 = 18_321_408;
pub const S570_LIVE_LEDGER_G8H_CALLS: usize = 0;
pub const S570_S544_G8H_MODEL_CALLS: usize = 0;
pub const S570_FROZEN_S536_MODEL_CALLS: usize = 1;
pub const S570_S537_G8H_CALLS: usize = 1;
pub const S570_S541_G8H_CALLS: usize = 1;
pub const S570_G8H_ERROR_MARKER_COUNT: usize = 1;
pub const S570_BOOT_TO_UI_LITERAL_COUNT: usize = 2;
pub const S570_FROZEN_MANIFEST_PATH: &str = "status/s431-s535-acceptance-gates.json";
pub const S570_FROZEN_MANIFEST_BYTES: u64 = 88_859;
pub const S570_FROZEN_MANIFEST_SHA256: &str =
    "28d1217b502e63c78c7efeaa47fc6f375ae4d080016f1e4f90a3a98fda075e06";
pub const S570_G8H_ERROR_MARKER: &str = "ASELSAN/G8HERR REPORTER=CPU0 CODE=";

pub const S570_S546_PHYSICAL_VERDICT_RETAINED_RED: bool = true;
pub const S570_S546_RAW_BYTES: u64 = 16_990;
pub const S570_S546_RAW_SHA256: &str =
    "a71a9107b4b6ea351eb65720a6b82486105fffdb931563d1c39e8a381c3e485d";

pub const S570_PREARM_CARD_SERIAL: u32 = 0x425001fa;
pub const S570_PREARM_CARD_RAW_CID: &str = "009f5449534436344761425001fa01a1";
pub const S570_PREARM_CARD_BYTES: u64 = 62_549_655_552;
pub const S570_PREARM_CARD_NAME: &str = "TISD64G";
pub const S570_PREARM_VOLUME_LABEL: &str = "ASELSANBOOT";
pub const S570_PREARM_DEBUG_PROBE_SERIAL: &str = "E6647C74033F9131";
pub const S570_PREARM_SERIAL_PATH_LAST_RESOLVED: &str = "/dev/cu.usbmodem21302";
pub const S570_PREARM_AUTHORIZATION_TOKEN: &str =
    "S571_AUTHORIZE_SD_WRITE_READBACK_EJECT_UART_PREARM_ONE_POWER_ON_a24f4d24_425001fa_62549655552";

#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct G8lS570ArtifactIdentity {
    pub bytes: u64,
    pub sha256: &'static str,
}

#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct G8lS570BuildObservation {
    pub isolated_target_root: bool,
    pub cargo_incremental: u8,
    pub elf: G8lS570ArtifactIdentity,
    pub log: G8lS570ArtifactIdentity,
    pub warning_headers: usize,
}

#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct G8lS570LayoutObservation {
    pub entry: u64,
    pub kernel_start: u64,
    pub kernel_end: u64,
    pub linked_span: u64,
    pub live_ledger_g8h_calls: usize,
    pub s544_g8h_model_calls: usize,
    pub frozen_s536_model_calls: usize,
    pub s537_g8h_calls: usize,
    pub s541_g8h_calls: usize,
    pub s569_state_symbols: usize,
    pub g8h_error_marker_count: usize,
    pub boot_to_ui_literal_count: usize,
    pub manifest_path_count: usize,
    pub manifest_sha_count: usize,
    pub release_acquire_barriers_verified: bool,
    pub inputs_immutable: bool,
}

#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct G8lS570PackageEntryObservation {
    pub name: &'static str,
    pub identity: G8lS570ArtifactIdentity,
    pub mode: u32,
    pub link_count: u32,
    pub inode_id: u64,
}

#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct G8lS570FreezeInput {
    pub predecessor_sequence: usize,
    pub predecessor_passed: bool,
    pub builds: [G8lS570BuildObservation; S570_ISOLATED_BUILD_COUNT],
    pub layout: G8lS570LayoutObservation,
    pub package: [G8lS570PackageEntryObservation; S570_PACKAGE_ENTRIES],
    pub manifest: G8lS570ArtifactIdentity,
    pub layout_verifier: G8lS570ArtifactIdentity,
    pub freeze_tool: G8lS570ArtifactIdentity,
    pub firmware_config: G8lS570ArtifactIdentity,
    pub freeze_log: G8lS570ArtifactIdentity,
}

#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct G8lS570CandidateFreezeReceipt {
    pub sequence: usize,
    pub predecessor_sequence: usize,
    pub build_count: usize,
    pub candidate: G8lS570ArtifactIdentity,
    pub package_manifest: G8lS570ArtifactIdentity,
    pub package_entries: usize,
    pub package_inode_signature: u64,
    pub warning_headers_total: usize,
    pub live_ledger_g8h_calls: usize,
    pub s544_g8h_model_calls: usize,
    pub g8h_error_marker_count: usize,
    pub physical_or_device_operations: usize,
}

#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct G8lS570CandidateFreezeState {
    receipt: Option<G8lS570CandidateFreezeReceipt>,
}

impl G8lS570CandidateFreezeState {
    pub const fn new() -> Self {
        Self { receipt: None }
    }

    pub const fn receipt(&self) -> Option<G8lS570CandidateFreezeReceipt> {
        self.receipt
    }
}

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

#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum G8lS570CandidateFreezeOutcome {
    CandidateFrozen(G8lS570CandidateFreezeReceipt),
    CandidateRetained(G8lS570CandidateFreezeReceipt),
}

#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum G8lS570CandidateFreezeError {
    PredecessorRejected,
    BuildIsolationDrift,
    BuildIdentityDrift,
    BuildLogIdentityDrift,
    WarningHeaderDrift,
    LayoutAddressDrift,
    LiveLedgerCallPresent,
    HistoricalS544CallPresent,
    FrozenCallShapeDrift,
    S569StateMissing,
    MarkerMembershipDrift,
    BarrierOrMutationDrift,
    PackageNameDrift,
    PackageIdentityDrift,
    PackageMetadataDrift,
    PackageInodeDrift,
    ManifestIdentityDrift,
    ToolIdentityDrift,
    FrozenStateDrift,
}

impl G8lS570CandidateFreezeError {
    pub const fn diagnostic_code(self) -> u64 {
        match self {
            Self::PredecessorRejected => 0x5701,
            Self::BuildIsolationDrift => 0x5702,
            Self::BuildIdentityDrift => 0x5703,
            Self::BuildLogIdentityDrift => 0x5704,
            Self::WarningHeaderDrift => 0x5705,
            Self::LayoutAddressDrift => 0x5706,
            Self::LiveLedgerCallPresent => 0x5707,
            Self::HistoricalS544CallPresent => 0x5708,
            Self::FrozenCallShapeDrift => 0x5709,
            Self::S569StateMissing => 0x570a,
            Self::MarkerMembershipDrift => 0x570b,
            Self::BarrierOrMutationDrift => 0x570c,
            Self::PackageNameDrift => 0x570d,
            Self::PackageIdentityDrift => 0x570e,
            Self::PackageMetadataDrift => 0x570f,
            Self::PackageInodeDrift => 0x5710,
            Self::ManifestIdentityDrift => 0x5711,
            Self::ToolIdentityDrift => 0x5712,
            Self::FrozenStateDrift => 0x5713,
        }
    }
}

pub const fn s570_identity(bytes: u64, sha256: &'static str) -> G8lS570ArtifactIdentity {
    G8lS570ArtifactIdentity { bytes, sha256 }
}

const fn str_eq(left: &str, right: &str) -> bool {
    let left = left.as_bytes();
    let right = right.as_bytes();
    if left.len() != right.len() {
        return false;
    }
    let mut index = 0;
    while index < left.len() {
        if left[index] != right[index] {
            return false;
        }
        index += 1;
    }
    true
}

const fn identity_eq(left: G8lS570ArtifactIdentity, right: G8lS570ArtifactIdentity) -> bool {
    left.bytes == right.bytes && str_eq(left.sha256, right.sha256)
}

pub const fn expected_s570_package_identity(name: &str) -> Option<G8lS570ArtifactIdentity> {
    if str_eq(name, S570_IMAGE_NAME) {
        Some(s570_identity(S570_IMAGE_BYTES, S570_IMAGE_SHA256))
    } else if str_eq(name, S570_DTB_NAME) {
        Some(s570_identity(S570_DTB_BYTES, S570_DTB_SHA256))
    } else if str_eq(name, S570_CONFIG_NAME) {
        Some(s570_identity(S570_CONFIG_BYTES, S570_CONFIG_SHA256))
    } else if str_eq(name, S570_MANIFEST_NAME) {
        Some(s570_identity(S570_MANIFEST_BYTES, S570_MANIFEST_SHA256))
    } else {
        None
    }
}

fn check_builds(
    builds: &[G8lS570BuildObservation; S570_ISOLATED_BUILD_COUNT],
) -> Result<(), G8lS570CandidateFreezeError> {
    let expected_elf = s570_identity(S570_ELF_BYTES, S570_ELF_SHA256);
    let expected_logs = [
        s570_identity(S570_BUILD_A_LOG_BYTES, S570_BUILD_A_LOG_SHA256),
        s570_identity(S570_BUILD_B_LOG_BYTES, S570_BUILD_B_LOG_SHA256),
    ];
    let mut index = 0;
    while index < builds.len() {
        let build = builds[index];
        if !build.isolated_target_root || build.cargo_incremental != S570_CARGO_INCREMENTAL {
            return Err(G8lS570CandidateFreezeError::BuildIsolationDrift);
        }
        if !identity_eq(build.elf, expected_elf) {
            return Err(G8lS570CandidateFreezeError::BuildIdentityDrift);
        }
        if !identity_eq(build.log, expected_logs[index]) {
            return Err(G8lS570CandidateFreezeError::BuildLogIdentityDrift);
        }
        if build.warning_headers != S570_BUILD_WARNING_HEADERS_EACH {
            return Err(G8lS570CandidateFreezeError::WarningHeaderDrift);
        }
        index += 1;
    }
    Ok(())
}

fn check_layout(layout: G8lS570LayoutObservation) -> Result<(), G8lS570CandidateFreezeError> {
    if layout.entry != S570_ENTRY_ADDRESS
        || layout.kernel_start != S570_KERNEL_START
        || layout.kernel_end != S570_KERNEL_END
        || layout.linked_span != S570_LINKED_SPAN
        || layout.kernel_end.checked_sub(layout.kernel_start) != Some(layout.linked_span)
    {
        return Err(G8lS570CandidateFreezeError::LayoutAddressDrift);
    }
    if layout.live_ledger_g8h_calls != S570_LIVE_LEDGER_G8H_CALLS {
        return Err(G8lS570CandidateFreezeError::LiveLedgerCallPresent);
    }
    if layout.s544_g8h_model_calls != S570_S544_G8H_MODEL_CALLS {
        return Err(G8lS570CandidateFreezeError::HistoricalS544CallPresent);
    }
    if layout.frozen_s536_model_calls != S570_FROZEN_S536_MODEL_CALLS
        || layout.s537_g8h_calls != S570_S537_G8H_CALLS
        || layout.s541_g8h_calls != S570_S541_G8H_CALLS
    {
        return Err(G8lS570CandidateFreezeError::FrozenCallShapeDrift);
    }
    if layout.s569_state_symbols != 1 {
        return Err(G8lS570CandidateFreezeError::S569StateMissing);
    }
    if layout.g8h_error_marker_count != S570_G8H_ERROR_MARKER_COUNT
        || layout.boot_to_ui_literal_count != S570_BOOT_TO_UI_LITERAL_COUNT
        || layout.manifest_path_count != 1
        || layout.manifest_sha_count != 1
    {
        return Err(G8lS570CandidateFreezeError::MarkerMembershipDrift);
    }
    if !layout.release_acquire_barriers_verified || !layout.inputs_immutable {
        return Err(G8lS570CandidateFreezeError::BarrierOrMutationDrift);
    }
    Ok(())
}

fn check_package(
    package: &[G8lS570PackageEntryObservation; S570_PACKAGE_ENTRIES],
) -> Result<u64, G8lS570CandidateFreezeError> {
    let names = [
        S570_IMAGE_NAME,
        S570_DTB_NAME,
        S570_CONFIG_NAME,
        S570_MANIFEST_NAME,
    ];
    let mut signature = 0u64;
    let mut index = 0;
    while index < package.len() {
        let entry = package[index];
        if !str_eq(entry.name, names[index]) {
            return Err(G8lS570CandidateFreezeError::PackageNameDrift);
        }
        let Some(expected) = expected_s570_package_identity(entry.name) else {
            return Err(G8lS570CandidateFreezeError::PackageNameDrift);
        };
        if !identity_eq(entry.identity, expected) {
            return Err(G8lS570CandidateFreezeError::PackageIdentityDrift);
        }
        if entry.mode != S570_PACKAGE_MODE || entry.link_count != S570_PACKAGE_NLINK {
            return Err(G8lS570CandidateFreezeError::PackageMetadataDrift);
        }
        if entry.inode_id == 0 {
            return Err(G8lS570CandidateFreezeError::PackageInodeDrift);
        }
        let mut prior = 0;
        while prior < index {
            if package[prior].inode_id == entry.inode_id {
                return Err(G8lS570CandidateFreezeError::PackageInodeDrift);
            }
            prior += 1;
        }
        let Some(weighted) = entry.inode_id.checked_mul(index as u64 + 1) else {
            return Err(G8lS570CandidateFreezeError::PackageInodeDrift);
        };
        let Some(next) = signature.checked_add(weighted) else {
            return Err(G8lS570CandidateFreezeError::PackageInodeDrift);
        };
        signature = next;
        index += 1;
    }
    Ok(signature)
}

pub fn service_s570_model_candidate_freeze(
    state: &mut G8lS570CandidateFreezeState,
    input: G8lS570FreezeInput,
) -> Result<G8lS570CandidateFreezeOutcome, G8lS570CandidateFreezeError> {
    if input.predecessor_sequence != S570_EXPECTED_PREDECESSOR || !input.predecessor_passed {
        return Err(G8lS570CandidateFreezeError::PredecessorRejected);
    }
    check_builds(&input.builds)?;
    check_layout(input.layout)?;
    let inode_signature = check_package(&input.package)?;
    if !identity_eq(
        input.manifest,
        s570_identity(S570_MANIFEST_BYTES, S570_MANIFEST_SHA256),
    ) {
        return Err(G8lS570CandidateFreezeError::ManifestIdentityDrift);
    }
    if !identity_eq(
        input.layout_verifier,
        s570_identity(S570_LAYOUT_VERIFIER_BYTES, S570_LAYOUT_VERIFIER_SHA256),
    ) || !identity_eq(
        input.freeze_tool,
        s570_identity(S570_FREEZE_TOOL_BYTES, S570_FREEZE_TOOL_SHA256),
    ) || !identity_eq(
        input.firmware_config,
        s570_identity(S570_CONFIG_BYTES, S570_CONFIG_SHA256),
    ) || !identity_eq(
        input.freeze_log,
        s570_identity(S570_FREEZE_LOG_BYTES, S570_FREEZE_LOG_SHA256),
    ) {
        return Err(G8lS570CandidateFreezeError::ToolIdentityDrift);
    }

    let receipt = G8lS570CandidateFreezeReceipt {
        sequence: S570_SEQUENCE,
        predecessor_sequence: input.predecessor_sequence,
        build_count: S570_ISOLATED_BUILD_COUNT,
        candidate: s570_identity(S570_IMAGE_BYTES, S570_IMAGE_SHA256),
        package_manifest: input.manifest,
        package_entries: S570_PACKAGE_ENTRIES,
        package_inode_signature: inode_signature,
        warning_headers_total: S570_BUILD_WARNING_HEADERS_EACH * S570_ISOLATED_BUILD_COUNT,
        live_ledger_g8h_calls: input.layout.live_ledger_g8h_calls,
        s544_g8h_model_calls: input.layout.s544_g8h_model_calls,
        g8h_error_marker_count: input.layout.g8h_error_marker_count,
        physical_or_device_operations: S570_PHYSICAL_OR_DEVICE_OPERATIONS,
    };
    match state.receipt {
        None => {
            state.receipt = Some(receipt);
            Ok(G8lS570CandidateFreezeOutcome::CandidateFrozen(receipt))
        }
        Some(existing) if existing == receipt => {
            Ok(G8lS570CandidateFreezeOutcome::CandidateRetained(existing))
        }
        Some(_) => Err(G8lS570CandidateFreezeError::FrozenStateDrift),
    }
}

#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct G8lS570S571PrearmRequest<'a> {
    pub sequence: usize,
    pub authorization_token: Option<&'a str>,
    pub candidate: G8lS570ArtifactIdentity,
    pub card_serial: u32,
    pub card_raw_cid: &'a str,
    pub card_bytes: u64,
    pub card_name: &'a str,
    pub volume_label: &'a str,
    pub debug_probe_serial: &'a str,
    pub power_off_asserted: bool,
    pub fresh_target_resolution_required: bool,
    pub fresh_uart_resolution_required: bool,
}

#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum G8lS570S571PrearmOutcome {
    StopNotAuthorized,
    ContractReadyExecutionPermitWithheld {
        sequence: usize,
        execution_permit: bool,
        physical_or_device_operations: usize,
    },
}

#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum G8lS570S571PrearmError {
    SequenceDrift,
    AuthorizationTokenDrift,
    CandidateDrift,
    CardIdentityDrift,
    ProbeIdentityDrift,
    SafetyDisciplineDrift,
}

impl G8lS570S571PrearmError {
    pub const fn diagnostic_code(self) -> u64 {
        match self {
            Self::SequenceDrift => 0x5721,
            Self::AuthorizationTokenDrift => 0x5722,
            Self::CandidateDrift => 0x5723,
            Self::CardIdentityDrift => 0x5724,
            Self::ProbeIdentityDrift => 0x5725,
            Self::SafetyDisciplineDrift => 0x5726,
        }
    }
}

pub fn evaluate_s570_s571_prearm_contract(
    request: Option<G8lS570S571PrearmRequest<'_>>,
) -> Result<G8lS570S571PrearmOutcome, G8lS570S571PrearmError> {
    let Some(request) = request else {
        return Ok(G8lS570S571PrearmOutcome::StopNotAuthorized);
    };
    if request.sequence != S570_NEXT_SEQUENCE {
        return Err(G8lS570S571PrearmError::SequenceDrift);
    }
    if request.authorization_token != Some(S570_PREARM_AUTHORIZATION_TOKEN) {
        return Err(G8lS570S571PrearmError::AuthorizationTokenDrift);
    }
    if !identity_eq(
        request.candidate,
        s570_identity(S570_IMAGE_BYTES, S570_IMAGE_SHA256),
    ) {
        return Err(G8lS570S571PrearmError::CandidateDrift);
    }
    if request.card_serial != S570_PREARM_CARD_SERIAL
        || !str_eq(request.card_raw_cid, S570_PREARM_CARD_RAW_CID)
        || request.card_bytes != S570_PREARM_CARD_BYTES
        || !str_eq(request.card_name, S570_PREARM_CARD_NAME)
        || !str_eq(request.volume_label, S570_PREARM_VOLUME_LABEL)
    {
        return Err(G8lS570S571PrearmError::CardIdentityDrift);
    }
    if !str_eq(request.debug_probe_serial, S570_PREARM_DEBUG_PROBE_SERIAL) {
        return Err(G8lS570S571PrearmError::ProbeIdentityDrift);
    }
    if !request.power_off_asserted
        || !request.fresh_target_resolution_required
        || !request.fresh_uart_resolution_required
    {
        return Err(G8lS570S571PrearmError::SafetyDisciplineDrift);
    }
    Ok(
        G8lS570S571PrearmOutcome::ContractReadyExecutionPermitWithheld {
            sequence: S570_NEXT_SEQUENCE,
            execution_permit: S570_EXECUTION_PERMIT,
            physical_or_device_operations: S570_PHYSICAL_OR_DEVICE_OPERATIONS,
        },
    )
}
snippet sha256: bc5a7b57e939file sha256: bc5a7b57e939
02 · Doğrulayan test kodu

Operations komutuna bağlı focused test

tam dosyaL1–L609
simulation/tests/g8l_target_dispatch_scheduler_owner_scheduler_mutation_production_migration_lifecycle_s570_r1_frozen_manifest_candidate_freeze_prearm_contract.rs::S570 r1 frozen manifest candidate freeze prearm contract focused tests
use aselsan_microkernel_simulation::g8l_target_dispatch_scheduler_owner_scheduler_mutation_production_migration_lifecycle_s570_r1_frozen_manifest_candidate_freeze_prearm_contract::*;
use sha2::{Digest, Sha256};
use std::collections::HashSet;
use std::fs;
use std::os::unix::fs::{MetadataExt, PermissionsExt};
use std::path::{Path, PathBuf};

const SOURCE: &str = include_str!(
    "../../kernel/src/g8l_target_dispatch_scheduler_owner_scheduler_mutation_production_migration_lifecycle_s570_r1_frozen_manifest_candidate_freeze_prearm_contract.rs"
);
const MAIN: &str = include_str!("../../kernel/src/main.rs");
const SIMULATION_LIB: &str = include_str!("../src/lib.rs");
const PACKAGE_IMAGE: &[u8] = include_bytes!(
    "../../evidence/rpi5/r1/sequence-570-candidate-freeze/package/aselsanos-rpi5.img"
);
const PACKAGE_DTB: &[u8] = include_bytes!(
    "../../evidence/rpi5/r1/sequence-570-candidate-freeze/package/bcm2712-rpi-5-b.dtb"
);
const PACKAGE_CONFIG: &[u8] =
    include_bytes!("../../evidence/rpi5/r1/sequence-570-candidate-freeze/package/config.txt");
const PACKAGE_MANIFEST: &[u8] =
    include_bytes!("../../evidence/rpi5/r1/sequence-570-candidate-freeze/package/SHA256SUMS");
const BUILD_A_LOG: &[u8] =
    include_bytes!("../../evidence/rpi5/r1/sequence-570-candidate-freeze/s570-build-a.log");
const BUILD_B_LOG: &[u8] =
    include_bytes!("../../evidence/rpi5/r1/sequence-570-candidate-freeze/s570-build-b.log");
const REPRODUCTION_AUDIT_LOG: &[u8] = include_bytes!(
    "../../evidence/rpi5/r1/sequence-570-candidate-freeze/s570-reproduction-audit.log"
);
const FREEZE_LOG: &[u8] =
    include_bytes!("../../evidence/rpi5/r1/sequence-570-candidate-freeze/s570-freeze.log");
const FIRMWARE_CONFIG: &[u8] = include_bytes!("../../firmware/config-r1-s570.txt");
const LAYOUT_VERIFIER: &[u8] = include_bytes!("../../scripts/verify-rpi5-s570-layout.sh");
const FREEZE_TOOL: &[u8] = include_bytes!("../../scripts/freeze-rpi5-s570-r1-candidate.sh");
const FROZEN_LEDGER_MANIFEST: &[u8] =
    include_bytes!("../../status/s431-s535-acceptance-gates.json");

fn sha256(bytes: &[u8]) -> String {
    format!("{:x}", Sha256::digest(bytes))
}

fn repository_root() -> PathBuf {
    Path::new(env!("CARGO_MANIFEST_DIR")).join("..")
}

fn package_root() -> PathBuf {
    repository_root().join(S570_PACKAGE_DIRECTORY)
}

fn count_bytes(haystack: &[u8], needle: &[u8]) -> usize {
    haystack
        .windows(needle.len())
        .filter(|window| *window == needle)
        .count()
}

fn build(log_bytes: u64, log_sha256: &'static str) -> G8lS570BuildObservation {
    G8lS570BuildObservation {
        isolated_target_root: true,
        cargo_incremental: 0,
        elf: s570_identity(S570_ELF_BYTES, S570_ELF_SHA256),
        log: s570_identity(log_bytes, log_sha256),
        warning_headers: S570_BUILD_WARNING_HEADERS_EACH,
    }
}

fn layout() -> G8lS570LayoutObservation {
    G8lS570LayoutObservation {
        entry: S570_ENTRY_ADDRESS,
        kernel_start: S570_KERNEL_START,
        kernel_end: S570_KERNEL_END,
        linked_span: S570_LINKED_SPAN,
        live_ledger_g8h_calls: 0,
        s544_g8h_model_calls: 0,
        frozen_s536_model_calls: 1,
        s537_g8h_calls: 1,
        s541_g8h_calls: 1,
        s569_state_symbols: 1,
        g8h_error_marker_count: 1,
        boot_to_ui_literal_count: 2,
        manifest_path_count: 1,
        manifest_sha_count: 1,
        release_acquire_barriers_verified: true,
        inputs_immutable: true,
    }
}

fn package_with_inode_base(base: u64) -> [G8lS570PackageEntryObservation; 4] {
    let entry = |name: &'static str, offset: u64| G8lS570PackageEntryObservation {
        name,
        identity: expected_s570_package_identity(name).unwrap(),
        mode: 0o444,
        link_count: 1,
        inode_id: base + offset,
    };
    [
        entry(S570_IMAGE_NAME, 1),
        entry(S570_DTB_NAME, 2),
        entry(S570_CONFIG_NAME, 3),
        entry(S570_MANIFEST_NAME, 4),
    ]
}

fn canonical_input() -> G8lS570FreezeInput {
    G8lS570FreezeInput {
        predecessor_sequence: 569,
        predecessor_passed: true,
        builds: [
            build(S570_BUILD_A_LOG_BYTES, S570_BUILD_A_LOG_SHA256),
            build(S570_BUILD_B_LOG_BYTES, S570_BUILD_B_LOG_SHA256),
        ],
        layout: layout(),
        package: package_with_inode_base(100),
        manifest: s570_identity(S570_MANIFEST_BYTES, S570_MANIFEST_SHA256),
        layout_verifier: s570_identity(S570_LAYOUT_VERIFIER_BYTES, S570_LAYOUT_VERIFIER_SHA256),
        freeze_tool: s570_identity(S570_FREEZE_TOOL_BYTES, S570_FREEZE_TOOL_SHA256),
        firmware_config: s570_identity(S570_CONFIG_BYTES, S570_CONFIG_SHA256),
        freeze_log: s570_identity(S570_FREEZE_LOG_BYTES, S570_FREEZE_LOG_SHA256),
    }
}

fn prearm_request() -> G8lS570S571PrearmRequest<'static> {
    G8lS570S571PrearmRequest {
        sequence: 571,
        authorization_token: Some(S570_PREARM_AUTHORIZATION_TOKEN),
        candidate: s570_identity(S570_IMAGE_BYTES, S570_IMAGE_SHA256),
        card_serial: S570_PREARM_CARD_SERIAL,
        card_raw_cid: S570_PREARM_CARD_RAW_CID,
        card_bytes: S570_PREARM_CARD_BYTES,
        card_name: S570_PREARM_CARD_NAME,
        volume_label: S570_PREARM_VOLUME_LABEL,
        debug_probe_serial: S570_PREARM_DEBUG_PROBE_SERIAL,
        power_off_asserted: true,
        fresh_target_resolution_required: true,
        fresh_uart_resolution_required: true,
    }
}

#[test]
fn sequence_scope_and_all_nonclaims_are_exact() {
    assert_eq!(S570_SEQUENCE, 570);
    assert_eq!(S570_EXPECTED_PREDECESSOR, 569);
    assert_eq!(S570_NEXT_SEQUENCE, 571);
    assert_eq!(S570_R1_STAGE, 1);
    assert_eq!(S570_SUPPORTED_PROFILE_RUNTIME_OBSERVATIONS, 0);
    assert_eq!(S570_PHYSICAL_OBSERVATIONS, 0);
    assert_eq!(S570_PHYSICAL_OR_DEVICE_OPERATIONS, 0);
    assert_eq!(S570_SD_WRITES, 0);
    assert_eq!(S570_UART_OPENS, 0);
    assert_eq!(S570_POWER_TRANSITIONS, 0);
    assert_eq!(S570_NEW_IMMUTABLE_RAW_CAPTURES, 0);
    assert!(!S570_HARDWARE_PRESENT);
    assert!(!S570_BOOT_TO_UI_PHYSICALLY_OBSERVED);
    assert!(!S570_R1_ACCEPTANCE_COMPLETE);
    assert!(!S570_AUTOMATIC_PROMOTION);
    assert!(!S570_EXECUTION_PERMIT);
    assert!(!RUNBOOK_EXECUTED_IN_S570);
    assert!(S570_S546_PHYSICAL_VERDICT_RETAINED_RED);
}

#[test]
fn host_model_is_simulation_registered_and_absent_from_board_kernel() {
    let module = "g8l_target_dispatch_scheduler_owner_scheduler_mutation_production_migration_lifecycle_s570_r1_frozen_manifest_candidate_freeze_prearm_contract";
    assert_eq!(MAIN.matches(&format!("mod {module};")).count(), 0);
    assert_eq!(
        SIMULATION_LIB
            .matches(&format!("pub mod {module};"))
            .count(),
        1
    );
    assert!(!MAIN.contains(module));
    for forbidden in [
        "unsafe {",
        "asm!(",
        "global_asm!(",
        "kprintln!(",
        "diskutil",
        "TIOCEXCL",
        "tcsetattr",
        "std::process",
    ] {
        assert!(
            !SOURCE.contains(forbidden),
            "forbidden surface: {forbidden}"
        );
    }
    assert!(!MAIN.contains("service_s570_model_candidate_freeze("));
}

#[test]
fn all_diagnostic_codes_are_nonzero_and_unique() {
    let freeze_codes = [
        G8lS570CandidateFreezeError::PredecessorRejected,
        G8lS570CandidateFreezeError::BuildIsolationDrift,
        G8lS570CandidateFreezeError::BuildIdentityDrift,
        G8lS570CandidateFreezeError::BuildLogIdentityDrift,
        G8lS570CandidateFreezeError::WarningHeaderDrift,
        G8lS570CandidateFreezeError::LayoutAddressDrift,
        G8lS570CandidateFreezeError::LiveLedgerCallPresent,
        G8lS570CandidateFreezeError::HistoricalS544CallPresent,
        G8lS570CandidateFreezeError::FrozenCallShapeDrift,
        G8lS570CandidateFreezeError::S569StateMissing,
        G8lS570CandidateFreezeError::MarkerMembershipDrift,
        G8lS570CandidateFreezeError::BarrierOrMutationDrift,
        G8lS570CandidateFreezeError::PackageNameDrift,
        G8lS570CandidateFreezeError::PackageIdentityDrift,
        G8lS570CandidateFreezeError::PackageMetadataDrift,
        G8lS570CandidateFreezeError::PackageInodeDrift,
        G8lS570CandidateFreezeError::ManifestIdentityDrift,
        G8lS570CandidateFreezeError::ToolIdentityDrift,
        G8lS570CandidateFreezeError::FrozenStateDrift,
    ];
    let prearm_codes = [
        G8lS570S571PrearmError::SequenceDrift,
        G8lS570S571PrearmError::AuthorizationTokenDrift,
        G8lS570S571PrearmError::CandidateDrift,
        G8lS570S571PrearmError::CardIdentityDrift,
        G8lS570S571PrearmError::ProbeIdentityDrift,
        G8lS570S571PrearmError::SafetyDisciplineDrift,
    ];
    let mut unique = HashSet::new();
    for code in freeze_codes
        .into_iter()
        .map(G8lS570CandidateFreezeError::diagnostic_code)
        .chain(
            prearm_codes
                .into_iter()
                .map(G8lS570S571PrearmError::diagnostic_code),
        )
    {
        assert_ne!(code, 0);
        assert!(unique.insert(code), "duplicate diagnostic 0x{code:x}");
    }
    assert_eq!(unique.len(), 25);
}

#[test]
fn canonical_observation_freezes_the_s569_candidate() {
    let mut state = G8lS570CandidateFreezeState::new();
    let G8lS570CandidateFreezeOutcome::CandidateFrozen(receipt) =
        service_s570_model_candidate_freeze(&mut state, canonical_input()).unwrap()
    else {
        panic!("first exact observation must freeze")
    };
    assert_eq!(receipt.sequence, 570);
    assert_eq!(receipt.predecessor_sequence, 569);
    assert_eq!(receipt.build_count, 2);
    assert_eq!(
        receipt.candidate,
        s570_identity(S570_IMAGE_BYTES, S570_IMAGE_SHA256)
    );
    assert_eq!(receipt.package_entries, 4);
    assert_eq!(receipt.warning_headers_total, 8_994);
    assert_eq!(receipt.live_ledger_g8h_calls, 0);
    assert_eq!(receipt.s544_g8h_model_calls, 0);
    assert_eq!(receipt.g8h_error_marker_count, 1);
    assert_eq!(receipt.physical_or_device_operations, 0);
    assert_eq!(state.receipt(), Some(receipt));
}

#[test]
fn exact_replay_retains_and_valid_different_inodes_fail_closed() {
    let mut state = G8lS570CandidateFreezeState::new();
    let G8lS570CandidateFreezeOutcome::CandidateFrozen(first) =
        service_s570_model_candidate_freeze(&mut state, canonical_input()).unwrap()
    else {
        panic!("first freeze")
    };
    assert_eq!(
        service_s570_model_candidate_freeze(&mut state, canonical_input()),
        Ok(G8lS570CandidateFreezeOutcome::CandidateRetained(first))
    );
    let mut recreated = canonical_input();
    recreated.package = package_with_inode_base(1_000);
    assert_eq!(
        service_s570_model_candidate_freeze(&mut state, recreated),
        Err(G8lS570CandidateFreezeError::FrozenStateDrift)
    );
    assert_eq!(state.receipt(), Some(first));
}

#[test]
fn build_and_predecessor_drift_fail_closed_without_publication() {
    let cases = [
        (0usize, G8lS570CandidateFreezeError::PredecessorRejected),
        (1, G8lS570CandidateFreezeError::BuildIsolationDrift),
        (2, G8lS570CandidateFreezeError::BuildIdentityDrift),
        (3, G8lS570CandidateFreezeError::BuildLogIdentityDrift),
        (4, G8lS570CandidateFreezeError::WarningHeaderDrift),
    ];
    for (case, expected) in cases {
        let mut input = canonical_input();
        match case {
            0 => input.predecessor_passed = false,
            1 => input.builds[0].isolated_target_root = false,
            2 => input.builds[1].elf.bytes += 1,
            3 => input.builds[0].log.sha256 = S570_BUILD_B_LOG_SHA256,
            4 => input.builds[1].warning_headers -= 1,
            _ => unreachable!(),
        }
        let mut state = G8lS570CandidateFreezeState::new();
        assert_eq!(
            service_s570_model_candidate_freeze(&mut state, input),
            Err(expected)
        );
        assert_eq!(state.receipt(), None);
    }
}

#[test]
fn layout_decoupling_and_marker_drift_fail_closed() {
    let cases = [
        (0usize, G8lS570CandidateFreezeError::LayoutAddressDrift),
        (1, G8lS570CandidateFreezeError::LiveLedgerCallPresent),
        (2, G8lS570CandidateFreezeError::HistoricalS544CallPresent),
        (3, G8lS570CandidateFreezeError::FrozenCallShapeDrift),
        (4, G8lS570CandidateFreezeError::S569StateMissing),
        (5, G8lS570CandidateFreezeError::MarkerMembershipDrift),
        (6, G8lS570CandidateFreezeError::BarrierOrMutationDrift),
    ];
    for (case, expected) in cases {
        let mut input = canonical_input();
        match case {
            0 => input.layout.kernel_end += 0x1000,
            1 => input.layout.live_ledger_g8h_calls = 1,
            2 => input.layout.s544_g8h_model_calls = 1,
            3 => input.layout.s537_g8h_calls = 0,
            4 => input.layout.s569_state_symbols = 0,
            5 => input.layout.g8h_error_marker_count = 0,
            6 => input.layout.inputs_immutable = false,
            _ => unreachable!(),
        }
        let mut state = G8lS570CandidateFreezeState::new();
        assert_eq!(
            service_s570_model_candidate_freeze(&mut state, input),
            Err(expected)
        );
    }
}

#[test]
fn package_and_tool_drift_fail_closed() {
    let cases = [
        (0usize, G8lS570CandidateFreezeError::PackageNameDrift),
        (1, G8lS570CandidateFreezeError::PackageIdentityDrift),
        (2, G8lS570CandidateFreezeError::PackageMetadataDrift),
        (3, G8lS570CandidateFreezeError::PackageInodeDrift),
        (4, G8lS570CandidateFreezeError::ManifestIdentityDrift),
        (5, G8lS570CandidateFreezeError::ToolIdentityDrift),
    ];
    for (case, expected) in cases {
        let mut input = canonical_input();
        match case {
            0 => input.package[0].name = S570_DTB_NAME,
            1 => input.package[1].identity.bytes += 1,
            2 => input.package[2].mode = 0o644,
            3 => input.package[3].inode_id = input.package[2].inode_id,
            4 => input.manifest.sha256 = S570_CONFIG_SHA256,
            5 => input.freeze_tool.bytes += 1,
            _ => unreachable!(),
        }
        let mut state = G8lS570CandidateFreezeState::new();
        assert_eq!(
            service_s570_model_candidate_freeze(&mut state, input),
            Err(expected)
        );
    }
}

#[test]
fn frozen_package_files_are_exact_immutable_and_self_verifying() {
    for (bytes, expected_bytes, expected_sha) in [
        (PACKAGE_IMAGE, S570_IMAGE_BYTES, S570_IMAGE_SHA256),
        (PACKAGE_DTB, S570_DTB_BYTES, S570_DTB_SHA256),
        (PACKAGE_CONFIG, S570_CONFIG_BYTES, S570_CONFIG_SHA256),
        (PACKAGE_MANIFEST, S570_MANIFEST_BYTES, S570_MANIFEST_SHA256),
    ] {
        assert_eq!(bytes.len() as u64, expected_bytes);
        assert_eq!(sha256(bytes), expected_sha);
    }
    assert_eq!(PACKAGE_CONFIG, FIRMWARE_CONFIG);
    assert_eq!(
        std::str::from_utf8(PACKAGE_MANIFEST).unwrap(),
        "a24f4d24e838cd7d1a6b2ff217d864e9c4b08f12ce7dd165b302e8073a980b04  aselsanos-rpi5.img\n40a2fbe9c29e8b9a4912cf726a943068defb779fc052ec38e457a79c58abca00  bcm2712-rpi-5-b.dtb\nf1fd182fec3a6b46639195881b2b452efe019ca88556c58081aff0a05daee865  config.txt\n"
    );
    let mut inode_ids = HashSet::new();
    for name in [
        S570_IMAGE_NAME,
        S570_DTB_NAME,
        S570_CONFIG_NAME,
        S570_MANIFEST_NAME,
    ] {
        let metadata = fs::symlink_metadata(package_root().join(name)).unwrap();
        assert!(metadata.is_file(), "{name}");
        assert_eq!(metadata.permissions().mode() & 0o777, 0o444, "{name}");
        assert_eq!(metadata.nlink(), 1, "{name}");
        assert!(inode_ids.insert((metadata.dev(), metadata.ino())), "{name}");
        assert_eq!(
            metadata.len(),
            expected_s570_package_identity(name).unwrap().bytes
        );
    }
    assert_eq!(fs::read_dir(package_root()).unwrap().count(), 4);
}

#[test]
fn image_membership_binds_s569_and_the_bounded_error_line() {
    for (marker, count) in [
        (b"ASELSAN/S541 HANDOFF=CPU1_PREFLIGHT_ARMED".as_slice(), 1),
        (b"ASELSAN/S541ERR".as_slice(), 1),
        (b"[R1:S536] BOOT_TO_UI_READY".as_slice(), 2),
        (b"ASELSAN/S538 ROUTE=PRIOR_BOOT_TO_UI".as_slice(), 1),
        (b"ASELSAN/S538ERR".as_slice(), 1),
        (b"ASELSAN-R1-S538-BOARD-RPI5".as_slice(), 1),
        (b"ASELSAN/BOOT8H".as_slice(), 1),
        (b"ASELSAN/BOOT8G".as_slice(), 1),
        (S570_G8H_ERROR_MARKER.as_bytes(), 1),
        (S570_FROZEN_MANIFEST_PATH.as_bytes(), 1),
        (S570_FROZEN_MANIFEST_SHA256.as_bytes(), 1),
    ] {
        assert_eq!(count_bytes(PACKAGE_IMAGE, marker), count, "{:?}", marker);
    }
    assert_eq!(
        count_bytes(
            PACKAGE_IMAGE,
            b"service_s431_to_s535_production_acceptance_gate_on_cpu1"
        ),
        0
    );
    assert_eq!(
        count_bytes(
            PACKAGE_IMAGE,
            b"service_s544_model_reachable_readiness_producer"
        ),
        0
    );
}

#[test]
fn build_logs_and_freeze_log_have_exact_identities() {
    for (bytes, expected_len, expected_sha) in [
        (BUILD_A_LOG, S570_BUILD_A_LOG_BYTES, S570_BUILD_A_LOG_SHA256),
        (BUILD_B_LOG, S570_BUILD_B_LOG_BYTES, S570_BUILD_B_LOG_SHA256),
        (
            REPRODUCTION_AUDIT_LOG,
            S570_POST_REGISTRATION_REPRO_LOG_BYTES,
            S570_POST_REGISTRATION_REPRO_LOG_SHA256,
        ),
        (FREEZE_LOG, S570_FREEZE_LOG_BYTES, S570_FREEZE_LOG_SHA256),
    ] {
        assert_eq!(bytes.len() as u64, expected_len);
        assert_eq!(sha256(bytes), expected_sha);
    }
    for log in [BUILD_A_LOG, BUILD_B_LOG, REPRODUCTION_AUDIT_LOG] {
        let text = String::from_utf8_lossy(log);
        assert_eq!(
            text.lines()
                .filter(|line| line.starts_with("warning:"))
                .count(),
            4_497
        );
        assert_eq!(
            text.lines()
                .filter(|line| line.starts_with("error:"))
                .count(),
            0
        );
    }
    assert_ne!(S570_BUILD_A_LOG_SHA256, S570_BUILD_B_LOG_SHA256);
    assert!(S570_POST_REGISTRATION_ELF_IDENTICAL);
    assert!(S570_POST_REGISTRATION_IMAGE_IDENTICAL);
    let freeze = std::str::from_utf8(FREEZE_LOG).unwrap();
    assert!(freeze.contains("S570_LAYOUT=PASS"));
    assert!(freeze.contains("S570_CANDIDATE_FREEZE=PASS"));
    assert!(freeze.contains("DEVICE_OPERATIONS=0"));
}

#[test]
fn tools_config_and_frozen_ledger_manifest_are_byte_bound() {
    for (bytes, expected_len, expected_sha) in [
        (
            LAYOUT_VERIFIER,
            S570_LAYOUT_VERIFIER_BYTES,
            S570_LAYOUT_VERIFIER_SHA256,
        ),
        (FREEZE_TOOL, S570_FREEZE_TOOL_BYTES, S570_FREEZE_TOOL_SHA256),
        (FIRMWARE_CONFIG, S570_CONFIG_BYTES, S570_CONFIG_SHA256),
        (
            FROZEN_LEDGER_MANIFEST,
            S570_FROZEN_MANIFEST_BYTES,
            S570_FROZEN_MANIFEST_SHA256,
        ),
    ] {
        assert_eq!(bytes.len() as u64, expected_len);
        assert_eq!(sha256(bytes), expected_sha);
    }
    let manifest: serde_json::Value = serde_json::from_slice(FROZEN_LEDGER_MANIFEST).unwrap();
    assert_eq!(manifest["firstSequence"], 431);
    assert_eq!(manifest["lastSequence"], 535);
    assert_eq!(manifest["gateCount"], 105);
    assert_eq!(manifest["gates"].as_array().unwrap().len(), 105);
}

#[test]
fn host_tools_pin_layout_and_contain_no_physical_execution_command() {
    let layout = std::str::from_utf8(LAYOUT_VERIFIER).unwrap();
    let freeze = std::str::from_utf8(FREEZE_TOOL).unwrap();
    for required in [
        "EXPECTED_ELF_BYTES=18537440",
        "EXPECTED_ELF_SHA256=3260b2e8b0ae80ee65c3ffaaf6db3b675d505bfc1d18502c4067b7ed535071be",
        "EXPECTED_IMAGE_BYTES=945920",
        "EXPECTED_IMAGE_SHA256=a24f4d24e838cd7d1a6b2ff217d864e9c4b08f12ce7dd165b302e8073a980b04",
        "EXPECTED_LINKED_SPAN=18321408",
        "service_s431_to_s535_production_acceptance_gate_on_cpu1 0",
        "service_s544_model_reachable_readiness_producer 0",
        "service_s536_model_r1_physical_boot_uart_evidence_contract 1",
        "ASELSAN/G8HERR REPORTER=CPU0 CODE=",
        "RUNBOOK_EXECUTED_IN_S570=NO",
    ] {
        assert!(layout.contains(required), "{required}");
    }
    for required in [
        "EXPECTED_DTB_BYTES=78703",
        "EXPECTED_CONFIG_BYTES=401",
        "EXPECTED_SUMS_BYTES=248",
        "EXPECTED_PACKAGE_ENTRIES=4",
        "EXPECTED_FILE_MODE=444",
        "S570_CANDIDATE_FREEZE=PASS",
        "DEVICE_OPERATIONS=0 SD_WRITES=0 UART_OPENS=0 POWER_TRANSITIONS=0",
        "/bin/chmod 0444",
        "config-r1-s570.txt",
    ] {
        assert!(freeze.contains(required), "{required}");
    }
    for tool in [layout, freeze] {
        for forbidden in [
            "diskutil",
            "/dev/disk",
            "/dev/cu.",
            "/dev/tty.",
            "TIOCEXCL",
            "stty",
        ] {
            assert!(!tool.contains(forbidden), "{forbidden}");
        }
    }
}

#[test]
fn exact_s571_prearm_request_remains_execution_permit_withheld() {
    assert_eq!(
        evaluate_s570_s571_prearm_contract(Some(prearm_request())),
        Ok(
            G8lS570S571PrearmOutcome::ContractReadyExecutionPermitWithheld {
                sequence: 571,
                execution_permit: false,
                physical_or_device_operations: 0,
            }
        )
    );
    assert_eq!(
        evaluate_s570_s571_prearm_contract(None),
        Ok(G8lS570S571PrearmOutcome::StopNotAuthorized)
    );
}

#[test]
fn s571_prearm_rejects_authority_target_and_safety_drift() {
    let cases = [
        (0usize, G8lS570S571PrearmError::SequenceDrift),
        (1, G8lS570S571PrearmError::AuthorizationTokenDrift),
        (2, G8lS570S571PrearmError::CandidateDrift),
        (3, G8lS570S571PrearmError::CardIdentityDrift),
        (4, G8lS570S571PrearmError::ProbeIdentityDrift),
        (5, G8lS570S571PrearmError::SafetyDisciplineDrift),
    ];
    for (case, expected) in cases {
        let mut request = prearm_request();
        match case {
            0 => request.sequence = 570,
            1 => request.authorization_token = Some("S571_WRONG"),
            2 => request.candidate.bytes += 1,
            3 => request.card_serial ^= 1,
            4 => request.debug_probe_serial = "WRONG",
            5 => request.power_off_asserted = false,
            _ => unreachable!(),
        }
        assert_eq!(
            evaluate_s570_s571_prearm_contract(Some(request)),
            Err(expected)
        );
    }
}

#[test]
fn immutable_s546_red_evidence_is_retained_without_reinterpretation() {
    let raw = fs::read(
        repository_root().join("evidence/rpi5/r1/sequence-546-physical-boot-uart/s546-uart.raw"),
    )
    .unwrap();
    assert_eq!(raw.len() as u64, S570_S546_RAW_BYTES);
    assert_eq!(sha256(&raw), S570_S546_RAW_SHA256);
    assert_eq!(count_bytes(&raw, b"ASELSAN/BOOT8H"), 0);
    assert_eq!(count_bytes(&raw, b"[R1:S536] BOOT_TO_UI_READY"), 0);
    assert_eq!(count_bytes(&raw, b"ASELSAN/G8HERR REPORTER=CPU0"), 0);
    assert!(S570_S546_PHYSICAL_VERDICT_RETAINED_RED);
    assert!(!S570_AUTOMATIC_PROMOTION);
}
snippet sha256: bb34786dcf6cfile sha256: bb34786dcf6c
03 · Kapı kimlik kaydı

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

tam Operations kaydıL1714–L1775
website/src/lib/operations.ts::g8l-s570-r1-frozen-manifest-candidate-freeze-prearm-contract
  {
    id: "g8l-s570-r1-frozen-manifest-candidate-freeze-prearm-contract",
    date: "2026-08-31",
    sequence: 570,
    status: "passed",
    umbrella_status: "partial",
    title: "S570 · Tekrar üretilebilir RPi5 aday dondurma ve S571 pre-arm",
    summary:
      "S570 host-only candidate freeze PASS'tir. S569 üretim payload'ı iki fresh izole target root'ta aynı 18537440 B ELF'i ve aynı 945920 B flat image'i verdi; final source-tree reproduction audit'i de ikisini byte-exact yeniden üretti. Read-only machine/layout verifier live S431–S535 ve tarihsel S544 G8h çağrılarını sıfır, frozen S536 → S537 → S541 zincirini ve bounded G8HERR satırını exact doğruladı. Dört dosyalık paket immutable donduruldu; execution permit=false, fiziksel/device operation=0 ve RUNBOOK_EXECUTED_IN_S570=NO. Focused 16/16 PASS'tir.",
    evidence: [
      "İki isolated CARGO_TARGET_DIR build'i aynı ELF'i üretti: 18537440 B / 3260b2e8b0ae80ee65c3ffaaf6db3b675d505bfc1d18502c4067b7ed535071be.",
      "Build A/B logları 1699854 B ve sırasıyla 921970cb…80b5 / 22b7b433…3322 SHA-256'dır; her biri 4497 warning header içerir, zero-warning iddiası yoktur.",
      "S570 evidence modelinin board kernel dışında simulation-only tutulduğu final source tree yeniden derlendi; reproduction logu 1699854 B / ee42becd114aa3e1ec05fb4406da79a3f469cd3922b2edc876550590cd7c1a7c ve ELF/image byte-exact'tır.",
      "Flat image 945920 B / a24f4d24e838cd7d1a6b2ff217d864e9c4b08f12ce7dd165b302e8073a980b04; entry/start/end 0x80000/0x80000/0x11f9000 ve linked span 18321408'dir.",
      "Layout: live-ledger G8h call=0, S544 G8h call=0, frozen S536/S537/S541 call=1/1/1, S569 state=1 ve ASELSAN/G8HERR exact-once'dur.",
      "Paket image 945920 B, DTB 78703 B, config 401 B ve SHA256SUMS 248 B olmak üzere exact dört regular dosyadır; tümü 0444, nlink=1 ve farklı inode taşır.",
      "Paket kimlikleri image a24f4d24…80b04, DTB 40a2fbe9…ca00, config f1fd182f…e865 ve manifest 83e8eb41…5fe1'dir; manifest read-back PASS'tir.",
      "Layout verifier 11301 B / f178a3f56027d7499197dcf13e8acd17ceb7b08e32695716540a635342904590; freeze tool 10336 B / 2aadd1fa57d6fcc26907701bfe4275357f29bac34f522dc76366709ea83aa22a; config 401 B / f1fd182f…e865'tir.",
      "Focused test 1 grup / 16 passed / 0 failed / 0 ignored / 0 filtered verdi.",
      "Implementation 21754 B / bc5a7b57e939adec1ec56806c80e8989c8912d0d13f6553c2367e3234169e73b; focused test 23231 B / bb34786dcf6c405e86fb366d3f7ee52d9be7321138c7b258deebe4415b210345; proof 6441 B / cbbba172778c600190adf6b5339d0584cce783496e7e2f2b050977ccd42433ef SHA-256'dır.",
      "S546 raw 16990 B / a71a9107…3e485d ve fiziksel RED değişmezdir; yeni fiziksel gözlem yapılmamıştır.",
      "runtime/physical observations=0/0, SD/UART/power/new-raw=0/0/0/0, Boot-to-UI=false, R1=false ve S571 execution permit=false'dur.",
    ],
    commands: [
      "CARGO_INCREMENTAL=0 cargo test -p aselsan_microkernel_simulation --test g8l_target_dispatch_scheduler_owner_scheduler_mutation_production_migration_lifecycle_s570_r1_frozen_manifest_candidate_freeze_prearm_contract -- --test-threads=1",
      "scripts/freeze-rpi5-s570-r1-candidate.sh --verify-package <absolute-package-path>",
    ],
    terminalSessions: [
      {
        id: "s570-focused",
        title: "S570 frozen-candidate focused acceptance",
        commandLines: [
          "CARGO_INCREMENTAL=0 cargo test -p aselsan_microkernel_simulation --test g8l_target_dispatch_scheduler_owner_scheduler_mutation_production_migration_lifecycle_s570_r1_frozen_manifest_candidate_freeze_prearm_contract -- --test-threads=1",
        ],
        outputLines: [
          "test result: ok. 16 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out",
          "candidate=a24f4d24…80b04; physical/device operations=0",
        ],
        exitCode: 0,
        outputMode: "complete",
      },
      {
        id: "s570-package-verify",
        title: "S570 immutable package re-verification",
        commandLines: [
          "scripts/freeze-rpi5-s570-r1-candidate.sh --verify-package <absolute-package-path>",
        ],
        outputLines: [
          "S570_PACKAGE_VERIFY=PASS",
          "four entries; mode=0444; nlink=1; distinct inodes; manifest read-back PASS",
        ],
        exitCode: 0,
        outputMode: "complete",
      },
    ],
    limitations: [
      "S570 yalnız host build/layout/package kanıtıdır; RPi5 runtime veya fiziksel Boot-to-UI gözlemi değildir.",
      "Derleme warning'leri korunur; sıfır warning iddia edilmez.",
      "Exact S571 token'ının sözleşmede bulunması yetki veya execution permit değildir.",
      "RUNBOOK_EXECUTED_IN_S570=NO; physical/device operations=0.",
    ],
  },
snippet sha256: 42f0ca90bf07file 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_s570_r1_frozen_manifest_candidate_freeze_prearm_contract -- --test-threads=1
proof: docs/M8.1-RPi5-G8l-S570-R1-Frozen-Manifest-Candidate-Freeze-Prearm-Contract-Proof.md
Registry schema v5 · generator website/scripts/generate-code-gates.mjs · Tam SHA-256: 91d38c7b6222f0b4c117be786454853543da55a160e543d9b951057cc20dcc06