Skip to content

refactor(sdk)!: delete the @org/package/Type identity grammar and streamlib-idents - #1851

Merged
tato123 merged 8 commits into
mainfrom
refactor/1841-delete-identity-grammar
Aug 12, 2026
Merged

refactor(sdk)!: delete the @org/package/Type identity grammar and streamlib-idents#1851
tato123 merged 8 commits into
mainfrom
refactor/1841-delete-identity-grammar

Conversation

@tato123

@tato123 tato123 commented Aug 12, 2026

Copy link
Copy Markdown
Collaborator

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: SchemaIdent with its Org / Package / TypeName / PackageRef / ModuleIdent segments, SemVer / SemVerRange / Prerelease, the @app/local synthesis in both languages, the schema_ident! and module_ident*! macro family, VERSION_FREE_SENTINEL, the sdk/streamlib-idents crate and its three dependents' dep lines, check-no-reverse-dns and its workflow, and docs/architecture/schema-identity-and-packaging.md.

@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, and type is gone from the Rust unknown-key list.

71 files, +736 / −4119.

The one thing that was not a pure deletion

ProcessorDescriptor.name carried 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 a ProcessorClassShortName newtype in streamlib-processor-schema, sibling to the ProcessorClassImportPath #1840 built.

A newtype rather than a second bare String because ProcessorDescriptor::new had exactly one impl 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. Deserialize is 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.rs was the one non-ident survivor and moves to runtime/streamlib-engine/src/iceoryx2/channel_name.rs, where it derives MAX_CHANNEL_NAME_BYTES from PortKey::MAX_NAME_BYTES instead of duplicating the literal — the duplication existed only because streamlib-idents could not depend on streamlib-ipc-types. Its four IdentError channel variants fold into the core Error.

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

  • No @processor in either language accepts an identity, a type = override, or any @org/package/Type string; passing one errors naming the class-path rule.
  • SchemaIdent, Org, Package, TypeName, SemVer and the ident macro family are gone; sdk/streamlib-idents no longer exists and no crate depends on it.
  • check-no-reverse-dns and its workflow are gone.
  • Channel-name derivation lives in runtime/streamlib-engine/src/iceoryx2/, bounded by PortKey::MAX_NAME_BYTES.
  • bash .claude/scripts/ship-change-removed-gate.sh docs/plan/changes/processor-class-identity.mdclean: 14 REMOVED bullets, none referenced and none on disk.

Test plan

gate result
cargo check --workspace --all-targets pass
cargo test --workspace --no-fail-fast pass (engine lib 1174 passed / 126 ignored)
cargo doc -p streamlib --no-deps pass, no rustdoc warnings
xtask suite (9 gates + cargo test -p xtask) pass (178 tests)
license-header checks pass
wheel: build, cargo test --lib (43), stubtest pass
wheel: pytest -m "not requires_gpu" 207 passed, 61 GPU-deselected
wheel: uvx pyright@1.1.411 0 errors, 0 warnings
ship-change REMOVED gate clean, 14/14

Pre-existing red on main, not regressions — verified by the gate runner in a throwaway worktree: cargo clippy --workspace -- -D warnings (80 errors on main vs 45 here) and cargo fmt --all --check (127 files on main vs 92 here). Both counts drop on this branch because of the deletions. Cause is rustc/clippy 1.94.0 lint drift across streamlib-surface-client, xtask fixtures and vendored vulkanalia-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_fail doctests was vacuous: they wrote #[streamlib::processor(...)], and there is no such path — the attribute lives inside pub 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 ```rust block that must compile. Then proven red by mutation — neutering reject_positional_identity and restoring the type arm:

ProcessorAttributeAcceptsNoIdentity (line 53) ... ok            <- control still compiles
ProcessorAttributeAcceptsNoIdentity (line 69) - compile fail ... FAILED
ProcessorAttributeAcceptsNoIdentity (line 85) - compile fail ... FAILED

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 only packages/ edits are the nine files in packages/test-fixtures, which CLAUDE.md classes as engine-side. What will not compile:

  • 41 Rust processor files across 13 packages (audio, camera, clap, debug-utilities, display, frame-tap, h264, h265, jpeg, moq, mp4, opus, screen-capture, webrtc) and 5 examples.
  • 1 Python processor: examples/camera-python-display/python/processors/cyberpunk_processor.py.
  • examples/camera-display/.cargo/config.toml:22 carries a [patch] path entry pointing at the deleted crate.

2. A behaviour change worth your eye: display names move wherever the deleted identity's Type segment 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 — struct ApiServerProcessor, deleted identity @tatolab/api-server/ApiServer — so its save_graph_snapshot alias moves from apiServer to apiServerProcessor. Nothing asserts on it today. I did not rename the struct: the plan says the display name defaults to the class's short name, and ApiServerProcessor is 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.

  • Python now accepts a non-PascalCase class name (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.schema retyped TypeNameString, which drops PascalCase validation from parse_processor_yaml. Intended — the field is descriptor metadata with no schema layer to resolve against. Zero blast radius: parse_processor_yaml has no non-test caller anywhere in the workspace.

4. A known contradiction, deliberately left. processor_schema_parser.rs now carries an inlined PascalCase rule for schema.name, while ProcessorClassShortName — 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 retires parse_processor_yaml + ProcessorConfigSchema + is_pascal_case, none of which has a workspace caller.

5. ProcessorDescriptor.version deleted — a wire change. Its only writer was the macro emitting the 0.0.0 sentinel 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.version goes with it. No test asserted on it. Recorded as a REMOVED bullet.

6. cargo fmt --all is unsafe in this repo. It reformats 41 unrelated files including the vendored Apache-2.0 vendor/tatolab-vulkanalia-vma/, which the licensing rule forbids. I reverted all of it and formatted only my own files. Worth a rustfmt.toml exclude or a note in CLAUDE.md.

7. Off-ticket finding: docs/testing-hardware.md's --exclude list 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.rs does not exist; there is no .pyi entry for @processor; _validate_identity is really _resolve_type_reference) plus line-number drift.

🤖 Generated with Claude Code

Summary by CodeRabbit

  • Breaking Changes

    • Processor identity is now derived from class import paths rather than manually authored identifiers.
    • Removed legacy schema/module identity macros and processor version metadata.
    • Processor descriptors now use validated short names for display purposes.
    • Python processor declarations no longer accept positional identity arguments.
  • Bug Fixes

    • Improved channel-name validation with structured errors and transport-length enforcement.
  • Chores

    • Removed the obsolete identifier package and reverse-DNS validation command.

tato123 and others added 8 commits August 12, 2026 08:14
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>
@coderabbitai

coderabbitai Bot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

The 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 streamlib-idents crate, related macros, reverse-DNS checks, and obsolete metadata are deleted.

Changes

Processor identity simplification

Layer / File(s) Summary
Identity and descriptor contracts
sdk/streamlib-processor-schema/..., sdk/streamlib-error/src/lib.rs, runtime/streamlib-engine/src/core/json_schema.rs
Descriptors now store ProcessorClassShortName and import paths. Semantic version fields and structured schema identity types are removed. Channel validation errors move to engine error variants.
Rust processor macro contract
sdk/streamlib-macros/..., sdk/streamlib-sdk/src/lib.rs, runtime/streamlib-engine/src/lib.rs, runtime/streamlib-engine/tests/*, sdk/streamlib-sdk/tests/*
Rust processor attributes reject authored identities. Names derive from attached types. Generated code exposes class import paths instead of schema_ident(). Identifier macros are removed.
Runtime identity and channel integration
runtime/streamlib-engine/src/core/..., runtime/streamlib-engine/src/iceoryx2/..., packages/test-fixtures/processors/*, runtime/streamlib-api-server/processors/api_server.rs, runtime/streamlib-media-builtins/src/*
Runtime descriptor construction and display-name logic use short names. Channel naming moves into the engine and validates against PortKey limits. Processor fixtures no longer provide explicit identifiers.
Python processor declaration contract
sdk/streamlib-python-wheel/python/streamlib/_processor_declaration.py, sdk/streamlib-python-wheel/src/*, sdk/streamlib-python-wheel/tests/*
The Python decorator no longer accepts identity strings. The native layer derives names from class metadata and detects declarations through __streamlib_processor_declared__.
Repository and fixture cleanup
sdk/streamlib-idents/*, .github/workflows/check-no-reverse-dns.yml, xtask/src/*, docs/architecture/schema-identity-and-packaging.md, Cargo.toml
The streamlib-idents package, reverse-DNS workflow and command, related workspace entries, and architecture documentation are removed.

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
Loading
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main changes: removing the identity grammar and deleting the streamlib-idents crate.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch refactor/1841-delete-identity-grammar

Comment @coderabbitai help to get the list of available commands.

@processor("@tatolab/camera/Camera") # pyright: ignore[reportArgumentType]
class Camera:
@output()
def frames_to_downstream(self) -> None: ...
@processor
class lowercase_name:
@input(delivery_profile="latest")
def frames_from_upstream(self) -> None: ...

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 win

Reject type= with class-path guidance.

Line 112 does not accept a type keyword. Python raises its generic unexpected-keyword TypeError before this function can provide the required class-path guidance. This misses the PR requirement for rejected type overrides.

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

📥 Commits

Reviewing files that changed from the base of the PR and between 4e2ac4b and 8992ee8.

⛔ Files ignored due to path filters (1)
  • Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing (70)
  • .github/workflows/check-no-reverse-dns.yml
  • Cargo.toml
  • docs/architecture/schema-identity-and-packaging.md
  • docs/plan/changes/processor-class-identity.md
  • packages/test-fixtures/processors/compute_kernel_test_processor.rs
  • packages/test-fixtures/processors/concurrent_escalate_test_processor.rs
  • packages/test-fixtures/processors/escalate_smoke_test_processor.rs
  • packages/test-fixtures/processors/gpu_acquire_test_processor.rs
  • packages/test-fixtures/processors/graphics_kernel_smoke_test_processor.rs
  • packages/test-fixtures/processors/lifecycle_probe_processor.rs
  • packages/test-fixtures/processors/panicking_lifecycle_processor.rs
  • packages/test-fixtures/processors/ray_tracing_kernel_smoke_test_processor.rs
  • packages/test-fixtures/processors/test_configured_processor.rs
  • runtime/streamlib-api-server/processors/api_server.rs
  • runtime/streamlib-engine/Cargo.toml
  • runtime/streamlib-engine/src/core/compiler/compiler_ops/open_iceoryx2_service_op.rs
  • runtime/streamlib-engine/src/core/compiler/scheduling.rs
  • runtime/streamlib-engine/src/core/descriptors.rs
  • runtime/streamlib-engine/src/core/graph/graph_tests.rs
  • runtime/streamlib-engine/src/core/json_schema.rs
  • runtime/streamlib-engine/src/core/processors/processor_instance_factory.rs
  • runtime/streamlib-engine/src/core/runtime/operations.rs
  • runtime/streamlib-engine/src/core/runtime/operations_runtime.rs
  • runtime/streamlib-engine/src/core/test_support.rs
  • runtime/streamlib-engine/src/iceoryx2/channel_name.rs
  • runtime/streamlib-engine/src/iceoryx2/delivery_profile.rs
  • runtime/streamlib-engine/src/iceoryx2/mod.rs
  • runtime/streamlib-engine/src/lib.rs
  • runtime/streamlib-engine/tests/attribute_macro_test.rs
  • runtime/streamlib-engine/tests/connect_typed_errors_test.rs
  • runtime/streamlib-engine/tests/control_plane_processor_type_test.rs
  • runtime/streamlib-engine/tests/display_name_disambiguation_test.rs
  • runtime/streamlib-engine/tests/graph_readiness_signal_test.rs
  • runtime/streamlib-engine/tests/graph_snapshot_round_trip_test.rs
  • runtime/streamlib-engine/tests/processor_class_import_path_test.rs
  • runtime/streamlib-engine/tests/runtime_shutdown_request_ends_run_loop.rs
  • runtime/streamlib-engine/tests/schema_ident_macro_test.rs
  • runtime/streamlib-ipc-types/src/lib.rs
  • runtime/streamlib-media-builtins/src/camera_source.rs
  • runtime/streamlib-media-builtins/src/display_window.rs
  • runtime/streamlib-media-builtins/src/test_pattern_source.rs
  • sdk/streamlib-error/src/lib.rs
  • sdk/streamlib-idents/Cargo.toml
  • sdk/streamlib-idents/src/error.rs
  • sdk/streamlib-idents/src/ident.rs
  • sdk/streamlib-idents/src/lib.rs
  • sdk/streamlib-idents/src/semver.rs
  • sdk/streamlib-idents/tests/no_parse_api.rs
  • sdk/streamlib-macros/Cargo.toml
  • sdk/streamlib-macros/src/codegen.rs
  • sdk/streamlib-macros/src/grammar.rs
  • sdk/streamlib-macros/src/lib.rs
  • sdk/streamlib-processor-schema/Cargo.toml
  • sdk/streamlib-processor-schema/src/descriptors.rs
  • sdk/streamlib-processor-schema/src/lib.rs
  • sdk/streamlib-processor-schema/src/processor_class_short_name.rs
  • sdk/streamlib-processor-schema/src/processor_schema.rs
  • sdk/streamlib-processor-schema/src/processor_schema_parser.rs
  • sdk/streamlib-python-wheel/python/streamlib/_processor_declaration.py
  • sdk/streamlib-python-wheel/src/python_helper_process_spawn_host.rs
  • sdk/streamlib-python-wheel/src/python_processor_declaration.rs
  • sdk/streamlib-python-wheel/src/python_test_harness_endpoints.rs
  • sdk/streamlib-python-wheel/tests/test_processor_declaration.py
  • sdk/streamlib-python-wheel/tests/test_processor_identity.py
  • sdk/streamlib-sdk/src/lib.rs
  • sdk/streamlib-sdk/tests/app_sugar_test.rs
  • xtask/src/check_boundaries.rs
  • xtask/src/check_no_in_process_placement.rs
  • xtask/src/check_no_reverse_dns.rs
  • xtask/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

Comment on lines +236 to 243
// 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());
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 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:


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.

@tato123
tato123 merged commit d0dcea3 into main Aug 12, 2026
15 of 16 checks passed
@tato123
tato123 deleted the refactor/1841-delete-identity-grammar branch August 12, 2026 14:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat(sdk)!: delete the @org/package/Type identity grammar and streamlib-idents

1 participant