Skip to content

Consume permanent action input errors and unbrick old tables - #451

Draft
nerdsane wants to merge 4 commits into
mainfrom
cursor/ioa-action-param-poison-74af
Draft

Consume permanent action input errors and unbrick old tables#451
nerdsane wants to merge 4 commits into
mainfrom
cursor/ioa-action-param-poison-74af

Conversation

@nerdsane

Copy link
Copy Markdown
Owner

Closes the two remaining FAILs on #450 (c5d94fd) without reopening the four holds Rei already closed.

Could not write to nikstern/temper (codex/ioa-action-parameter-requiredness), so this branch starts at that PR head and adds one commit.

FAIL-1 — SpecDrivenActor mailbox poison

validate_required_action_params was mapped to ActorError::HandlerFailed. pg.rs activate() returns before UPDATE_ACTOR, the tx rolls back, and the next READ_NEXT_MESSAGE is the same row. Permanent client input ({}, JSON null, or non-JSON → {}) retried forever.

Fix: consume / dead-letter those permanent input errors (Ok(()) + warn), matching EntityActor success: false (message consumed).

Test: permanent_missing_action_parameter_does_not_remain_next_poll — fails on c5d94fd (HandlerFailed), passes here (cursor advances to the next row).

FAIL-2 — old tables brick every live action

Missing action_params key + rule_index.contains_key(action) always returned MissingActionParameter with parameter = action. Newly compiled parameterless actions have action_params[name] = [] and passed; old serialized tables omit the key, so even CancelOrder with {} failed.

Fix: a missing key on an old table does not brick parameterless actions. Required-param metadata still fails closed.

Tests: older_serialized_table_parameterless_succeeds_required_still_fails_closed in temper-jit and EntityActor process_action. Parameterless old-table {} succeeds; required-param old-table {} is still MissingActionParameter. Those assertions fail on c5d94fd.

Still closed (do not reopen)

  • unmatched bound action is 400 UnknownBoundAction; Directory.Create does not HTTP-skip
  • lint csdl_action_missing on published-entity exact-name miss
  • old tables stay readable
  • lint walks ActionTrigger.guard and Spawn.copy_fields

Head

2ed882bc31653d38797b2f47de5048f29220e228

Open in Web Open in Cursor 

nikstern and others added 4 commits August 30, 2026 11:06
Unknown bound CSDL actions now fail HTTP schema validation instead of
Ok(()). Bundle lint requires an exact-name CSDL twin when the entity
type is published. Older serialized tables stay readable but no longer
skip actor requiredness when a live action lacks action_params.
Nullable-parameter lint walks ActionTrigger.guard and Spawn.copy_fields.
SpecDrivenActor mapped MissingActionParameter to HandlerFailed, so
activate() rolled back before cursor advance and retried the same row
forever. Consume those permanent client errors instead.

Old serialized tables omit action_params, so a missing key no longer
fails every live rule. Parameterless hot-swapped tables can fire;
required-param metadata still fails closed.
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.

3 participants