ASELSANMicrokernel
S385 · SOURCE-BOUND GATE EVIDENCE

S385 · QEMU S147 post-revoke Coalesced-signal production writer guard integration

tam production Rust öğesi + exact acquire→release odağı → S247 guard modülü → Operations-bound focused test Bu sayfa yalnız S385 kapısına aittir; komşu kapıların kaynakları bu kabulün içine katılmaz.

S385Production writer guardOperations id exactsource SHA exacttest target exact

operation: g8l-s385-qemu-s147-post-revoke-coalesced-signal-writer-guard-integration-partial

production · S247 guard · focused test · Operations · 4 exact excerpt

sequence-bound=true · implementation-bound=true
01 · Test edilen uygulama/model kodu

Kapının yürüttüğü gerçek kaynak

tam Rust öğesiL11900–L12240kapı odağı L12101–L12116
kernel/src/main.rs::run_qemu_s147_notification_lifecycle
Tam kapsayıcı Rust öğesi gösterilir; vurgulu blok yalnız S385 exact production writer üyeliği sınırıdır. Komşu kod, guard kapsamı iddiası değildir.

/// S147 runtime acceptance: two strict EL0 tasks park on two independently
/// owned notification objects. The first admitted WAIT grant is revoked and
/// its deadline completes as Cancelled. The second object is removed through
/// the controller's ordinary task IPC lifecycle and completes as PeerClosed.
/// Both tasks wake exactly once with InvalidCapability, reject a stale retry,
/// and return their RuntimePmm address spaces to the inherited baseline.
#[cfg(feature = "board-qemu")]
unsafe fn run_qemu_s147_notification_lifecycle(
    baseline_free_frames: u64,
    baseline_active_allocations: usize,
) {
    use crate::elf::load_and_spawn_user_elf_from_boot_runtime_with_arg;
    use crate::elf_plan::{AddressRange, ElfLoadPolicy};
    use crate::ipc_notification::NotificationSignalOutcome;
    use crate::ui::capability::{CapabilityRights, NotificationAuthorityError};
    use crate::userspace_binaries::NOTIFICATION_REVOKED_WAITER_BINARY;

    let controller_task = crate::task::current_task_id().expect("S147 controller task");
    let before_deadlines = crate::ipc::ipc_call_deadline_snapshot();
    assert_eq!(before_deadlines.active, 0);

    let revoke_domain = crate::mm::with_boot_runtime_memory(|memory| {
        memory.register_domain(QEMU_NOTIFICATION_REVOKE_WAITER_RUNTIME_DOMAIN_ID)
    })
    .expect("S147 revoke-waiter RuntimeMemory authority")
    .expect("S147 revoke-waiter domain registration");
    let owner_close_domain = crate::mm::with_boot_runtime_memory(|memory| {
        memory.register_domain(QEMU_NOTIFICATION_OWNER_CLOSE_WAITER_RUNTIME_DOMAIN_ID)
    })
    .expect("S147 owner-close waiter RuntimeMemory authority")
    .expect("S147 owner-close waiter domain registration");
    let revoke_notification = crate::ui::capability::mint_notification(controller_task)
        .expect("S147 revoke notification root");
    let owner_close_notification = crate::ui::capability::mint_notification(controller_task)
        .expect("S147 owner-close notification root");
    let no_forbidden_ranges: [AddressRange; 0] = [];

    let revoke_guard = crate::arch::aarch64::IrqGuard::new();
    let revoke_waiter = load_and_spawn_user_elf_from_boot_runtime_with_arg(
        "notification-revoke-strict-el0-waiter-elf",
        NOTIFICATION_REVOKED_WAITER_BINARY,
        ElfLoadPolicy::new(
            AddressRange::new(0x0430_0000, 0x0431_0000),
            &no_forbidden_ranges,
            16,
        ),
        0x80ce_0000,
        4,
        0,
        8,
        revoke_domain,
        revoke_notification.id,
    )
    .expect("S147 strict grant-revoke waiter spawn");
    let revoke_grant = crate::ui::capability::grant_task_notification_to_task(
        revoke_notification,
        controller_task,
        revoke_waiter.task_id,
        CapabilityRights::NOTIFICATION_WAIT,
    )
    .expect("S147 exact WAIT grant for revoke scenario");
    drop(revoke_guard);
    kprintln!(
        "[K2-S147] grant-revoke waiter strict spawn PASS id={} pages={} domain={} notification={} INITIAL_X0=YES W^X=YES",
        revoke_waiter.task_id,
        revoke_waiter.page_count,
        revoke_domain.id(),
        revoke_notification.id,
    );

    let mut first_parked = false;
    for _ in 0..4096 {
        let deadline = crate::ipc::ipc_call_deadline_snapshot();
        let object_matches = crate::ui::capability::NOTIFICATION_REGISTRY
            .lock()
            .iter()
            .find(|object| object.id() == revoke_notification.id)
            .and_then(|object| object.waiter_snapshot())
            == Some(
                crate::ipc_notification::NotificationWaiter::try_new(
                    revoke_waiter.task_id,
                    revoke_grant.generation,
                    0x3,
                )
                .expect("S147 exact first waiter identity"),
            );
        let blocked = {
            #[cfg(feature = "board-rpi5")]
            let s261_scheduler_read_access = crate::g8l_target_dispatch_scheduler_owner_scheduler_mutation_production_migration_lifecycle_s260_qemu_acceptance_poll_read_access_guard_expansion::acquire_s261_production_scheduler_read_access()
                .unwrap_or_else(|error| panic!("S261 S147 first-waiter poll scheduler read guard failed closed: {:?}", error));
            let blocked = (&*core::ptr::addr_of!(crate::task::scheduler::SCHEDULER))
                .notification_blocked_task_count_on(revoke_waiter.task_id, revoke_notification.id);
            #[cfg(feature = "board-rpi5")]
            drop(s261_scheduler_read_access);
            blocked
        };
        if deadline.active == 1
            && deadline.registered == before_deadlines.registered + 1
            && object_matches
            && blocked == 1
        {
            first_parked = true;
            break;
        }
        crate::task::yield_now();
    }
    assert!(
        first_parked,
        "S147 grant-revoke waiter did not park exactly"
    );

    let owner_close_guard = crate::arch::aarch64::IrqGuard::new();
    let owner_close_waiter = load_and_spawn_user_elf_from_boot_runtime_with_arg(
        "notification-owner-close-strict-el0-waiter-elf",
        NOTIFICATION_REVOKED_WAITER_BINARY,
        ElfLoadPolicy::new(
            AddressRange::new(0x0430_0000, 0x0431_0000),
            &no_forbidden_ranges,
            16,
        ),
        0x80cf_0000,
        4,
        0,
        8,
        owner_close_domain,
        owner_close_notification.id,
    )
    .expect("S147 strict owner-close waiter spawn");
    let owner_close_grant = crate::ui::capability::grant_task_notification_to_task(
        owner_close_notification,
        controller_task,
        owner_close_waiter.task_id,
        CapabilityRights::NOTIFICATION_WAIT,
    )
    .expect("S147 exact WAIT grant for owner-close scenario");
    let spawned = crate::mm::with_boot_runtime_memory(|memory| memory.audited_snapshot())
        .expect("S147 spawned RuntimeMemory authority")
        .expect("S147 spawned RuntimeMemory audit");
    assert_eq!(spawned.pmm.free_frames, baseline_free_frames - 10);
    assert_eq!(spawned.active_allocations, baseline_active_allocations + 10);
    drop(owner_close_guard);
    kprintln!(
        "[K2-S147] owner-close waiter strict spawn PASS id={} pages={} domain={} notification={} INITIAL_X0=YES W^X=YES",
        owner_close_waiter.task_id,
        owner_close_waiter.page_count,
        owner_close_domain.id(),
        owner_close_notification.id,
    );

    let mut both_parked = false;
    for _ in 0..4096 {
        let deadline = crate::ipc::ipc_call_deadline_snapshot();
        let second_matches = crate::ui::capability::NOTIFICATION_REGISTRY
            .lock()
            .iter()
            .find(|object| object.id() == owner_close_notification.id)
            .and_then(|object| object.waiter_snapshot())
            == Some(
                crate::ipc_notification::NotificationWaiter::try_new(
                    owner_close_waiter.task_id,
                    owner_close_grant.generation,
                    0x3,
                )
                .expect("S147 exact second waiter identity"),
            );
        let blocked = {
            #[cfg(feature = "board-rpi5")]
            let s261_scheduler_read_access = crate::g8l_target_dispatch_scheduler_owner_scheduler_mutation_production_migration_lifecycle_s260_qemu_acceptance_poll_read_access_guard_expansion::acquire_s261_production_scheduler_read_access()
                .unwrap_or_else(|error| panic!("S261 S147 second-waiter poll scheduler read guard failed closed: {:?}", error));
            let blocked = (&*core::ptr::addr_of!(crate::task::scheduler::SCHEDULER))
                .notification_blocked_task_count_on(
                    owner_close_waiter.task_id,
                    owner_close_notification.id,
                );
            #[cfg(feature = "board-rpi5")]
            drop(s261_scheduler_read_access);
            blocked
        };
        if deadline.active == 2
            && deadline.registered == before_deadlines.registered + 2
            && second_matches
            && blocked == 1
        {
            both_parked = true;
            break;
        }
        crate::task::yield_now();
    }
    assert!(both_parked, "S147 two notification waits were not admitted");

    assert_eq!(
        crate::ui::capability::revoke_notification_grant(revoke_grant, revoke_waiter.task_id,),
        Ok(true)
    );
    assert_eq!(
        crate::ui::capability::revoke_notification_grant(revoke_grant, revoke_waiter.task_id,),
        Err(NotificationAuthorityError::StaleAuthority)
    );
    #[cfg(all(target_arch = "aarch64", target_os = "none", feature = "board-rpi5"))]
    let s385_irq_guard = crate::arch::aarch64::IrqGuard::new();
    #[cfg(all(target_arch = "aarch64", target_os = "none", feature = "board-rpi5"))]
    let s385_writer_access = crate::g8l_target_dispatch_scheduler_owner_scheduler_mutation_production_migration_lifecycle_s385_qemu_s147_post_revoke_coalesced_signal_writer_guard_integration::acquire_s385_production_scheduler_writer_access()
        .unwrap_or_else(|error| {
            panic!(
                "S385 QEMU S147 post-revoke coalesced-signal scheduler writer guard failed closed: {:?}",
                error
            )
        });
    let s385_coalesced_signal_result =
        (&mut *core::ptr::addr_of_mut!(crate::task::scheduler::SCHEDULER)).notification_signal(
            revoke_notification.id,
            revoke_notification.generation,
            0x8, // exact nonmatching signal bits; keeps the historical alias shape visible
        );
    #[cfg(all(target_arch = "aarch64", target_os = "none", feature = "board-rpi5"))]
    drop(s385_writer_access);
    #[cfg(all(target_arch = "aarch64", target_os = "none", feature = "board-rpi5"))]
    drop(s385_irq_guard);
    assert_eq!(
        s385_coalesced_signal_result,
        Ok(NotificationSignalOutcome::Coalesced { pending: 0x8 })
    );

    let lifecycle = crate::ui::capability::teardown_task_ipc_lifecycle(controller_task)
        .expect("S147 notification owner lifecycle teardown");
    assert_eq!(lifecycle.owned_endpoints, 0);
    assert_eq!(lifecycle.cancelled_responder_calls, 0);
    assert_eq!(lifecycle.drained_calls, 0);
    assert_eq!(lifecycle.owned_notifications, 2);
    assert_eq!(lifecycle.revoked_notification_grants, 1);
    assert_eq!(lifecycle.cancelled_notification_waiters, 1);
    assert_eq!(lifecycle.woken_notification_waiters, 1);
    #[cfg(all(target_arch = "aarch64", target_os = "none", feature = "board-rpi5"))]
    let s384_irq_guard = crate::arch::aarch64::IrqGuard::new();
    #[cfg(all(target_arch = "aarch64", target_os = "none", feature = "board-rpi5"))]
    let s384_writer_access = crate::g8l_target_dispatch_scheduler_owner_scheduler_mutation_production_migration_lifecycle_s384_qemu_s147_post_lifecycle_stale_signal_writer_guard_integration::acquire_s384_production_scheduler_writer_access()
        .unwrap_or_else(|error| {
            panic!(
                "S384 QEMU S147 post-lifecycle stale-signal scheduler writer guard failed closed: {:?}",
                error
            )
        });
    let s384_stale_signal_result =
        (&mut *core::ptr::addr_of_mut!(crate::task::scheduler::SCHEDULER)).notification_signal(
            owner_close_notification.id,
            owner_close_notification.generation,
            0x2,
        );
    #[cfg(all(target_arch = "aarch64", target_os = "none", feature = "board-rpi5"))]
    drop(s384_writer_access);
    #[cfg(all(target_arch = "aarch64", target_os = "none", feature = "board-rpi5"))]
    drop(s384_irq_guard);
    assert_eq!(
        s384_stale_signal_result,
        Err(crate::ipc::IpcError::InvalidCapability)
    );
    assert_eq!(
        crate::ui::capability::destroy_notification_object(
            owner_close_notification,
            controller_task,
        ),
        Err(NotificationAuthorityError::StaleAuthority)
    );

    let mut peers_reclaimed = false;
    for _ in 0..4096 {
        let revoke_quota = crate::mm::with_boot_runtime_memory(|memory| {
            memory.audited_domain_quota(revoke_domain)
        })
        .expect("S147 revoke-domain quota authority")
        .expect("S147 revoke-domain quota audit");
        let owner_close_quota = crate::mm::with_boot_runtime_memory(|memory| {
            memory.audited_domain_quota(owner_close_domain)
        })
        .expect("S147 owner-close quota authority")
        .expect("S147 owner-close quota audit");
        let deadline = crate::ipc::ipc_call_deadline_snapshot();
        if revoke_quota.allocated_frames == 0
            && owner_close_quota.allocated_frames == 0
            && deadline.active == 0
            && deadline.registered == before_deadlines.registered + 2
            && deadline.cancelled == before_deadlines.cancelled + 1
            && deadline.peer_closed == before_deadlines.peer_closed + 1
        {
            peers_reclaimed = true;
            break;
        }
        crate::task::yield_now();
    }
    assert!(
        peers_reclaimed,
        "S147 strict waiters did not reclaim exactly"
    );

    let deadline = crate::ipc::ipc_call_deadline_snapshot();
    assert_eq!(deadline.active, 0);
    assert_eq!(deadline.registered - before_deadlines.registered, 2);
    assert_eq!(deadline.cancelled - before_deadlines.cancelled, 1);
    assert_eq!(deadline.peer_closed - before_deadlines.peer_closed, 1);
    assert_eq!(deadline.timed_out, before_deadlines.timed_out);
    assert_eq!(deadline.delivered, before_deadlines.delivered);
    assert_eq!(deadline.replied, before_deadlines.replied);
    assert!(!crate::ui::capability::NOTIFICATION_REGISTRY
        .lock()
        .iter()
        .any(|object| {
            object.id() == revoke_notification.id || object.id() == owner_close_notification.id
        }));
    assert!(crate::ui::capability::get_live_capability(revoke_notification.id).is_none());
    assert!(crate::ui::capability::get_live_capability(owner_close_notification.id).is_none());

    let final_snapshot = crate::mm::with_boot_runtime_memory(|memory| memory.audited_snapshot())
        .expect("S147 final RuntimeMemory authority")
        .expect("S147 final RuntimeMemory audit");
    assert_eq!(final_snapshot.pmm.free_frames, baseline_free_frames);
    assert_eq!(
        final_snapshot.active_allocations,
        baseline_active_allocations
    );

    kprintln!(
        "[K2-S147] revoke_notification={} owner_close_notification={} revoke_waiter={} owner_close_waiter={} revoke_domain={} owner_close_domain={} ABI=UNCHANGED_V1_3 GRANT_REVOKE=EXACT OWNER_LIFECYCLE=EXACT REGISTERED=2 CANCELLED=1 PEER_CLOSED=1 TIMED_OUT=0 DELIVERED=0 REPLIED=0 REVOKED_WAKE=INVALID_CAPABILITY OWNER_CLOSE_WAKE=INVALID_CAPABILITY STALE_WAIT=REJECTED STALE_SIGNAL=REJECTED NONMATCHING_AFTER_REVOKE=COALESCED EXACT_ONCE=YES BOTH_STRICT=YES RECLAIM=10 OWNED_NOTIFICATION_CLEANUP=2 DERIVED_GRANT_CLEANUP=1 free={}->{}->{} active={}->{}->{} KERNEL_FAULTS=0 EXECUTOR=PASS",
        revoke_notification.id,
        owner_close_notification.id,
        revoke_waiter.task_id,
        owner_close_waiter.task_id,
        revoke_domain.id(),
        owner_close_domain.id(),
        baseline_free_frames,
        spawned.pmm.free_frames,
        final_snapshot.pmm.free_frames,
        baseline_active_allocations,
        spawned.active_allocations,
        final_snapshot.active_allocations,
    );
    run_qemu_s148_notification_race_arbitration(
        final_snapshot.pmm.free_frames,
        final_snapshot.active_allocations,
    );
}
snippet sha256: 87149c0dd235file sha256: 3348a0639f2cfocus sha256: dfa5ca67ed89
02 · Ortak exclusion üyeliği

S247 production writer guard

tam Rust öğesiL208–L220
kernel/src/g8l_target_dispatch_scheduler_owner_scheduler_mutation_production_migration_lifecycle_s385_qemu_s147_post_revoke_coalesced_signal_writer_guard_integration.rs::acquire_s385_production_scheduler_writer_access

#[cfg(all(target_arch = "aarch64", target_os = "none", feature = "board-rpi5"))]
pub fn acquire_s385_production_scheduler_writer_access(
) -> Result<G8lS385ProductionSchedulerWriterAccess, G8lS247WholeSchedulerAccessError> {
    let caller_cpu =
        crate::percpu::try_current_cpu_id().ok_or(G8lS247WholeSchedulerAccessError::InvalidCpu)?;
    if caller_cpu != crate::g8l_runtime_contract::CPU0 {
        return Err(G8lS247WholeSchedulerAccessError::InvalidCpu);
    }
    let access = crate::g8l_target_dispatch_scheduler_owner_scheduler_mutation_production_migration_lifecycle_s246_whole_scheduler_read_access_guard::S247_PRODUCTION_WHOLE_SCHEDULER_ACCESS_GATE
        .try_acquire_exclusive_for_valid_cpu(caller_cpu)?;
    Ok(G8lS385ProductionSchedulerWriterAccess { _access: access })
}
snippet sha256: 83a90e2ab06efile sha256: bb07caa2c099
03 · Doğrulayan test kodu

Operations komutuna bağlı focused test

tam Rust öğesiL518–L530
simulation/tests/g8l_target_dispatch_scheduler_owner_scheduler_mutation_production_migration_lifecycle_s385_qemu_s147_post_revoke_coalesced_signal_writer_guard_integration.rs::boundary_has_exactly_one_s385_acquire_and_release_pair

#[test]
fn boundary_has_exactly_one_s385_acquire_and_release_pair() {
    let boundary = coalesced_signal_boundary();
    assert_eq!(
        boundary
            .matches("acquire_s385_production_scheduler_writer_access")
            .count(),
        1
    );
    assert_eq!(boundary.matches("drop(s385_writer_access)").count(), 1);
    assert_eq!(boundary.matches("drop(s385_irq_guard)").count(), 1);
}
snippet sha256: 6dee4e57e827file sha256: 09abb8e409e3
04 · Kapı kimlik kaydı

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

tam Operations kaydıL7879–L8041
website/src/lib/operations.ts::g8l-s385-qemu-s147-post-revoke-coalesced-signal-writer-guard-integration-partial
  {
    id: "g8l-s385-qemu-s147-post-revoke-coalesced-signal-writer-guard-integration-partial",
    date: "2026-08-29",
    sequence: 385,
    status: "passed",
    umbrella_status: "partial",
    title:
      "S385 · QEMU S147 post-revoke Coalesced-signal production writer guard integration",
    summary:
      "S385, run_qemu_s147_notification_lifecycle içindeki iki explicit mutable scheduler aliasından source-order önce gelenini tek başına kapatır: controller-owned live revoke notification root'unun exact id/generation değeriyle notification_signal(..., 0x8) çağrısı. Nonzero controller identity, controller-owned iki notification root'u, iki strict EL0 WAIT grant'i, iki admitted waiter, iki deadline record'u, exact revoke success ve aynı grant için stale-revoke InvalidCapability reddi writer'dan önce tamamlanır. Dedicated IRQ guard ardından gerçek per-CPU kimliğiyle CPU0-only S385 exclusive writer S384 ve 44 production reader'ın kullandığı aynı statik S247 state word üzerinde alınır. Exact tek mutable SCHEDULER aliası yalnız live revoke root id/generation ile immutable 0x8 signal helper çağrısını kapsar. Owned result önce writer, sonra IRQ release sınırını geçer ve ancak bundan sonra exact Ok(NotificationSignalOutcome::Coalesced { pending: 0x8 }) olarak doğrulanır. Controller lifecycle teardown, exact lifecycle summary ve sonraki S384 owner-close stale-signal membership'i downstream'da kalır. Tarihsel S315 model-level authority audit'i production authority olarak yeniden kullanılmaz; S386 QEMU S143 reply-derived ACK ayrıdır. Guarded writer 58/69, açık writer 11, provider authority 0 ve whole-scheduler exclusion false'dur. S147 fixture board-qemu, production wrapper RPi5-only olduğundan supported-profile direct caller/runtime observation=0 açıkça korunur.",
    evidence: [
      "İlk canonical focused komut ayrı S385 module/source registration, CPU1 coverage service ve production post-revoke Coalesced-signal boundary yokken compile RED verdi; S385 tarihsel S315 kartına veya S384'e topluca eklenmedi.",
      "İlk RED exit 101 verdi; /tmp/aselsanos-s385-initial-red.log 1370 B / 05087527a5e59325de13f7c4c672b0b522bc13ec33b710fbc8954f71eb0660b2 SHA-256'dır.",
      "Geliştirme sırasında rustc 1.100.0-nightly incremental evaluate_obligation fingerprint ICE üretti; bu ürün assertion reddi değildir. /tmp/aselsanos-s385-incremental-ice.log 18451 B / f29646ca32dc2cae86c18ddc18033a2384ffb563559435ac99f1ed44d40e83a0 SHA-256'dır ve sonraki kanonik koşular CARGO_INCREMENTAL=0 ile alındı.",
      "İlk production focused koşusu 46/46 PASS verdi; /tmp/aselsanos-s385-focused-first.log 3780 B / b802eebeea80e867c6898302c07adf77b06862736ec12b0128271be3970205e1 SHA-256'dır.",
      "S385 modülü S384 typed preflight outcome'unu yeniden doğrular; inherited 44 reader + 57 guarded writer + 12 open writer snapshot'ı saparsa InventoryDrift ile fail-closed kapanır.",
      "S385 başarı outcome'u FiftyEighthWriterGuardedAwaitingRemaining'dir ve exact 44 guarded reader + 58/69 guarded writer + 11 open writer envanterini sabitler.",
      "Production wrapper exact target_arch=aarch64, target_os=none, feature=board-rpi5 cfg kesişimindedir; host executor production runtime observation diye sunulmaz.",
      "acquire_s385_production_scheduler_writer_access gerçek try_current_cpu_id sonucunu kullanır; caller-supplied production CPU parametresi yoktur ve CPU0 dışı InvalidCpu verir.",
      "Writer lease S247_PRODUCTION_WHOLE_SCHEDULER_ACCESS_GATE üzerinde try_acquire_exclusive_for_valid_cpu ile alınır; yeni static, ikinci state word veya örtük exclusion domain yaratılmaz.",
      "Host executor callback'i exact bir kez çağırır; canlı reader veya writer callback'ten önce ExclusiveBusy üretir, invalid CPU callback'ten önce fail-closed kapanır ve callback error RAII lease'i exact bırakır.",
      "S384 ve S385 token'ları aynı shared gate üzerinde monoton ve ayrıdır; iki kapı tek transaction, range dispatcher veya toplu membership değildir.",
      "Production S147 sınırında exact iki notification_signal mutable aliası korunur; earlier post-revoke Coalesced alias S385, later owner-close stale alias S384 membership'idir.",
      "Controller identity, iki root, iki strict WAIT grant, iki exact waiter ve iki deadline record'u S385 IRQ/writer acquisition'dan önce source-order assertion'larıyla sabittir.",
      "revoke_notification_grant exact grant/waiter için success verir; aynı stale grant'in ikinci revoke'u InvalidCapability verir ve ikisi de S385 writer'dan önce tamamlanır.",
      "Dedicated IRQ guard writer acquire'dan önce kurulur; acquire_s385_production_scheduler_writer_access, drop(s385_writer_access) ve drop(s385_irq_guard) exact birer kez görünür.",
      "Exact mutable alias revoke_notification.id, revoke_notification.generation ve immutable 0x8 argümanlarıyla notification_signal helper'ını bir kez çağırır.",
      "Owned s385_coalesced_signal_result writer ve IRQ release'ten sonra exact Coalesced { pending: 0x8 } olarak doğrulanır; scheduler referansı veya borrowed sonuç lease dışına taşınmaz.",
      "Controller teardown_task_ipc_lifecycle, exact endpoints/notifications/replies/deadlines/reclaimed summary ve S384 stale-signal acquire/release S385 sonucunun doğrulanmasından sonradır.",
      "Notification helper live object generation, signaling authority, waiter/deadline/CNode ve wake capacity durumunu aynı IPC transaction altında yeniden doğrular; nonmatching 0x8 pending'e coalesce edilir ve matching wake yapılmaz.",
      "Revoke helper exact waiter cancellation, deadline retirement ve derived WAIT grant authority cleanup sırasını writer başlamadan tamamlar; S385 bu önceki etkileri kendi membership'ine dahil etmez.",
      "Tarihsel S315 source assertion'ı direct inline result şekli yerine exact owned-result çağrısı → writer release → IRQ release → Coalesced assertion sözleşmesini doğrulayacak biçimde güçlendirildi; authority ve pending=0x8 expectation'ı gevşetilmedi.",
      "İlk seçili koşuda S314 14/15 RED kaldı çünkü rustfmt exact addr_of_mut!(crate::task::scheduler::SCHEDULER) spelling'ini satırlara ayırmıştı. 0x8 çağrısındaki açıklayıcı yorum historical alias shape'i sabitledi; ürün davranışı ve source inventory değiştirilmeden S314 15/15 oldu.",
      "Final seçili regresyon S314, S315, S376, S382, S383, S384, S385 ve üç notification runtime grubunda 10 grup / 282/282 PASS verdi; log 47707 B / 2bd50a57990d9b7931356657b2f6144d5cf68cf031c1fa5b42282baf3bad6462'dir.",
      "S238–S385 dependency matrisi iki bağımsız seri koşuda 149 grup / 3623/3623 PASS verdi; süre-normalize 32089 B özetler db18eb7e0dfe3c8ab0e2cccb26cdba2ec2183202036679f5265276482b51a0b8 ile byte-exact eşittir.",
      "Dependency artifact root /tmp/aselsanos-s385-dependency.nYF9xH'dir. Ham run1 317056 B / 13ade782d614598e0ee28033d0269d79537143ff0b2cd8b29d35ec2690a4f0f4 ve run2 316952 B / 161088479e1e887b71fad8373a339a9bcc5241268584ed5a39bd73a33abf9d28'dir; timing alanları kabul kimliği yapılmaz.",
      "Exact yedi tarihsel frozen assertion dışındaki workspace 348 result group / 5499 PASS / 0 fail / 7 filtered verdi; filtresiz koşu yalnız frozen S96 source-identity reddinde 301 grup / 5244 PASS / 1 fail ile durdu ve global GREEN iddia edilmez.",
      "Filtered workspace artifact root /tmp/aselsanos-s385-workspace.YepA4Q'dir. Raw log 74264 B / 74b82e45e0989eab9deba60b21e5cb6c4c10b525dd2f571867a84700cdb976d1 ve summary 26328 B / ba067d44745f2a0e4a99fae9c60101470ecc0d3fb5759eb2b726d0a8ebea7875'tir.",
      "Filtresiz workspace raw log 69486 B / 9423679ba24184c3612f6eb94ed5153303620ffb45ae00b9a07ccc8c8a261a81, summary 22802 B / c0cea89a1719d7b12997460af44c65d41cef7d3b45233ac88544f93e64174656'dır. Exit 101 yalnız frozen S96 exceptions.S identity assertion'ındadır; bu red gizlenmez veya yeniden sınıflandırılmaz.",
      "İlk dört successful profile preflight'i workspace kökünden çağrıldığı ve kernel/.cargo/config.toml production bağlamını tüketmediği için kanıt sayılmadı. Yeni canonical target dizinleri kernel çalışma dizininden yeniden üretildi.",
      "Dört fresh canonical AArch64 profil 4/4 exit 0 verdi; qemu/rpi4/rpi5/rpi5+smp warning header sayıları 293/391/1474/1474'tür ve zero-warning iddiası yoktur.",
      "Fresh board-qemu canonical build logu 112254 B / 7fd2954c4728f635404618ef21c1b4f424ac58ddef84b2ac0758048c6eb3d6ce ve 293 warning header; ELF 16813560 B / eadbe36c1281430692e47ed39a0afb276e3b28c05dc45f684925e6ef951c3336'dır. Bu profil S147 fixture'ını compile eder fakat RPi5-only S385 wrapper'ını etkinleştirmez.",
      "Fresh board-rpi4 canonical build logu 150883 B / f401f9566e040f905d316e8649cfa22b0d79a5da7c03c65a016967dddeac7afb ve 391 warning header; ELF 11925384 B / 9b622fc3d80877956f9a0b632b403b19d72992720ddc82d87491ade41b91f076'dır.",
      "Fresh board-rpi5 canonical build logu 645358 B / df7529e666cb0dd412d4f8636b86eb8826d1b58d9935a4a4944590e56e5bb883 ve 1474 warning header; ELF 15251000 B / c1a7eb1ffbd8d38eb522fdec5d0ce1a48e43675bb673a97e192423f74a403602'dır. Wrapper compile olur fakat board-qemu-only caller bulunmadığı için runtime invocation=0'dır.",
      "Fresh board-rpi5+smp canonical build logu 645508 B / e526436123cef39e6e00b7d7df4e628c03a2b214f935617f65265819a972ff4f ve 1474 warning header; ELF 15260688 B / bd43badd2c325ec879516a162d15327de066c528d0dd2b730705cd39689faa3a'dır. Compile success Generic SMP arbitration veya cross-CPU liveness kanıtı değildir.",
      "Dört canonical profil /tmp/aselsanos-s385-profiles.6dKFxG altında birbirinden bağımsız target dizinlerinde CARGO_INCREMENTAL=0 ile alındı; build log ve ELF ölçüleri birbirine karıştırılmaz, release artifact'i kanıta alınmaz.",
      "make verify-qemu 116354 B / f6d2953e5b88ad07d5eff255b0ad8485e6cfa39eb54bc78e3391402a5577b009 ile strict ELF W^X 31/31, S130–S154 + S271, RuntimePmm, EL0 return x4096, IPC 20/20 ve SEC5 PASS verdi; bu S385 runtime invocation değildir.",
      "cargo fmt --all -- --check exit 0 ve boş çıktı verdi; 0 B / e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 SHA-256 ile global format kabulü GREEN'dir.",
      "Focused 46 assertion yalnız sayaç smoke'u değildir: typed S384→S385 preflight, Idle ve exact request, inventory drift, CPU0 success receipt, invalid CPU callback-before-reject, live reader/writer contention, callback error release, S384→S385 token, production cfg/static gate, registrations, exact alias inventory/order, revoke/helper revalidation, owned result/release, downstream S384, CPU1 order ve no-provider/no-range-dispatch sınırlarını ayrı doğrular.",
      "Production source order tam olarak controller/root/grant/wait/deadline admission → exact grant revoke success → stale revoke rejection → s385_irq_guard → s385_writer_access → s385_coalesced_signal_result → writer drop → IRQ drop → exact Coalesced pending 0x8 → controller lifecycle teardown → exact summary → S384 IRQ/writer stale signal → InvalidCapability → final accounting şeklindedir.",
      "S385 exact focus Code kartında yalnız acquire_s385_production_scheduler_writer_access ile drop(s385_writer_access) arasındaki membership yayımlanır; tam production excerpt complete run_qemu_s147_notification_lifecycle Rust öğesidir. Böylece test edilen kod, upstream/downstream bağlamla görünür fakat S384 membership yanlışlıkla S385 focus'una alınmaz.",
      "Status manifesti S385'i S384'ten önce ayrı verification entry ve gate string'i olarak taşır; 44 reader, 58/69 guarded writer, 11 open writer, 149/3623 dependency, 348/5499 workspace, dört canonical profil, provider=0, exclusion=false ve physical=0 alanlarını exact doğrular.",
      "Code yayın hedefi S1–S385 385/385 unique source-bound gate'tir. Kullanıcının ayrıca istediği S328 öncesi S1–S327 aralığı bağımsız 327/327 kontrolüdür; missing=none, duplicate=0 ve S1/S327/S328/S384/S385 exact birer kart olmak zorundadır.",
      "S245 request yalnız non-consuming preflight view ile incelenir; request take edilmez, S244 whole-scheduler admission yayınlanmaz, provider authority oluşturulmaz ve whole-scheduler exclusion uydurulmaz.",
      "CPU1 service S384 coverage service'inden sonra ve tarihsel S242 consumer'dan önce source order'da bağlıdır; bu yalnız coverage/preflight observation'dır, writer veya provider değildir.",
      "İlk source-bound Code registry S1–S385 için 385/385 unique kapı ve 1108 exact excerpt üretti. S328 öncesi S1–S327 bağımsız 327/327 karttır; missing=none, duplicate=0 ve S1/S327/S328/S384/S385 exact birer kezdir. JSON 8522760 B / d0466c8b2ffbaed8beec48556812cd24fd04d3aac758560bb4ac568df53c3cdf dosya SHA-256 ve 2f00a46bc55f0fd4e3cd25346796197ceed996622bd97bdfbb8bbe49e80642b3 registry SHA-256 taşır.",
      "İlk website kabulü 691/691 test, lint PASS, boş çıktılı TypeScript ve 24/24 static page PASS verdi. Export 200 dosya, Timeline/yol-haritasi S385 dahil 224 ayrı gate-policy kartı ve S385 yayın-öncesi çekirdek policy 12863 karakter / 13319 UTF-8 byte'tır.",
      "İlk production/main deployment ff9684c7-98a3-4e30-95d8-da7d0cad7d55 kimliği ve https://ff9684c7.aselsan-microkernel.pages.dev adresiyle 115 upload + 84 existing = 199 asset olarak tamamlandı.",
      "Cache-busted custom-domain /code/ 24010045 B / 8f8465feacc8b3dcb839a476bfa8eaaf0273107784b297b81072fc7b8c8fa306, /operations/ 14250356 B / cd397ae848019c05953155e4bbdc3a35849895870dcb7f649a96cf205799479e, /timeline/ 5804045 B / ed5e41cfb09658c4ce8329bedd388af4db25605ba7073b7e40305dd816a2567e ve /yol-haritasi/ 5803793 B / a38559a9f839a692a7489c736224419feecd07c9aaaeeecb6f8137097f56f086 SHA-256 ile HTTP 200 ve deployment-build yerel out'una raw byte-exact PASS verdi; /code/ Cache-Control no-transform'dur.",
      "İlk canlı /code/ sayımı 385 data-code-gate, pre-S328 327, S1=1, S327=1, S328=1, S384=1 ve S385=1 verdi. Bu gerçek ilk-yayın ölçümleri işlendi; evidence-sync ve closure-sync deployment'ları publication transaction'ının ayrı sonraki aşamalarıdır.",
      "S328 öncesi doğrulama yalnız 327 sayısını saymadı: S1–S327 ascending exact domain'i kuruldu, her sıra için Operations sequence/id/title birebir eşleştirildi, her kartta exact tek Operations excerpt zorunlu tutuldu ve sequence kümesinin unique boyutu 327 olarak doğrulandı. Kalıcı kaynak sahibi kartlar kendi implementation/test/command katmanına bağlandı; kalıcı yürütme kodu olmayan tarihsel olaylara başka kapının Rust kodu yakıştırılmadı ve yalnız exact Operations record'u yayımlandı.",
      "385 kartlık registry sınıflandırması 58 production writer-guard, 225 focused-test, 94 command-contract ve 8 dürüst operation-record kartıdır. Temsilî erken bağlar S1→Makefile command contract, S33→kernel/src/mm/frame_allocator.rs focused implementation, S109→Makefile fail-closed microSD target, S120→yalnız Operations user-report kaydı, S163→simulation/src/g8l_migration.rs, S198→scheduler exclusion modeli ve S327→writer inventory reconciliation kaynaklarıdır; bunların hiçbiri S328+ writer koduyla topluca ikame edilmez.",
      "Code kartları yarım satır penceresi yayımlamaz: Rust kapıları tam öğe, shell/Make kapıları tam fonksiyon veya hedef, operation-only kapılar tam object sınırında kesilir; snippet ve dosya SHA-256 değerleri registry'ye bağlanır. Ortak production fonksiyonu kullanan S365–S385 writer'larında tam Rust öğesi korunurken exact acquire→release membership ayrı focus digest'iyle vurgulanır; böylece komşu S384 kodu S385 guard kapsamı diye sunulmaz.",
      "İlk yayın ölçülerini içeren evidence-sync registry yine S1–S385 385/385 unique kapı, 1108 exact excerpt ve pre-S328 327/327 verdi. Mapping 58 writer-guard + 225 focused-test + 94 command-contract + 8 operation-record = 385'tir; JSON 8526111 B / 2709bfb5030425d1a080bbcedfe78ea9ce6771d9eecba4a2f0980af2a2f59452 dosya SHA-256 ve 57077dd66fd54e3346a44228327c70ccd08406be180fea42e2356e6bd1bb5ab7 registry SHA-256 taşır.",
      "Evidence-sync website kabulü 691/691, lint, boş TypeScript ve 24/24 static page PASS verdi; export 200 dosya ve Timeline 224 karttır. S385 core policy 15698 karakter / 16287 UTF-8 byte ile S384'ün 15484 karakterlik policy'sinden 214 karakter daha uzundur; S385 kanıtı kısa özetleştirilmedi.",
      "Evidence-sync production/main deployment c131cd61-0b03-47bf-af50-8ee36315ece1 kimliği ve https://c131cd61.aselsan-microkernel.pages.dev adresiyle 115 upload + 84 existing = 199 asset yayımladı.",
      "Evidence-sync cache-busted custom-domain /code/ 24016867 B / 64000b8d57bb10d0b892955a54113d2380c40bb3443b05af39f34a8d50dee32c, /operations/ 14262383 B / 09dcb8454dcd5e0ec9c7033eef9f9e97888994c13f360f6c0777e5e388536f43, /timeline/ 5815732 B / 3e69c9c23c5ed85ebd793cb26113486060e3b5ef1911867e75f146c2f40c0e52 ve /yol-haritasi/ 5815480 B / 4f25d4770974ad2f382dd39c53bcadc8bc77f607a99050cdf776246c597f98cd ile HTTP 200 ve yerel out'a raw byte-exact PASS verdi. /code/ no-transform, toplam 385 kart, pre-S328 327 kart ve S1/S327/S328/S384/S385 exact birer kart olarak yeniden doğrulandı.",
      "S385 sırasında fiziksel/device işlem yapılmadı: physical/device operations=0 ve RUNBOOK_EXECUTED_IN_S385=NO.",
      "Bağlayıcı olmayan S385 projeksiyonu R1 S385–S415, R2 S440–S490, R3 S569+, risk aralığı S545–S595 ve merkez yaklaşık S570'tir.",
    ],
    commands: [
      "CARGO_INCREMENTAL=0 cargo test -p aselsan_microkernel_simulation --test g8l_target_dispatch_scheduler_owner_scheduler_mutation_production_migration_lifecycle_s385_qemu_s147_post_revoke_coalesced_signal_writer_guard_integration -- --test-threads=1",
      "run S314, S315, S376, S382, S383, S384, S385 and three notification runtime groups serially",
      "run S238-S385 dependency list twice and normalize timing fields",
      "run filtered and unfiltered serial workspace audits",
      "run four fresh isolated canonical dev AArch64 profile builds from kernel working directory",
      "CARGO_INCREMENTAL=0 make verify-qemu",
      "cargo fmt --all -- --check",
      "npm run code:generate && npm test && npm run lint && npx tsc --noEmit && npm run build",
      "npm run deploy; cache-busted curl + cmp for /code/, /operations/, /timeline/ and /yol-haritasi/",
    ],
    terminalSessions: [
      {
        id: "g8l-s385-focused-source-contract",
        title: "S385 focused post-revoke Coalesced-signal writer membership",
        commandLines: [
          "CARGO_INCREMENTAL=0 cargo test -p aselsan_microkernel_simulation --test g8l_target_dispatch_scheduler_owner_scheduler_mutation_production_migration_lifecycle_s385_qemu_s147_post_revoke_coalesced_signal_writer_guard_integration -- --test-threads=1",
        ],
        outputLines: [
          "initial result: compile RED; S385 module/source/service and production post-revoke boundary missing",
          "nightly incremental fingerprint ICE recorded separately; canonical runs use CARGO_INCREMENTAL=0",
          "first production result: ok; S385 focused 1 group / 46 passed / 0 failed",
          "shared S247 gate: 44 guarded readers + 58/69 guarded writers; 11 writers open",
          "controller/roots/grants/waiters/deadlines/revoke < IRQ < writer < live-root 0x8 signal < writer/IRQ release < Coalesced < lifecycle/S384",
          "supported-profile direct caller/runtime observations=0; provider authority=0; whole exclusion=false",
        ],
        exitCode: 0,
        outputMode: "complete",
      },
      {
        id: "g8l-s385-selected-notification-regression",
        title: "S385 selected revoke/lifecycle/notification regression",
        commandLines: [
          "run S314, S315, S376, S382, S383, S384, S385 and three notification runtime groups serially",
        ],
        outputLines: [
          "initial historical source assertion: S314 14/15 RED after rustfmt alias spelling drift",
          "exact addr_of_mut alias inventory restored without changing S385 owned-result cleanup",
          "S315 assertion strengthened to owned result then writer/IRQ release then exact Coalesced",
          "final result: 10 groups / 282 passed / 0 failed",
        ],
        exitCode: 0,
        outputMode: "complete",
      },
      {
        id: "g8l-s385-full-acceptance",
        title: "S385 four-profile, dependency, workspace and QEMU acceptance",
        commandLines: [
          "run four fresh canonical AArch64 profile builds from kernel working directory",
          "run S238-S385 dependency list twice; run filtered and unfiltered serial workspace audits",
          "CARGO_INCREMENTAL=0 make verify-qemu; cargo fmt --all -- --check",
        ],
        outputLines: [
          "canonical four profiles 4/4 exit 0; log and ELF byte/hash measurements recorded separately",
          "dependency 149 groups / 3623/3623 twice; normalized 32089-byte summaries are SHA-256 identical",
          "filtered workspace 348 groups / 5499 PASS / 7 filtered; unfiltered frozen-S96 remains RED",
          "QEMU W^X 31/31 + S130-S154 + S271 + IPC 20/20 + SEC5 PASS; not an S385 runtime observation",
          "global cargo fmt check exit 0 with empty output",
        ],
        exitCode: 0,
        outputMode: "complete",
      },
      {
        id: "g8l-s385-production-publication",
        title: "S385 Operations/Timeline/Code production publication",
        commandLines: [
          "npm run code:generate && npm test && npm run lint && npx tsc --noEmit && npm run build",
          "npm run deploy",
          "cache-busted curl + cmp for /code/, /operations/, /timeline/ and /yol-haritasi/",
        ],
        outputLines: [
          "initial registry: S1-S385 385/385; pre-S328 S1-S327 327/327; 1108 excerpts; missing=none; duplicate=0",
          "website 691/691; lint, TypeScript and 24/24 static pages PASS; export files=200; Timeline cards=224",
          "initial deployment ff9684c7-98a3-4e30-95d8-da7d0cad7d55; 115 upload + 84 existing",
          "four custom-domain routes HTTP 200 and raw byte-exact=true; /code/ no-transform; S1/S327/S328/S384/S385=1",
          "evidence-sync registry 385/385 + pre-S328 327/327; website 691/691; S385 policy 15698 chars > S384 15484 chars",
          "evidence-sync deployment c131cd61-0b03-47bf-af50-8ee36315ece1; four routes HTTP 200 and raw byte-exact=true",
          "closure-sync remains pending",
        ],
        exitCode: 0,
        outputMode: "complete",
      },
    ],
    terminalSessionsNote:
      "S385 elli sekizinci production writer'ın dar kaynak entegrasyonudur. Yalnız live revoke root'un post-revoke nonmatching 0x8 signal mutation'ı guarded'dır; controller lifecycle ve S384 stale signal ayrı downstream işlemlerdir. Teknik kanıt GREEN, bütün scheduler exclusion ve ürün kabulü PARTIAL'dır.",
    limitations: [
      "11 production writer aynı shared gate dışında kaldığı için whole-scheduler exclusion ve provider authority açık kalır.",
      "Board-qemu S147 fixture ile board-rpi5-only S385 wrapper aynı supported profilde kesişmez; runtime invocation/observation kanıtı yoktur.",
      "Controller lifecycle teardown ve S384 owner-close stale signal S385 membership'ine alınmaz; S386 QEMU S143 reply-derived ACK ayrı sıradaki kapıdır.",
      "Default-parallel PTY determinism, transient-contention liveness/soak, Generic SMP, CPU2/CPU3/hotplug ve fiziksel RPi kabulü açık kalır.",
      "S385 fiziksel/device operasyonu yapmadı; RUNBOOK_EXECUTED_IN_S385=NO.",
    ],
  },
snippet sha256: 92102df51e48file sha256: 9726dbf00f84
Focused test komutu
cargo test -p aselsan_microkernel_simulation --test g8l_target_dispatch_scheduler_owner_scheduler_mutation_production_migration_lifecycle_s385_qemu_s147_post_revoke_coalesced_signal_writer_guard_integration -- --test-threads=1
proof: docs/M8.1-RPi5-G8l-S385-QEMU-S147-Post-Revoke-Coalesced-Signal-Writer-Guard-Integration-Proof.md
Registry schema v5 · generator website/scripts/generate-code-gates.mjs · Tam SHA-256: 91d38c7b6222f0b4c117be786454853543da55a160e543d9b951057cc20dcc06