# K16 — Integrated real-time application and evidence report

K16 composes the wrappers introduced in K08–K15 without adding a new primitive:
StaticTask, StaticQueue, one measured dynamic Queue, EventGroup, SoftwareTimer,
CriticalSection, IsrContext and GpioPin.

The deterministic service graph is:

    startup barrier (producer | processor | reporter = 0x7)
      -> real external IRQ at tick 1 wakes producer and yields once
      -> periodic timer callbacks at ticks 5 and 10
      -> producer -> static input queue -> processor
      -> dynamic report queue -> reporter -> GPIO/evidence report

The pressure phase sends sequences 2 and 3 into a capacity-2 input queue, then
rejects sequence 4 with an explicit drop-newest policy. An end marker blocks
until space is available, proving recovery. The report queue also reaches depth
2. Three transformed values sum to 120.

## Measured report

    static-service heap delta: 0 B
    one dynamic Queue cost:    128 B
    forced allocation failure: returned null, heap unchanged
    timer ticks:               5, 10; then inactive
    input/report queue peaks:  2 / 2
    dropped sequence:          4
    end-to-end latency:        6 ticks
    producer/processor/reporter HWM: 169 / 183 / 189 words
    trace events:              24
    trace digest:              c474ac09

## Build

    make check

This runs the host model, ABI/storage gate and Hazard3 end-to-end simulation.

## Debug

    riscv64-unknown-elf-gdb build/task01_integration/prog.elf
    b integration_debug_checkpoint
    p/x g_barrier_mask
    p g_timer_ticks
    p g_input_queue_peak
    p g_report_queue_peak
    p g_dynamic_queue_heap_cost
    p g_pressure_dropped_sequence
    p g_end_to_end_latency
    p g_producer_hwm
    p g_processor_hwm
    p g_reporter_hwm
    p/x g_trace_digest
    p g_integration_pass

## Design boundary

All long-lived services except the boot-configured report queue use caller-owned
static storage. A deliberately oversized pvPortMalloc request is handled as a
fallible probe; it does not use ordinary operator new and leaves the heap
unchanged. The timer callback and ISR only notify. Queue processing, pressure
recovery, transformation and reporting remain in tasks.
