Skip to content

Release 1.4.0 — Sprint 18 auth, audit fixes (B1–B6), 9 new skills - #1

Merged
celikgo merged 8 commits into
mainfrom
feat/sprint-18-auth
Jul 17, 2026
Merged

Release 1.4.0 — Sprint 18 auth, audit fixes (B1–B6), 9 new skills#1
celikgo merged 8 commits into
mainfrom
feat/sprint-18-auth

Conversation

@celikgo

@celikgo celikgo commented Jul 17, 2026

Copy link
Copy Markdown
Owner

Cuts v1.4.0. First-audit follow-through plus Sprint 18: real new capability (auth, manual-pause step, preflight CLI), 9 natural-language skills over previously-unreachable tools, all six audit release-blockers (B1–B6) fixed, and the version bumped across every manifest. No breaking changes.

Commits (8, logically grouped)

Commit Type Summary
df2089e fix False-green fixes B5/B6: assert_url vacuous pass, JUnit control-char corruption; AI model 4-74-8
936da9e feat 9 new Claude Code skills driving orphaned tools
63ca383 feat Sprint 18 — authenticated sessions, pauseForManual, webmobai-doctor (+ B3/B4, shared files)
03656bf docs Corrected tool/binary/test counts; documented Sprint 18
4ecbd53 fix B1 desktop shell scope + B2 clean-install browser download (the two ship-blockers)
7dd2af9 chore Release 1.4.0 — version bump across all manifests + CHANGELOG
2c2f534 ci Harden release workflow (pinned/permissioned) + clean publish warning
60c0942 ci Bump deprecated actions to Node-24 majors; harden ci.yml to match release.yml

Headline features

Authenticated sessions (the login-wall unlock). storage_state_path on launch + webmobai_save_storage_state tool; scenario storageState field + saveStorageState step; SuiteDefaults.storageState; --storage-state/--save-storage-state CLI flags. Session files never echoed into responses/logs, gitignored by default.

pauseForManual step — headed-mode wait for MFA/CAPTCHA/SSO, fast no-op headless.

webmobai-doctor (7th binary) — preflight for Node, Playwright browser install, optional deps, API key, storageState validity.

All six audit release-blockers fixed

  • B1 — Tauri shell capability had no command scope, so the packaged desktop app's core actions (Test / history / reveal / open-report) were all rejected. Now a scoped allow-list for node/cat/open with validated args (not args:true); shell.open widened to file://. Validated via cargo check (the generate_context! macro parses and accepts the capability file).
  • B2 — clean npm i -g shipped no browsers, so 4 of 6 CLIs + the MCP server crashed on first launch. BrowserManager.launch() now downloads the requested engine on first use (one choke point, no-op once installed).
  • B3 — runner treats any non-success tool result as a step failure (a failed route install / visualSnapshot capture error no longer passes green).
  • B4webmobai-suite exits non-zero when a tag filter matches zero scenarios (--allow-empty to opt out).
  • B5assert_url with no matcher is rejected, not vacuously passed.
  • B6 — JUnit XML strips XML-illegal control chars so one bad byte can't drop every result.

9 new skills

debugging-web-selectors (the marketed self-healing differentiator had no skill), verifying-web-flows, testing-web-error-states, auditing-web-security, auditing-web-seo, monitoring-web-regressions, authoring-web-scenarios, auditing-web-pwa, auditing-web-lighthouse.

Verification

  • 51 tools, 7 binaries, 214 tests (from 50/6/206)
  • mcp-server: full suite 212 passed, 2 skipped; clean tsc + build (all 7 binaries emit to dist)
  • frontend: clean tsc -b + vite build
  • Tauri: cargo check accepts the capability + config at v1.4.0
  • 20 new tests total across the branch (auth round-trip, redaction, headless pause, doctor + suite subprocess exit codes, B3/B5/B6)

Before merging / releasing

  • A packaged desktop GUI smoke test (click Test / open a report) is advisable for B1 — I could validate the config accepts and the frontend compiles, but not click buttons in a packaged build.
  • The npm publish pipeline has produced nothing on the registry for v1.0–v1.3 (webmobai-mcp 404s). release.yml/ci.yml were hardened in 2c2f534/60c0942, but confirm NPM_TOKEN is set before the v1.4.0 tag triggers release.yml, or the package stays unpublished again.

🤖 Generated with Claude Code

celikgo and others added 6 commits July 17, 2026 18:07
From the first full audit. Two ways a test could silently pass a broken
check, plus a stale model default:

- assert_url with neither `contains` nor `pattern` returned "PASS — URL
  matches" while verifying nothing (`true && true`). It now fails, and the
  schema advertises an anyOf on the two matchers. (audit B5)
- JUnit esc() only escaped the five XML entities, so a control char or ANSI
  escape in a page title / console error made the whole junit-*.xml malformed
  and CI importers dropped every result for the run. It now strips
  XML-1.0-illegal control chars and ANSI colour sequences. (audit B6)
- Default AI model bumped claude-opus-4-7 -> claude-opus-4-8, and the
  "~90% cost reduction" prompt-cache comment corrected (the prompts are below
  the 4096-token cacheable minimum, so caching never fires today).

Adds regression tests for each: they were untested paths, which is why the
bugs shipped.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Cross-referencing the 51 registered MCP tools against the existing 8 skills'
"Tools Used" sections surfaced a large set of shipped-but-unreachable tools —
capability with no natural-language entry point. The worst gap: the marketed
self-healing differentiator had no skill driving it.

New skills, each unlocking the orphaned tool(s) named:
- debugging-web-selectors   — describe_selector + self-healing triage
- verifying-web-flows        — the five assert_* verbs
- testing-web-error-states   — route/unroute + set_network_throttle (offline)
- auditing-web-security      — security_audit
- auditing-web-seo           — seo_audit + check_broken_links
- monitoring-web-regressions — get_run_history + check_regressions
- authoring-web-scenarios    — generate_scenario(_from_prompt)
- auditing-web-pwa           — pwa_audit
- auditing-web-lighthouse    — lighthouse_audit

Each matches the house style, cites only real tool names, and states honest
scope caveats. Wired into the skills README table and the testing-web-app
master routing.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ctor

Get past the login wall (the #1 adoption blocker: every tool and scenario
previously dead-ended at the login screen), plus the runner/suite correctness
fixes that share these files.

Authentication (storageState):
- BrowserManager.launch({ storageStatePath }) -> newContext({ storageState });
  saveStorageState(path). New webmobai_save_storage_state tool + storage_state_path
  arg on webmobai_launch_browser. Scenario `storageState` field + `saveStorageState`
  step, SuiteDefaults.storageState, and --storage-state / --save-storage-state on
  webmobai-scenario and webmobai-suite. Session files are treated as secrets —
  never echoed into responses/logs, and gitignored.

pauseForManual scenario step: in headed mode waits (bounded) for a human to
complete MFA/CAPTCHA/SSO, then continues; a fast no-op in headless.

webmobai-doctor (7th binary): preflight for Node version, Playwright browser
install (with the exact `npx playwright install` command), the optional
Lighthouse dep, the AI key, and a storageState file's validity/expiry.

Also lands (shared files with the above):
- runner treats any non-success tool result as a step failure — a failed route
  install or a visualSnapshot capture error no longer passes as green. (audit B3)
- webmobai-suite exits non-zero when a tag filter matches zero scenarios,
  with --allow-empty to opt out. (audit B4)

Deliberately NOT built: persistent-profile / --user-data-dir / CDP-attach auth
(different lifecycle, cross-browser tax, credential footgun) — the storageState
slice is ~90% of the unlock at ~10% of the risk.

Tests: real HTTP-origin storageState round-trip, save-tool redaction, headless
pauseForManual no-op, and subprocess tests for the suite exit codes and doctor.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Counts across README/FEATURES/USER_MANUAL/mcp-server README were drifted
  (claimed 43/49 tools, "four/five binaries"); corrected to the real
  51 tools / 7 binaries / 214 tests, and added webmobai-monitor +
  webmobai-doctor to the binary tables (both were missing).
- New "Test behind a login" walkthrough in USER_MANUAL: the save/replay flow,
  the CLI flags, the saveStorageState/pauseForManual steps, and the
  treat-auth.json-as-a-credential warning.
- README capability rows for authenticated sessions, the manual-step pause,
  and webmobai-doctor.
- CHANGELOG [Unreleased] entry covering the Sprint 18 features and the
  B3–B6 correctness fixes.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…er download

The two remaining ship-blockers from the first full audit.

B1 — desktop app was non-functional in a packaged build. The Tauri shell
capability granted bare shell:allow-execute/allow-spawn with no command scope,
so every Command.create (Test runner, monitor history via cat, reveal via
open -R) was rejected, and plugins.shell.open (URL-only) rejected local report
paths. Fixed with a scoped allow-list for exactly node / cat / open, each with
validated args (NOT args:true — that would be an XSS→RCE surface under csp:null):
- node-version (node --version) and node-run (node <auto-test.js> <url> <json>)
  as separate scope entries, since the two call sites pass different arg counts;
  node-run pins argv0 to a path ending in auto-test.js so -e/--eval can't be
  injected (later args are script args, not node flags).
- cat-history (cat <*history.json>) and open-reveal (open -R <path>).
- shell.open widened to file:// so Open HTML/PDF/screenshot work; openExternal
  wraps local paths as file:// URLs.
Frontend call sites renamed to the scoped command names. Validated end to end:
`cargo check` recompiles the app crate, so generate_context! parses and accepts
the capability file + tauri.conf. (A packaged GUI smoke test is still advisable
before shipping the .dmg.)

B2 — a clean `npm install -g webmobai-mcp` ships no browsers, so every entry
point except webmobai-test crashed on first launch with "Executable doesn't
exist". Added a shared ensureBrowserInstalled(engine) that downloads the
requested engine on first use, called from BrowserManager.launch() so the MCP
server and all six CLIs are covered through one choke point (no-op once
installed). auto-test's private installer now delegates to it.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Bump version across all manifests (root/mcp-server package.json + locks,
Cargo.toml + lock, tauri.conf.json, the MCP server version string) and promote
the CHANGELOG [Unreleased] section to [1.4.0]. Sprint 18 (authenticated
sessions, pauseForManual, webmobai-doctor) plus the B1–B6 audit fixes; no
breaking changes.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@celikgo celikgo changed the title Sprint 18: authenticated sessions + audit fixes + 9 new skills Release 1.4.0 — Sprint 18 auth, audit fixes (B1–B6), 9 new skills Jul 17, 2026
celikgo and others added 2 commits July 17, 2026 23:55
Follow-ups from diagnosing the npm-publish failures (the primary cause — an
npm token that can't bypass 2FA, giving E403 — is an account-side fix on the
NPM_TOKEN secret, not a repo change).

- Add timeout-minutes to both release jobs (15 for publish-npm, 60 for the
  desktop build) so a genuine hang fails fast instead of running to a limit.
- Move the Intel desktop build off the macos-13 runner, which is unavailable
  to this account — the job queued for the 24h maximum and timed out every
  release (only the arm64 .dmg ever shipped). It now cross-compiles
  x86_64-apple-darwin on the Apple-Silicon runner; safe because every shipped
  mcp-server production dependency is arch-independent and the one native
  module (fsevents, via Playwright) is a universal binary. Cache is keyed by
  target so the two same-runner legs don't collide.
- Prefix mcp-server repository.url with git+ to silence the npm publish warning.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ease.yml

- Bump the actions GitHub flagged as running on the deprecated Node 20 runtime
  to their current Node-24 majors: actions/checkout @v4@v7,
  actions/setup-node @v4@v7, actions/upload-artifact @v4@v7. (rust-cache is
  already on its latest major @v2; rust-toolchain@stable and tauri-action@v0
  are moving refs and weren't flagged.)
- Move CI off Node 20 (EOL April 2026) to Node 22 LTS.
- Mirror the release-workflow hardening into ci.yml, which had the same
  landmines: the build-tauri Intel leg used the unavailable macos-13 runner
  (24h queue-and-timeout on every push/PR, including this one) — now
  cross-compiled on macos-latest like release.yml; added a per-target rust
  cache key and timeout-minutes to every job.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@celikgo
celikgo merged commit 46c9463 into main Jul 17, 2026
4 checks passed
@celikgo
celikgo deleted the feat/sprint-18-auth branch July 17, 2026 21:39
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.

1 participant