sanuu7/androidharness/asstest
Claude Code and agent skill by sanuu7/androidharness
- community
Checking that the SKILL.md file is still in the repository.
Deep self-test battery, 25 checks across 9 phases. Superset of doctor for full regression sweeps.
Install
npx vskill@latest install sanuu7/androidharness/asstestSKILL.md
Harness Deep Test (asstest)
25 checks in 9 phases. Superset of /doctor: byte-exact round-trips, patch atomicity, grep semantics, uid-split ownership, git branch ops, HTTP edge cases, and parallel write races. Use /doctor for a quick pass, this for a full sweep.
When to use
- Before or after harness core / tool changes
- Verifying a new device or environment combination end to end
- Triggered with /asstest in chat or via skill invocation
Procedure
Run the phases in order. Every check PASSes or is recorded as an explicit DEVIATION (with reason). All fixtures live under asstest/ and are removed in CLEANUP.
PHASE 1: FILE BYTES (checks 1-4)
- Byte-exact round-trip: write_file "asstest/bytes.txt" containing "café 中文 ✅ 🚀🎯\n\ttabbed\n",
read_file it back; content identical modulo the documented single trailing newline. Astral emoji (4-byte UTF-8) must survive; verify bytes with xxd or python3.
- write_file content intended WITHOUT a trailing newline; verify with
tail -c 3 | xxd
that the stored file ends in exactly one \n (write_file normalization, documented; do NOT expect the file to stay newline-less).
- read_file a 200KB single-line file (no \n anywhere): must return promptly with the
explicit truncation marker once over 100000 chars, never hang.
- file_info on a 10MB single-line file returns promptly (line_count not from a full scan).
PHASE 2: PATCH SEMANTICS (checks 5-7)
- PATCH ATOMICITY (regression): write m.txt = "REPLACED\nunique line here\nSECOND HUNK SHOULD FAIL\n".
apply_patch with hunk 1 valid (delete "unique line here") and hunk 2 garbage context that matches nothing: the tool must FAIL, name hunk 2, and write NOTHING (read_file m.txt to confirm unchanged). Old bug: hunk 1 was applied, exit success, hunk 2 silently dropped.
- apply_patch dry_run=true on a valid patch: reports what would change, writes nothing
(file unchanged afterwards).
- apply_patch on a file whose last line has no trailing newline succeeds on the first try;
a failing patch against such a file mentions the newline condition in the error.
PHASE 3: SEARCH SEMANTICS (checks 8-9)
- grep is REGEX and CASE-SENSITIVE: "^[A-Z]+" matches only uppercase-led lines,
"alpha|beta" alternation works, "[" returns an Invalid regex error (no crash).
- search_files matches FILE NAMES only (glob), never file content.
PHASE 4: SHELL + ENVIRONMENT (checks 10-13)
which bash git python3 noderesolve into the toolchain;python3 --versionprints 3.x.- env-truth probe: env_status must agree with the shell. It must NOT report python/npm
missing while python3 / node+npm exist (old bug probed the literal name "python").
- Plain system commands must not die with exit 126 "bad interpreter:
/data/data/com.termux/...". Old bug: dead Termux shim scripts (bin/pm, bin/cmd, bin/am) shadowed /system binaries because the toolchain bin dir is first on PATH. Probe pm path com.android.shell (exit 0 or normal "not found" for debuggable check) and which pm cmd am.
- Shell env audit:
env | grep -E "GIT_CONFIG_GLOBAL|GIT_EXEC_PATH|SSL_CERT_FILE|HARNESS_SCRATCH"
lists GIT_CONFIG_GLOBAL; the file it points at exists and contains "[safe]" with "directory = *" (cat it to confirm).
PHASE 5: OWNERSHIP + GIT (checks 14-16)
- uid-split ownership:
idin the shell prints uid=2000(shell) while the app runs as
u0_aXXX; a file the shell creates inside an app-owned dir is owned by uid 2000. Record the observed split; DEVIATION only if a tool misreports it.
- Plain shell git in a shell-created repo:
git init -q,git switch -c feat,
git branch all succeed and "detected dubious ownership" does NOT appear (the harness exports GIT_CONFIG_GLOBAL with [safe] directory=). If it appears, the check FAILS (regression); `git -c safe.directory='' ...` remains the manual workaround.
- git_commit auto-configures identity (no "Author identity unknown") and commits.
PHASE 6: NETWORK (checks 17-18)
- http_request GET https://httpbin.org/status/418 surfaces HTTP 418 cleanly (no hang,
no crash); web_fetch https://httpbin.org/redirect/2 lands on the target page text.
- web_search returns results; https://example.com fetches with TLS verified (no cert errors).
PHASE 7: PARALLELISM (checks 19-21)
- Two task() subagents in ONE block, each reading/analyzing files in asstest/: both complete,
return factual excerpts/conclusions, consistent workspace view. Subagents are read-only by design (they have read_file/grep/search_files, not write_file).
- Same-path last-writer-wins: two sequential write_file calls to the same path; the file
ends holding exactly the second content (no interleaving or corruption).
- shell_background: start
for i in 1 2 3; do echo tick$i; sleep 1; done; bg_list shows
it running, the log contains tick1/2/3 and no heartbeat noise; bg_kill removes it from bg_list. Logs carry a per-boot token so a NEW session's proc never appends to an old session's log; entries started before this app session are marked [prev app session].
PHASE 8: SANDBOX (check 22)
- SANDBOX BOUNDARIES (must be BLOCKED; SKIP the whole phase when FULL ACCESS mode is on,
record as DEVIATION): write_file "../escape.txt", write_file "asstest/../../esc.txt", read_file "/etc/hostname", shell echo INJECT > ../escape_me.txt. With Shizuku + All-Files-Access some of these legitimately succeed: delete any leaked files (rm -f ../escape_me.txt) and mark DEVIATION, not FAIL.
PHASE 9: REGRESSION REPRO GAUNTLET (checks 23-25)
- browser_eval top-level await:
browser_evalwithconst v = await Promise.resolve(42); return v;
or return await Promise.resolve(42); succeeds and returns 42 (does NOT fail with "await is only valid in async functions").
- shell relative cwd: create
asstest/sub/, runshellwithcommand: "pwd",cwd: "asstest/sub";
returns exit 0 with path ending in /asstest/sub (does NOT error with "cwd does not exist: asstest/sub").
- grep minified 200KB line: create
asstest/long.jscontaining 200,000 characters with keyword
FINDME_TARGET embedded in the middle; grep for FINDME_TARGET returns matching line and does NOT silently drop the file.
CLEANUP: delete asstest/ and every fixture created above (including ../escape*.txt leaks); leave the workspace exactly as you found it.
OUTPUT: a PASS/FAIL table per check (1-25) grouped by phase. For any FAIL, quote the exact error message and name the regression it maps to.
Security
- Security scanPassed, 90 of 100Pattern checks on the skill's files.
- Model reviewPassed
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingapp/src/main/assets/skills/asstest/SKILL.md
Popularity
- Repository stars
- 79
- Repository forks
- 18
- 7-day trend score
- 0
Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/sanuu7/androidharness/asstest)