Repository navigation
Add sstack-demo lane and scripted UI evaluation with visual review - #3
Merged
Merged
Conversation
Demos no longer pay the full delivery path. The new skill runs a scripted build, self-check, honesty check and rehearsal loop outside Jira, the controller, review, CI and merge, and hands approved demos to /sstack for promotion into tickets. Demo code stays under demos/ or demo/* branches. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HSV4zUy6rF1vgHFSyUmuva
Drop the demos/ registration example, which made the stack gate fail and could not unblock verification anyway. Defer Kizen writes to platform.md's approval rules, keep demo work on demo/* branches, and make promotion emit schema-valid eval cases with acceptance for faked steps. Route demos before the PM skill loads delivery references and mention the skill in installed instructions. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HSV4zUy6rF1vgHFSyUmuva
Deleting earlier records is itself a write outside the approved demo scope. Use a fresh run marker per run instead, which the readback already matches on. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HSV4zUy6rF1vgHFSyUmuva
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HSV4zUy6rF1vgHFSyUmuva
ui_eval.py drives a JSON UI script in Chromium against one approved origin, screenshots every step, records console, page and request errors, and emits captured values as eval result cases. The review command binds an agent's per-screenshot visual verdicts, from computer use or viewing the images, to the screenshot hashes. The demo and verify skills use it, and CI installs Chromium and requires the browser tests. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HSV4zUy6rF1vgHFSyUmuva
Abort top-level navigations to other origins before any request is sent, covering links, delayed scripts, redirects and popups, and reject goto paths that can leave base_url, including file and scheme-relative URLs. Screenshot failures now fail the step, and review blocks reports with no reviewable screenshots. Numeric capture needs exactly one standalone number, recorded URLs drop query strings, and ignore_console only suppresses console noise. Browser tests skip only when Chromium is missing, unless CI requires them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HSV4zUy6rF1vgHFSyUmuva
Browsers follow network redirects without routing them, so top-level pages are now fetched with redirects disabled and each Location is checked before the browser follows it. The run settles briefly after the last step so a delayed off-origin navigation is caught, and numeric capture rejects ranges, dates and attached units. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HSV4zUy6rF1vgHFSyUmuva
Browsers follow redirects without routing them, so a same-origin hop could lead to an unchecked off-origin one. Each same-origin redirect is now replaced by a new navigation, which the guard fetches and checks again, with a hop limit and no method-preserving redirects of form posts. Fetch failures are recorded. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HSV4zUy6rF1vgHFSyUmuva
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.
Why
Tickets ship well through the delivery loop, but demos paid the full cost of that loop: Jira, controller, frozen evals, independent review, CI and merge. This PR adds a separate demo lane, plus a UI checker that both demos and delivery can use. With the checker, an agent drives the UI, then looks at every screenshot, with computer use or by opening the images, before the UI counts as passing.
What changed
sstack-demoskill (tools/sstack/skills/sstack-demo/SKILL.md)demo/*branches, never merges, and never counts as ticket evidence (AGENTS.md).platform.mdapproval. Record writes go only to a sandbox approved for this demo, and resets use a fresh run marker instead of deleting records./sstackandsstack-modesend demo requests here. The skill is registered in both host skill folders,install.py, the contract checker,CLAUDE.md, the README and the installer's managed instructions.tools/sstack/ui_eval.pyrun SCRIPT.json --approved-origin <host>drives a JSON step script in Chromium. Steps aregoto,click,fill,press,wait_for,expect_textandcapture.{run_marker}value unique to each rungotopaths must stay underbase_url, sofile:, scheme-relative and backslash paths are rejected--storage-state) must live outside the repositoryreview REPORT VERDICTSholds the visual verdicts. It binds each pass/fail verdict to its screenshot's SHA256, blocks on missing verdicts or reports with nothing reviewable, and fails on anyfailverdict or failed automated check. Verdicts are the reviewer's declarations and are not authenticated.tools/sstack/skills/sstack-verify/references/ui-eval.md.sstack-demoandsstack-verifyuse this checker for UI steps.Dependencies and CI
playwright==1.56.0is added torequirements-dev.txt. This is the stack's first non-stdlib runtime tool; it is imported lazily, so the other tools stay stdlib-only.SSTACK_REQUIRE_BROWSER=1, so browser tests fail rather than skip there. Locally they skip only if Chromium can't launch.test_install.pycounts host links fromSKILLSinstead of a hard-coded 8.Validation
control.py verify changed --base origin/main --jobs 2ran 124 tests, lint and docs checks, with the browser tests running in real Chromium.One mutation isn't caught at run time: letting a screenshot failure pass, because tests can't force a screenshot error. Review still blocks that step.
Known limits
npx playwright codegen --save-storage=….🤖 Generated with Claude Code
https://claude.ai/code/session_01HSV4zUy6rF1vgHFSyUmuva
Generated by Claude Code