Fix first: call `logfire.configure()` before you create any spans. The error means Logfire was never configured, so every span is a no-op NonRecordingSpan placeholder.

```text
AttributeError: 'NonRecordingSpan' object has no attribute 'attributes'. Did you mean: 'set_attributes'?
```

1. Call `logfire.configure()` at startup, before any span is created.
2. Then use `span.set_attributes(...)` as normal. Expected: no AttributeError, and attributes land on the span.

When to use: you see NonRecordingSpan errors, typically in tests where configuration never ran.

When not to use: Logfire is already configured and spans record fine (something else is wrong then).

Compatibility: Logfire (Python). Maintainer-identified.

Variants:
- "logfire NonRecordingSpan attributes"
- "logfire span no-op placeholder"
- "Did you mean set_attributes logfire"

Root cause: without configure(), Logfire hands out NonRecordingSpan no-ops, which dont implement the attributes accessor.

Edge cases: in tests, make sure configure() runs before the code under test creates spans. The original report surfaced confusingly because a mock was raising inside a span context manager.