Skip to content

Mark system Nexus envelope payloads#1667

Open
tconley1428 wants to merge 1 commit into
mainfrom
system-nexus-payload-marker
Open

Mark system Nexus envelope payloads#1667
tconley1428 wants to merge 1 commit into
mainfrom
system-nexus-payload-marker

Conversation

@tconley1428

@tconley1428 tconley1428 commented Jul 21, 2026

Copy link
Copy Markdown
Contributor

What changed

System Nexus envelope payloads encoded by the system Nexus payload converter now carry a __temporal_system_payload metadata marker with value b"true".

Payload visitors now use that marker to detect system Nexus envelopes whenever they encounter an already-encoded payload. This lets nested user payloads inside the envelope still be decoded and visited even when the payload is no longer accompanied by a Nexus endpoint field.

Detection behavior

Detection is metadata-only. Unmarked payloads are treated as regular payloads, even if they are used as the input for the Temporal system Nexus endpoint. Marked payloads are treated as system Nexus envelopes regardless of endpoint.

Tests

  • ./.venv/bin/pytest tests/nexus/test_temporal_system_nexus.py -q
  • ./.venv/bin/pytest tests/worker/test_visitor.py -q
  • poe lint

@tconley1428
tconley1428 requested a review from a team as a code owner July 21, 2026 20:00
@tconley1428
tconley1428 marked this pull request as draft July 21, 2026 20:01
@tconley1428
tconley1428 force-pushed the system-nexus-payload-marker branch from 4cf4eaa to b489b0e Compare July 23, 2026 19:12
@tconley1428
tconley1428 marked this pull request as ready for review July 23, 2026 19:14
@dplyukhin dplyukhin self-assigned this Jul 23, 2026
Comment on lines 58 to +79
async def _visit_nexus_operation_input_payload(
self,
fs: VisitorFunctions,
endpoint: str,
payload: Payload,
) -> None:
new_payload = await temporalio.nexus.system._maybe_visit_payload(
endpoint,
payload,
await self._visit_temporal_api_common_v1_Payload(fs, payload)

async def _visit_temporal_api_common_v1_Payload(
self, fs: VisitorFunctions, o: Payload
):
new_payload = await temporalio.nexus.system.maybe_visit_payload(
o,
fs,
self.skip_search_attributes,
)
if new_payload is None:
await self._visit_temporal_api_common_v1_Payload(fs, payload)
await fs.visit_payload(o)
return

if new_payload is not payload:
payload.CopyFrom(new_payload)
await fs.visit_system_nexus_envelope(payload)

async def _visit_temporal_api_common_v1_Payload(
self, fs: VisitorFunctions, o: Payload
):
await fs.visit_payload(o)
if new_payload is not o:
o.CopyFrom(new_payload)
await fs.visit_system_nexus_envelope(o)

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Not sure if the formatter allows it, but I'd put put some of these args and params on the same line and rename o to payload

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

It would be a little painful I think because it is all generated code, and is using some of the same names as all other functions.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

I take it back, looks like this one isn't part of that, so it should be easy

)
visitor = SystemNexusVisitor()

await PayloadVisitor().visit(visitor, comp)

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Codex observed that this fails if concurrency_limit>1.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Can you elaborate? And do you think it matters for some reason?

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.

2 participants