picatz / picatz/flowstate

SideEffect is unmentioned: the accepted cel-go replay exposure has a cheaper mitigation than an activity, and no record weighs it

Open
#908 1 comment 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

design engine kind/design-record
Dominant language
Go
Stars
9
Forks
0
Avg merge
3h 3m
Merged PRs (30d)
509

Description

WorkflowVars' doc comment (pkg/flowstate/v1/engine/activities.go:15-54, at a790076) states plainly that CEL evaluated inline in workflow code — step conditions, items:, step vars:, and most task inputs — is exposed to cel-go implementation drift across replay, that this exposure is accepted rather than avoided, and that routing each evaluation through an activity "would be a round trip per condition." workflow.SideEffect is the substrate's designated third option: it records each result as a single history marker, with no round trip and no worker hop. The phrase appears nowhere in this repository (git grep finds zero hits), so the option was never weighed in writing.

The decision is genuinely not obvious in either direction, which is why it should be recorded rather than left implicit:

  • A marker per condition reintroduces the history cost the cel: task was retired for; a 200-item loop would emit 200 markers.
  • Decisively, a marker does not survive Continue-As-New, so SideEffect cannot solve the one case that motivated moving workflow vars: into an activity in the first place.
  • On the other side, for the conditions that never cross a Continue-As-New boundary, a marker is strictly cheaper than the accepted drift exposure's remaining alternative, and Worker Versioning (the current mitigation) pins the interpreter rather than the evaluation.

Desired outcome: a recorded answer either way, in the same argue-it-and-write-it-down shape as #778's local-activity question — a row or refusal note in docs/ARCHITECTURE.md's "Leaning into Temporal" table. If the answer is no, the reason belongs in activities.go's doc comment beside the exposure it declines to fix, so the next reader finds a decision rather than an absence.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with docs/ARCHITECTURE.md’s “Leaning into Temporal” table, #778’s local-activity decision, and the WorkflowVars comment in pkg/flowstate/v1/engine/activities.go:15-54. Compare the stated SideEffect trade-offs, including history cost and Continue-As-New, without assuming a preferred answer. Done means recording an explicit decision in the table, and if declining the option, adding the rationale beside the exposure in activities.go.

Written by the indexing model from the issue text.

Assessment

Tech stack
go
Domain
backend, documentation
Issue type
Documentation
Difficulty
4/5
Estimated time
3-5 days
Activity status
Active
Clarity
Mostly clear
Newbie friendliness
48/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.