refactor(sdk)!: delete the @org/package/Type identity grammar and streamlib-idents - #1851
Conversation
A processor is named by its class's import path and nothing else. The grammar that used to name it — `SchemaIdent`, its `Org`/`Package`/`TypeName` segments, `SemVer`, the `@app/local` synthesis, and the `schema_ident!` / `module_ident*!` macro family — had no consumer left once the registry, graph and control plane keyed on the path (#1840). It goes whole, in both authoring languages, along with the `streamlib-idents` crate that held it and the `check-no-reverse-dns` gate that policed it. `@processor` now declares execution, interval, scheduling priority and description only. Every spelling of an authored identity — the leading positional string, `type = "..."` in Rust, the positional argument in Python — refuses with an error naming the class-path rule rather than a bare parse failure. `ProcessorDescriptor.name` carried one live value: the class short name an instance's display name defaults to (ARCHITECTURE.md §Processor model & scheduling). It is re-homed onto a `ProcessorClassShortName` newtype rather than a second bare string, so a transposed `new(...)` fails to compile and a blank name is refused at construction and on the wire. The Rust macro reads the authored struct ident; the wheel reads `cls.__name__`. Neither recovers it by splitting the import path. `channel.rs` was the one non-ident survivor of the deleted crate and moves to `runtime/streamlib-engine/src/iceoryx2/channel_name.rs`, where it can derive its length bound from `PortKey::MAX_NAME_BYTES` instead of duplicating the literal. The reconciliation test that existed only to catch the two constants drifting is deleted; the wire round-trip it stood for moves with the module. `docs/architecture/schema-identity-and-packaging.md` described the deleted grammar and goes with it — #1837 had already struck its packaging half. Closes #1841 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…eams Three seams the deletion has to hold at: - Both authored-identity spellings refuse at real macro expansion, not just at the parser — a caller that reintroduced a positional argument ahead of `parse_body` would pass the unit test and fail these doctests. - Python refuses every spelling the old grammar accepted, and the message names where identity actually comes from. - The default display name is read off the descriptor. The fixture's short name (`Widgetron`) deliberately differs from its import path's tail (`WidgetronImpl`), so an implementation that split the path on `::` yields the wrong label and fails. A fixture where the two coincided would pass under either mechanism. `test_a_class_name_that_is_not_pascal_case_is_accepted` records a real behaviour change: the old grammar refused `class lowercase_name` because it had to fit a `^[A-Z][A-Za-z0-9]*$` type segment. Nothing parses the class name now, and Python never enforced PascalCase to begin with. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Five tests survived the identity strip with their inputs gone but their assertions intact, so they asserted on messages from a grammar this branch deleted. `malformed_identity_is_an_error` and its two siblings collapse into one parametrized refusal covering every spelling the old grammar took — including the ones it rejected for its own reasons, which must not leak a message about a grammar that no longer exists. `missing_execution_is_an_error` and `output_delivery_profile_is_rejected` lost the identity that was only ever scaffolding for the thing they actually test. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
… argument The package segment existed only to build the `SchemaIdent` the fixture no longer constructs. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The change file's REMOVED list retires `ProcessorDescriptor.name` on the basis that the import path is the only identity a descriptor carries. That is true of identity and not true of the field, whose last reader is the display-name default the plan DECIDES is the class's short name. Recording where it went, and why it is a newtype rather than a second bare String, so the next reader does not re-derive the argument from the diff. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…rride Two failures the deletion caused, both the same shape: something asserted a string the old grammar let diverge from the class it named. The engine's mock processors are `MockProcessor` and `MockOutputOnlyProcessor`, but their identities said `TestMockProcessor` and `TestMockOutputOnlyProcessor` — and it was the identity's type segment, not the struct, that fed the default display name. That divergence is exactly what this change removes, so `graph_tests.rs` follows the structs. Pyright reads the wheel's tests, and the decorator's new `type | None` signature makes the negative tests' deliberately-wrong argument a static error before it can produce the runtime refusal they exist to prove. Suppressed at the two call sites, with the reason stated. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- `validate_channel_chunk_charset` uses a `let-else`. The inlining transcribed the old pre-check-plus-`expect` shape verbatim, leaving a panic path in engine library code that the doctrine bans and that the redundant `is_empty()` branch above it already made unreachable. - The attribute's nine keys are enumerated once. The unknown-key error and the class-path refusal both rendered the list, and only the first had a guard test — this branch editing that list to drop `type` is the drift proof. - `InvalidChannelNameCharacter` takes named fields, matching the `ChannelNameTooLong` it now sits beside. - Two fixtures bound a `ProcessorClassShortName` to `id`, which is the confusion the type exists to prevent. - Two helpers that earned their keep building a four-argument `SchemaIdent` are single-use one-line wrappers now, and inline. - A find-and-replace slip named `streamlib-processor-schema` twice in the trunk-ban rationale where `streamlib-idents` was removed. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The two `compile_fail` doctests were vacuous. They wrote
`#[streamlib::processor(...)]`, and there is no such path — the attribute is
re-exported inside `pub mod sdk`. Both passed because the path did not
resolve, so restoring the positional-identity parse would have left them
green. A gate that has never been red for its own reason is not a gate.
Fixed by repointing at `streamlib::sdk::processor`, giving each fixture the
`ManualProcessor` impl it needs to be otherwise-valid, and adding the
control: the same fixture with the identity removed, in a plain ```rust```
block that must COMPILE. Without a positive twin a `compile_fail` block
passes on a typo, which is exactly what happened.
Proven by mutation rather than assertion. Neutering `reject_positional_identity`
and restoring the `type` arm makes both refusals FAIL while the control still
passes:
ProcessorAttributeAcceptsNoIdentity (line 53) ... ok
ProcessorAttributeAcceptsNoIdentity (line 69) - compile fail ... FAILED
ProcessorAttributeAcceptsNoIdentity (line 85) - compile fail ... FAILED
Also from the review:
- `ProcessorDescriptor.version` and `with_version` go, with the control
plane's `ProcessorDescriptorOutput.version`. My earlier note claiming
nothing read the value was wrong: `json_schema.rs` copies it onto the wire
under a field documented as a semantic version string, so deleting its only
writer would have shipped `"version": ""` for every processor. Versions
never live at the code layer, so the field goes rather than acquiring a new
source. Recorded as a REMOVED bullet.
- Two Cargo.toml comments orphaned by the dep lines this branch deleted.
- Out-of-scope rustfmt reflow reverted in four files, worst of it 140 lines
of re-wrapping inside the STOP-WORK placement gate. Only the semantic
edits remain: 142 changed lines there become 2.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
📝 WalkthroughWalkthroughThe change removes authored processor schema identities and semantic versions. Rust and Python processors derive identity from class import paths and use validated short names for display. The ChangesProcessor identity simplification
Estimated code review effort: 4 (Complex) | ~60 minutes Sequence Diagram(s)sequenceDiagram
participant ProcessorClass
participant ProcessorMacro
participant Descriptor
participant Runtime
ProcessorClass->>ProcessorMacro: declare processor without authored identity
ProcessorMacro->>Descriptor: derive short name and import path
Descriptor->>Runtime: register processor metadata
Runtime->>Runtime: derive display names and channel names
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
Actionable comments posted: 1
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
sdk/streamlib-python-wheel/python/streamlib/_processor_declaration.py (1)
111-118: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick winReject
type=with class-path guidance.Line 112 does not accept a
typekeyword. Python raises its generic unexpected-keywordTypeErrorbefore this function can provide the required class-path guidance. This misses the PR requirement for rejectedtypeoverrides.Accept rejected keyword arguments, detect
type, and raise the same import-path guidance used for positional identities. Add a regression test for@processor(type="…").Proposed fix
def processor( processor_class: Optional[type] = None, *, execution: Optional[str] = None, interval_ms: int = 0, scheduling: Optional[str] = None, description: str = "", + **rejected_keywords: Any, ) -> Any: + if "type" in rejected_keywords: + raise TypeError( + "`@processor`(type=...) does not accept an authored identity. " + "A processor is named by the import path of its class, derived " + "from `__module__` and `__qualname__`." + ) + if rejected_keywords: + unexpected = next(iter(rejected_keywords)) + raise TypeError( + f"`@processor`() got an unexpected keyword argument {unexpected!r}" + )🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@sdk/streamlib-python-wheel/python/streamlib/_processor_declaration.py` around lines 111 - 118, Update the processor decorator signature to accept rejected keyword arguments, detect a type keyword, and raise the existing class import-path guidance used for positional identities instead of Python’s generic unexpected-keyword error. Preserve current handling for supported arguments and add a regression test covering `@processor`(type="…").
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@sdk/streamlib-macros/src/grammar.rs`:
- Around line 236-243: Replace the let-chain condition in the config schema ID
inference block with Rust 1.85-compatible nested conditionals or equivalent
control flow, preserving the existing checks for config_schema_id, config_type,
and the final path segment before assigning the identifier. Do not raise the
crate’s minimum Rust version.
---
Outside diff comments:
In `@sdk/streamlib-python-wheel/python/streamlib/_processor_declaration.py`:
- Around line 111-118: Update the processor decorator signature to accept
rejected keyword arguments, detect a type keyword, and raise the existing class
import-path guidance used for positional identities instead of Python’s generic
unexpected-keyword error. Preserve current handling for supported arguments and
add a regression test covering `@processor`(type="…").
🪄 Autofix
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro Plus
Run ID: 21a5b4b7-8853-40eb-8734-e65d91cb5b40
⛔ Files ignored due to path filters (1)
Cargo.lockis excluded by!**/*.lock
📒 Files selected for processing (70)
.github/workflows/check-no-reverse-dns.ymlCargo.tomldocs/architecture/schema-identity-and-packaging.mddocs/plan/changes/processor-class-identity.mdpackages/test-fixtures/processors/compute_kernel_test_processor.rspackages/test-fixtures/processors/concurrent_escalate_test_processor.rspackages/test-fixtures/processors/escalate_smoke_test_processor.rspackages/test-fixtures/processors/gpu_acquire_test_processor.rspackages/test-fixtures/processors/graphics_kernel_smoke_test_processor.rspackages/test-fixtures/processors/lifecycle_probe_processor.rspackages/test-fixtures/processors/panicking_lifecycle_processor.rspackages/test-fixtures/processors/ray_tracing_kernel_smoke_test_processor.rspackages/test-fixtures/processors/test_configured_processor.rsruntime/streamlib-api-server/processors/api_server.rsruntime/streamlib-engine/Cargo.tomlruntime/streamlib-engine/src/core/compiler/compiler_ops/open_iceoryx2_service_op.rsruntime/streamlib-engine/src/core/compiler/scheduling.rsruntime/streamlib-engine/src/core/descriptors.rsruntime/streamlib-engine/src/core/graph/graph_tests.rsruntime/streamlib-engine/src/core/json_schema.rsruntime/streamlib-engine/src/core/processors/processor_instance_factory.rsruntime/streamlib-engine/src/core/runtime/operations.rsruntime/streamlib-engine/src/core/runtime/operations_runtime.rsruntime/streamlib-engine/src/core/test_support.rsruntime/streamlib-engine/src/iceoryx2/channel_name.rsruntime/streamlib-engine/src/iceoryx2/delivery_profile.rsruntime/streamlib-engine/src/iceoryx2/mod.rsruntime/streamlib-engine/src/lib.rsruntime/streamlib-engine/tests/attribute_macro_test.rsruntime/streamlib-engine/tests/connect_typed_errors_test.rsruntime/streamlib-engine/tests/control_plane_processor_type_test.rsruntime/streamlib-engine/tests/display_name_disambiguation_test.rsruntime/streamlib-engine/tests/graph_readiness_signal_test.rsruntime/streamlib-engine/tests/graph_snapshot_round_trip_test.rsruntime/streamlib-engine/tests/processor_class_import_path_test.rsruntime/streamlib-engine/tests/runtime_shutdown_request_ends_run_loop.rsruntime/streamlib-engine/tests/schema_ident_macro_test.rsruntime/streamlib-ipc-types/src/lib.rsruntime/streamlib-media-builtins/src/camera_source.rsruntime/streamlib-media-builtins/src/display_window.rsruntime/streamlib-media-builtins/src/test_pattern_source.rssdk/streamlib-error/src/lib.rssdk/streamlib-idents/Cargo.tomlsdk/streamlib-idents/src/error.rssdk/streamlib-idents/src/ident.rssdk/streamlib-idents/src/lib.rssdk/streamlib-idents/src/semver.rssdk/streamlib-idents/tests/no_parse_api.rssdk/streamlib-macros/Cargo.tomlsdk/streamlib-macros/src/codegen.rssdk/streamlib-macros/src/grammar.rssdk/streamlib-macros/src/lib.rssdk/streamlib-processor-schema/Cargo.tomlsdk/streamlib-processor-schema/src/descriptors.rssdk/streamlib-processor-schema/src/lib.rssdk/streamlib-processor-schema/src/processor_class_short_name.rssdk/streamlib-processor-schema/src/processor_schema.rssdk/streamlib-processor-schema/src/processor_schema_parser.rssdk/streamlib-python-wheel/python/streamlib/_processor_declaration.pysdk/streamlib-python-wheel/src/python_helper_process_spawn_host.rssdk/streamlib-python-wheel/src/python_processor_declaration.rssdk/streamlib-python-wheel/src/python_test_harness_endpoints.rssdk/streamlib-python-wheel/tests/test_processor_declaration.pysdk/streamlib-python-wheel/tests/test_processor_identity.pysdk/streamlib-sdk/src/lib.rssdk/streamlib-sdk/tests/app_sugar_test.rsxtask/src/check_boundaries.rsxtask/src/check_no_in_process_placement.rsxtask/src/check_no_reverse_dns.rsxtask/src/main.rs
💤 Files with no reviewable changes (32)
- Cargo.toml
- sdk/streamlib-idents/src/error.rs
- sdk/streamlib-idents/Cargo.toml
- runtime/streamlib-media-builtins/src/camera_source.rs
- sdk/streamlib-idents/src/lib.rs
- sdk/streamlib-macros/Cargo.toml
- packages/test-fixtures/processors/test_configured_processor.rs
- docs/architecture/schema-identity-and-packaging.md
- packages/test-fixtures/processors/lifecycle_probe_processor.rs
- runtime/streamlib-engine/tests/schema_ident_macro_test.rs
- packages/test-fixtures/processors/escalate_smoke_test_processor.rs
- runtime/streamlib-engine/src/core/test_support.rs
- runtime/streamlib-engine/tests/runtime_shutdown_request_ends_run_loop.rs
- sdk/streamlib-idents/tests/no_parse_api.rs
- sdk/streamlib-python-wheel/src/python_test_harness_endpoints.rs
- xtask/src/check_no_reverse_dns.rs
- sdk/streamlib-idents/src/semver.rs
- runtime/streamlib-engine/Cargo.toml
- runtime/streamlib-media-builtins/src/test_pattern_source.rs
- packages/test-fixtures/processors/ray_tracing_kernel_smoke_test_processor.rs
- packages/test-fixtures/processors/compute_kernel_test_processor.rs
- packages/test-fixtures/processors/graphics_kernel_smoke_test_processor.rs
- packages/test-fixtures/processors/gpu_acquire_test_processor.rs
- runtime/streamlib-media-builtins/src/display_window.rs
- runtime/streamlib-api-server/processors/api_server.rs
- packages/test-fixtures/processors/concurrent_escalate_test_processor.rs
- packages/test-fixtures/processors/panicking_lifecycle_processor.rs
- sdk/streamlib-processor-schema/Cargo.toml
- xtask/src/main.rs
- .github/workflows/check-no-reverse-dns.yml
- sdk/streamlib-idents/src/ident.rs
- runtime/streamlib-engine/src/core/json_schema.rs
| // Name the config type when the author didn't spell an id out. Descriptor | ||
| // metadata only — nothing resolves it. | ||
| if config_schema_id.is_none() | ||
| && let Some(path) = &config_type | ||
| && let Some(last) = path.segments.last() | ||
| { | ||
| config_schema_id = Some(format!( | ||
| "@{}/{}/{}", | ||
| ident.org.as_str(), | ||
| ident.package.as_str(), | ||
| last.ident, | ||
| )); | ||
| config_schema_id = Some(last.ident.to_string()); | ||
| } |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Check declared edition and MSRV for the macro crate and workspace.
fd -t f 'rust-toolchain*' --exec cat {}
fd -t f 'Cargo.toml' -d 1 --exec rg -n 'edition|rust-version' {}
fd -t f 'Cargo.toml' --full-path 'streamlib-macros' --exec rg -n 'edition|rust-version' {}Repository: tatolab/streamlib
Length of output: 304
🏁 Script executed:
#!/bin/bash
set -e
printf '%s\n' '--- Cargo manifests and toolchain files ---'
git ls-files '*Cargo.toml' '*rust-toolchain*' '*rust-toolchain.toml'
printf '%s\n' '--- Workspace and macro manifest declarations ---'
while IFS= read -r f; do
case "$f" in
*streamlib-macros/Cargo.toml|Cargo.toml)
printf '\n[%s]\n' "$f"
rg -n -C 3 '^\[workspace\]|^\[package\]|^edition\s*=|^rust-version\s*=|^workspace\s*=|^members\s*=|^resolver\s*=' "$f" || true
;;
esac
done < <(git ls-files '*Cargo.toml')
printf '%s\n' '--- Toolchain declarations ---'
while IFS= read -r f; do
printf '\n[%s]\n' "$f"
cat -n "$f"
done < <(git ls-files '*rust-toolchain*')
printf '%s\n' '--- Macro source context ---'
cat -n sdk/streamlib-macros/src/grammar.rs | sed -n '228,248p'Repository: tatolab/streamlib
Length of output: 2759
🏁 Script executed:
#!/bin/bash
set -e
printf '%s\n' '--- Root workspace manifest ---'
rg -n -C 4 '^\[workspace\]|^members\s*=|^resolver\s*=|^edition\s*=|^rust-version\s*=' Cargo.toml
printf '%s\n' '--- Macro manifest ---'
cat -n sdk/streamlib-macros/Cargo.toml
printf '%s\n' '--- Toolchain files ---'
for f in rust-toolchain rust-toolchain.toml; do
if [ -f "$f" ]; then
printf '\n[%s]\n' "$f"
cat -n "$f"
fi
done
printf '%s\n' '--- Source context ---'
cat -n sdk/streamlib-macros/src/grammar.rs | sed -n '232,246p'Repository: tatolab/streamlib
Length of output: 2577
🌐 Web query:
Rust 1.88 let chains stabilized edition 2024 release notes
💡 Result:
The "let chains" feature was stabilized in Rust 1.88.0, which was released on June 26, 2025 [1][2][3]. Key details regarding this stabilization include: Edition Requirement: The feature is stabilized specifically for the Rust 2024 edition [4][1][5]. Using "let chains" in earlier editions (such as 2021) will result in a compiler error [6][7]. Functionality: This feature allows the use of &&-chaining with let statements inside if and while expressions, enabling them to be intermixed with boolean expressions [4][3]. The patterns used within these let sub-expressions can be either refutable or irrefutable [4][1][3]. Feature Gate Status: Following the initial stabilization in 1.88.0, the unstable feature gate was subsequently removed and replaced with a formal error message for older editions in later updates [6][7]. For developers encountering errors when attempting to use let chains, the recommended solution is to ensure the project is using the 2024 edition [8].
Citations:
- 1: https://rust.googlesource.com/rust/+/refs/tags/1.88.0/RELEASES.md
- 2: https://blog.rust-lang.org/2025/06/26/Rust-1.88.0/
- 3: https://releases.rs/docs/1.88.0/
- 4: https://doc.rust-lang.org/stable/releases.html
- 5: Stabilize let chains in the 2024 edition rust-lang/rust#132833
- 6: let_chains stabilization followups rust-lang/rust#140722
- 7: Remove let_chains unstable feature rust-lang/rust#143214
- 8: Tracking issue for eRFC 2497, "if- and while-let-chains, take 2" rust-lang/rust#53667
Support the declared Rust version. The workspace declares rust-version = "1.85", but this crate uses let chains, which require Rust 1.88 in edition 2024. Replace the let chain or raise and inherit the crate’s minimum Rust version.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@sdk/streamlib-macros/src/grammar.rs` around lines 236 - 243, Replace the
let-chain condition in the config schema ID inference block with Rust
1.85-compatible nested conditionals or equivalent control flow, preserving the
existing checks for config_schema_id, config_type, and the final path segment
before assigning the identifier. Do not raise the crate’s minimum Rust version.
Summary
A processor is named by its class's import path and nothing else. The grammar that used to name it had no consumer left once #1840 keyed the registry, graph and control plane on the path, so it goes whole — from both authoring languages, from the macros, from the xtask gate that policed it, and finally the crate that held it.
Deleted:
SchemaIdentwith itsOrg/Package/TypeName/PackageRef/ModuleIdentsegments,SemVer/SemVerRange/Prerelease, the@app/localsynthesis in both languages, theschema_ident!andmodule_ident*!macro family,VERSION_FREE_SENTINEL, thesdk/streamlib-identscrate and its three dependents' dep lines,check-no-reverse-dnsand its workflow, anddocs/architecture/schema-identity-and-packaging.md.@processornow declares execution, interval, scheduling priority and description only. Every spelling of an authored identity — the leading positional string,type = "..."in Rust, the positional argument in Python — refuses with an error naming the class-path rule rather than a bare parse failure, andtypeis gone from the Rust unknown-key list.71 files, +736 / −4119.
The one thing that was not a pure deletion
ProcessorDescriptor.namecarried one live value: the class short name an instance's display name defaults to (ARCHITECTURE.md§Processor model & scheduling). #1840's handoff comment flagged this and closed both routes out — splitting the import path re-invents the deleted grammar, and changing the default is a plan change. So the short name is re-homed onto aProcessorClassShortNamenewtype instreamlib-processor-schema, sibling to theProcessorClassImportPath#1840 built.A newtype rather than a second bare
StringbecauseProcessorDescriptor::newhad exactly oneimpl Into<String>parameter, and a second one re-opens the argument-swap hazard #1840 closed by typing the import path — 13 of the 15 construction sites are fixtures passing throwaway strings, which is where a transposed call is least likely to be noticed. Non-emptiness is the whole rule: neither Python nor Rust enforces PascalCase on a class name, so a stricter grammar would refuse legal classes.Deserializeis hand-written so a wire""cannot bypass the constructor and silently blank every display name.The Rust macro reads the authored struct ident; the wheel reads
cls.__name__. Neither recovers it by splitting the import path.Channel names
channel.rswas the one non-ident survivor and moves toruntime/streamlib-engine/src/iceoryx2/channel_name.rs, where it derivesMAX_CHANNEL_NAME_BYTESfromPortKey::MAX_NAME_BYTESinstead of duplicating the literal — the duplication existed only becausestreamlib-identscould not depend onstreamlib-ipc-types. Its fourIdentErrorchannel variants fold into the coreError.The reconciliation test that existed only to catch the two constants drifting is deleted; once the bound is the constant, asserting they are equal is
assert_eq!(X, X). The wire round-trip it stood proxy for moves with the module.Closes
Closes #1841
Exit criteria
@processorin either language accepts an identity, atype =override, or any@org/package/Typestring; passing one errors naming the class-path rule.SchemaIdent,Org,Package,TypeName,SemVerand the ident macro family are gone;sdk/streamlib-identsno longer exists and no crate depends on it.check-no-reverse-dnsand its workflow are gone.runtime/streamlib-engine/src/iceoryx2/, bounded byPortKey::MAX_NAME_BYTES.bash .claude/scripts/ship-change-removed-gate.sh docs/plan/changes/processor-class-identity.md— clean: 14 REMOVED bullets, none referenced and none on disk.Test plan
cargo check --workspace --all-targetscargo test --workspace --no-fail-fastcargo doc -p streamlib --no-depscargo test -p xtask)cargo test --lib(43), stubtestpytest -m "not requires_gpu"uvx pyright@1.1.411Pre-existing red on
main, not regressions — verified by the gate runner in a throwaway worktree:cargo clippy --workspace -- -D warnings(80 errors onmainvs 45 here) andcargo fmt --all --check(127 files onmainvs 92 here). Both counts drop on this branch because of the deletions. Cause is rustc/clippy 1.94.0 lint drift acrossstreamlib-surface-client,xtaskfixtures and vendoredvulkanalia-sys— none of it in this diff.The compile-fail gate, proven by mutation
The pre-PR review caught that my first attempt at the
compile_faildoctests was vacuous: they wrote#[streamlib::processor(...)], and there is no such path — the attribute lives insidepub mod sdk. Both passed because the path did not resolve, so restoring the positional-identity parse would have left them green.Rebuilt with a control: the same fixture with the identity removed, in a plain
```rustblock that must compile. Then proven red by mutation — neuteringreject_positional_identityand restoring thetypearm:Reverted, all three green.
Notes for owner
1. Consumer breakage — the wanted signal, not fixed and not ticketed. Per the ticket's second comment. Nothing under
examples/was touched, and the onlypackages/edits are the nine files inpackages/test-fixtures, which CLAUDE.md classes as engine-side. What will not compile:audio,camera,clap,debug-utilities,display,frame-tap,h264,h265,jpeg,moq,mp4,opus,screen-capture,webrtc) and 5 examples.examples/camera-python-display/python/processors/cyberpunk_processor.py.examples/camera-display/.cargo/config.toml:22carries a[patch]path entry pointing at the deleted crate.2. A behaviour change worth your eye: display names move wherever the deleted identity's
Typesegment differed from the struct ident. The old grammar let the two diverge; they cannot now. Twelve sites. Eleven are fixtures and do not matter. The twelfth is shipped:runtime/streamlib-api-server/processors/api_server.rs— structApiServerProcessor, deleted identity@tatolab/api-server/ApiServer— so itssave_graph_snapshotalias moves fromapiServertoapiServerProcessor. Nothing asserts on it today. I did not rename the struct: the plan says the display name defaults to the class's short name, andApiServerProcessoris the class's short name — the old label was the grammar sustaining a fiction. Flagging in case the control-plane alias matters to you.3. Two further behaviour changes, both intended.
class blur_processor:). The old grammar refused it because it had to fit a^[A-Z][A-Za-z0-9]*$type segment; nothing parses the class name now, and Python never enforced PascalCase. Covered by a named test.ProcessorConfigSchema.schemaretypedTypeName→String, which drops PascalCase validation fromparse_processor_yaml. Intended — the field is descriptor metadata with no schema layer to resolve against. Zero blast radius:parse_processor_yamlhas no non-test caller anywhere in the workspace.4. A known contradiction, deliberately left.
processor_schema_parser.rsnow carries an inlined PascalCase rule forschema.name, whileProcessorClassShortName— the type carrying the same concept — documents that any stricter grammar would refuse a legal class. Preserving behaviour during a deletion refactor is the conservative call, and deleting the YAML parser is outside this ticket. Recording it as a known contradiction rather than leaving it to be discovered. Input for whoever retiresparse_processor_yaml+ProcessorConfigSchema+is_pascal_case, none of which has a workspace caller.5.
ProcessorDescriptor.versiondeleted — a wire change. Its only writer was the macro emitting the0.0.0sentinel this change deletes, so it would have shipped"version": ""for every processor under a control-plane field documented as a semantic version string. The plan holds that versions never live at the code layer, so the field goes rather than acquiring a new source.ProcessorDescriptorOutput.versiongoes with it. No test asserted on it. Recorded as a REMOVED bullet.6.
cargo fmt --allis unsafe in this repo. It reformats 41 unrelated files including the vendored Apache-2.0vendor/tatolab-vulkanalia-vma/, which the licensing rule forbids. I reverted all of it and formatted only my own files. Worth arustfmt.tomlexclude or a note in CLAUDE.md.7. Off-ticket finding:
docs/testing-hardware.md's--excludelist names five crates that no longer exist (api-server-demo,camera-deno-subprocess,camera-python-subprocess,camera-rust-plugin,webrtc-cloudflare-stream). Anyone following that doc gets a broken invocation.8. Ticket staleness corrections posted as a comment on #1841 — four load-bearing (three dependents not six;
schema_ident_any_version_macro_test.rsdoes not exist; there is no.pyientry for@processor;_validate_identityis really_resolve_type_reference) plus line-number drift.🤖 Generated with Claude Code
Summary by CodeRabbit
Breaking Changes
Bug Fixes
Chores