Passing a prop from one component to another silently delivers nothing. Every prop: arrays, booleans, and plain string attributes alike. Page-to-component passing works correctly, which is what makes this so easy to miss.
Reproduce
<!-- resources/components/PropProbe.stx -->
<script server>
import { defineProps, withDefaults } from 'stx'
interface P { items?: any[], flag?: boolean, text?: string }
const { items, flag, text } = withDefaults(defineProps<P>(), { items: [], flag: false, text: '' })
const count = Array.isArray(items) ? items.length : -1
</script>
<template>
<p data-probe="items= flag= text=function Ca(){return new Sa}"></p>
</template><!-- resources/components/PropWrapper.stx -->
<script server>
import { defineProps, withDefaults } from 'stx'
const { seed } = withDefaults(defineProps<{ seed?: number }>(), { seed: 0 })
const built = [{ a: seed }, { a: seed + 1 }]
</script>
<template>
<PropProbe :items="built" :flag="true" text="from-wrapper" />
</template><!-- resources/views/prop-probe.stx -->
<script server>
const rows = [{ a: 1 }, { a: 2 }, { a: 3 }]
const yes = true
</script>
<template>
<div>
<PropProbe :items="rows" :flag="yes" text="hello" />
<PropWrapper :seed="5" />
</div>
</template>Rendered:
data-probe="items=3 flag=true text=hello" <- from the page: correct
data-probe="items=0 flag=false text=" <- from a component: everything lostThe nested component renders with its defaults. Nothing warns, no error appears in the console or the log, and the page returns 200.
Why it is worth fixing rather than documenting
A shared wrapper component is the normal way to avoid repeating chrome, and this makes that pattern quietly wrong. In our case a ChartFrame component held the title, the empty state and the legend for eight chart components; the legend simply never rendered, on every chart, and the charts looked fine because the plot itself is passed through a slot rather than a prop.
That mattered more than it sounds: the legend is the secondary encoding that makes our categorical palette legal for colour-vision deficiency. So the failure mode was an accessibility regression that looked like a working page.
Contrast with the @foreach diagnostic, which is excellent: when a server loop reads something non-iterable, stx prints a specific message naming the variable and the file. A prop arriving as its default could warn the same way when the parent passed something and the child received nothing.
Environment
@stacksjs/stx as resolved by stacks@0.70.371, Bun 1.3.14, macOS, buddy dev serve path.
Found while building a chart component library in a Stacks app on 2026-08-14.