Conversation
Dig-Doug
commented
Feb 17, 2026
Replace flat string labels with first-class Group types that form hierarchical
containers for observations. Groups are observations themselves (ObservationType::Group)
with parent pointers, enabling tree structures like request/response hierarchies.
Add multi-part payload support via ObservationPayloadHandle, allowing observations
to accumulate named payloads over time (e.g., request then response).
Key changes:
- GroupId type, GroupBuilder, GroupHandle, SendGroup in shared/client
- group! macro for creating groups
- ObservationBuilder: .label()/.labels() replaced with .group(&GroupHandle)
- Named payload methods: .named_payload(), .named_debug(), .named_raw_payload()
- AdditionalPayload uploader message for streaming named payloads
- Tracing layer uses GroupHandle::from_id with deterministic span ID mapping
- Axum request observer creates group hierarchies per-request
- All tests updated, server templates updated
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Multi-payload server support with protobuf storage
- Add PayloadId newtype to shared crate for uniquely identifying payloads
- Add prost-based protobuf types for server storage layer
- Rewrite storage traits to support multiple named payloads per observation
- Use sled prefix scan with metadata + inline payload key structure
- Update server API: list returns metadata-only, get returns inline data
- Add new blob route with payload_id param plus legacy route
- Update client to generate and send PayloadId with each payload
- Change multipart field format to {obs_id}:{payload_id}:{name}
- Update all tests for new multi-payload observation model
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Unify payload handling with PayloadBuilder and payload manifest
Remove mime_type/payload_size from Observation struct since these are
per-payload concerns, not observation-level metadata. All payloads now
flow through a single unified path instead of separate primary and
additional payload code paths.
Key changes:
- Add PayloadBuilder for creating named payloads in shared crate
- Replace ObservationWithPayload with separate Observation + Payload
messages in the uploader channel
- Send payload_manifest JSON in multipart uploads so the server gets
authoritative MIME types (falls back to heuristic for old clients)
- Add mime_type/size to GetPayload API response for per-payload metadata
- Fix named_payload sending payload twice (as both primary and additional)
- Update templates to derive type/size from per-payload data
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Grouptypes that form hierarchical containers for observations. Groups are observations themselves (ObservationType::Group) with parent pointers, enabling tree structures like request/response hierarchies.ObservationPayloadHandle, allowing observations to accumulate named payloads over time (e.g., request then response).group!macro,GroupBuilder,GroupHandle,SendGroup, andGroupIdtypes across shared model, macros, and client crates.API Changes
ObservationBuilder:.label()/.labels()removed, replaced with.group(&GroupHandle).named_payload(),.named_debug(),.named_raw_payload()AdditionalPayloaduploader message for streaming named payloads to the serverGroupHandle::from_idwith deterministic span ID → GroupId mappinglabelstogroup_idsTest plan
cargo build --all-features— clean build, no warningscargo test --all-features— all 69 tests pass (unit + integration)group!+observe!().named_payload()against live server🤖 Generated with Claude Code