Repository navigation
Conversation
Jev labels each control class once with a closed list of 19 effects, each field with a role, and answers a gate question when a forward step stalls. Code plans over an abstract state map (route template + form fields + step-scoped forward controls) with class decay, site-wide chrome, reveal-by-toggle, travel by replayed clean path or URL, forward value that grows with depth, gate boosts and seeded tie-breaking. Scope is the start origin; UUID/ULID-like and dashed id segments fold into one route template. Explore mode's detectors, safety questions, --safe and trace/result format are unchanged; walk stays the default. Amp-Thread-ID: https://ampcode.com/threads/T-1e692c7c-8490-4324-ab0f-e524e1999732 Co-authored-by: Ignacio Gutierrez <nachojgutierrez@gmail.com>
…n-in - Travel: a URL is not trusted to restore a state. A state reached at the same URL as the one before it, or whose loaded URL showed another state, is not restorable; it is reached by loading the nearest restorable state and replaying the clean path from there. Each replayed step is checked. - Hysteresis: while the current state offers an untried forward step, the plan stays on it. - Dead controls: disabled, aria-disabled, pointer-events: none and covered targets are left out; a control whose clicks changed nothing twice is dead in that state. Disabled submits are filled for, and given up if they stay disabled. - Budget: when the plan is used up, reload, sweep what is left, replay to the deepest states in a fresh session (back to the run's starting cookies and storage), then hand the rest to the walk planner (effects.walkFrom). - Accounts: credentials typed into a sign-up form that moved on are used for sign-in forms; sign-in-gated steps re-open once signed in. Email and username carry a per-run token. - Forms: fill only the target's own form, never before a link to another page; a link to the current page is never a forward step. - Dialogs are one state wherever they open; typed values name their source as format.field.<role>, format.account.<role> or format.newPassword. Amp-Thread-ID: https://ampcode.com/threads/T-1e692c7c-8490-4324-ab0f-e524e1999732 Co-authored-by: Ignacio Gutierrez <nachojgutierrez@gmail.com>
Architecture Inside the changed components — 1 viewComponent view — Effects planner subsystem Internal modules of the effects planner: labeling, state mapping, form filling, and session handling. Data flow Review ✨ Nothing flagged · reviewed Tip Open a diagram on the canvas, then press W or click play to walk through the change one step at a time 🪧 More tips
Thanks for using PR Lens! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out on X, Bluesky, Mastodon, Reddit or LinkedIn |
…eep their class - Form scoping looked the target up by its data-sedum-ref, but click refs are gone once the fields are scanned, so every fill on the page was typed. The target is now found by the scanner's element path, shared with the liveness check (element-path.ts). - A submit its form did not enable was recorded as a click failure, so two such steps closed the control's class site-wide and the same control, enabled elsewhere, was never tried. It now gives up that record only. Both are covered by browser tests on small served pages. Amp-Thread-ID: https://ampcode.com/threads/T-1e692c7c-8490-4324-ab0f-e524e1999732 Co-authored-by: Ignacio Gutierrez <nachojgutierrez@gmail.com>
…etry - A disabled button no longer joins the record or class of the same enabled control, so a record's second try never targets a disabled member (which resolved to a different, enabled one). - A travel load that failed (timeout, dropped connection) counts as a failed trip; it no longer marks the URL as not restoring its state. - Credentials are kept per state until a submit there moves on: a refill after a rejected sign-up adds to what the form was given, so the account is still recorded when the retry succeeds. Amp-Thread-ID: https://ampcode.com/threads/T-1e692c7c-8490-4324-ab0f-e524e1999732 Co-authored-by: Ignacio Gutierrez <nachojgutierrez@gmail.com>
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Adds an experimental effects planner to explore mode, behind
sedum explore --planner effects(guided mode only). The weighted walk is still the default.How it works
Jev labels, code plans. Jev answers only closed questions:
Labels are cached per control, so a page structure costs one call. Code plans over an abstract map of states (route template + form fields + step-scoped forward controls) using:
Scope and route templates. Scoped to the start origin. UUID, ULID and dashed-id path segments fold into one template.
Travel learns which URLs restore a state. A state reached at the same URL as the state before it, or whose loaded URL showed a different state, is marked not restorable. It is reached by loading the nearest restorable ancestor and replaying the clean path from there, checking each step.
Hysteresis. While the current state still offers an untried forward step, the planner finishes it before moving to another state.
Controls that cannot act are skipped. These are left out:
aria-disabledandpointer-events: nonetargets;A control whose clicks changed nothing twice is dead in that state. Disabled submits are filled for, then given up if they stay disabled.
The whole budget is used. When the plan runs out: reload, then sweep what is left, then start a fresh session (the cookies and storage the run started with) and replay to the deepest states. After that the walk planner spends the remaining steps (
effects.walkFrominresult.json).Accounts. Credentials typed into a sign-up form that moved on are reused for sign-in forms, and steps a sign-in gate blocked are re-opened once signed in. Emails and usernames carry a per-run token.
Forms.
Explore mode's detectors, safety questions,
--safeand trace/result format are unchanged.result.jsonadditionally carriesplannerandeffects(states,maxDepth,walkFrom).Measured: walk vs effects, 150 steps, seeds 1–3
Deepest flow = furthest stage of each site's purchase funnel. Values are seed 1/2/3, with the step at which that stage was reached. The effects runs' Jev cost includes the walk planner's calls after the handover.
Funnels:
SauceDemo was not used for tuning. It starts signed in as standard_user via
--cookies.Verification
pnpm typecheck,eslintand prettier are clean.pnpm test: 1391 passed, 254 skipped.SEDUM_BROWSER_INTEGRATION=1, the effects fixture-shop integration test and the explore suites pass.pre_commit_code_health_safeguardpasses.Known gaps
https://ampcode.com/threads/T-1e692c7c-8490-4324-ab0f-e524e1999732