Hacktoberfest 2026: the issues maintainers tagged for October, open and beginner-friendly. Browse Hacktoberfest issues

iOS live-lane retry policy (from #3336 review): scope re-issue to declared reads, count absorbed misses, build wire-shape fixtures

Open
#3,344 0 comments 0 reactions 0 assignees View on GitHub

Maintainers usually reply within 1 day

Nobody has claimed this yet.

Assessment

Difficulty
4/5
Estimated time
3-5 days
Newbie friendliness
48/100
Issue type
Bug
Clarity
Clearly specified
Activity status
Active
Tech stack
ios, typescript
Domain
mobile, testing

Research direction

Start with test/integration/ios-simulator-e2e/live-harness.ts and trace how runStep sets the re-issue predicate; read resolveCommandRecordingEffect to identify the declared read effect. Then inspect runtime.ts and test/integration/ios-simulator-e2e-step-retry-policy.test.ts, including waitFailure(), for the miss-counting and fixture work. Done when retries are limited to observing steps, absorbed misses are countable, and fixtures reflect the wire response.

Written by the indexing model from the issue text.

Description

Why

Three follow-up notes from the human review of #3336 (reviewer comment 2026-10-08T22:38:43Z; the lane-policy layer shipped there is row 8's subject matter in #2491). None blocks the PR; all three outlive it, so they live here instead of a comment thread.

Scope

  1. Scope the re-issue predicate to declared reads. runStep in test/integration/ios-simulator-e2e/live-harness.ts attaches isObservationPreventedStepMiss to EVERY iOS step. A replay step's failure response is the failed step's OWN wire response passed through verbatim (readLastResponse() in packages/replay-port/src/daemon-port/native-command.ts), so a nested wait's retriable: true + details.reason hoists to the top level and could re-run a whole script after earlier mutating steps. Today that is benign (every lane replay starts with open --relaunch or launchApp clearState), and it cannot stack with the test suite's --retries: a scheduler-level suite failure is built as errorResponse(code, message) without details/retriable (packages/replay-port/src/daemon-port/test-command.ts), and a completed-with-failures suite returns ok:true counts the harness asserts itself. The scoping rule the reviewer proposed: re-issue only steps whose command declares the read effect (resolveCommandRecordingEffect(step) === 'observes-app'), so hoisting can never reach a mutating step even after fixture changes.
  2. Make absorbed misses countable. A re-issue that turns a step green records the first failure only inside step-history.json (runtime.ts runStep, issue > 1). One stderr line or JUnit annotation keyed on the typed reason (error.details.reason + retriable) would let #2491 count absorbed misses per class instead of grepping step histories.
  3. Build the retry-policy fixtures from the wire, not by hand. waitFailure() in test/integration/ios-simulator-e2e-step-retry-policy.test.ts hand-writes the response shape. It currently matches the recorded payload (run 37356199982: top-level retriable: true, details.reason: wait_runner_restart_exhausted), but building fixtures via normalizeError or a recorded CLI payload keeps them honest if the envelope moves.

Related: #2491, #3336.

Dominant language
TypeScript
Stars
5k
Forks
334
Avg merge
12h 29m
Merged PRs (30d)
663

Getting set up

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.

More from callstack/agent-device

All issues in callstack/agent-device

Similar issues

More TypeScript issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.