| name | dogfood-verification |
| description | Internal process for dogfooding the ObjectStack platform — booting a real example app (showcase / CRM) and driving it in a browser as a real user or admin to find runtime bugs that static checks and unit tests miss, then fixing and shipping cleanly. Use whenever the task is "verify in the browser", "act as a real admin/user", "dogfood the Setup/Studio app", or browser-verify a change in the running app. NOT a customer-published skill — this is internal agent tooling (lives in .claude/, never in the published `skills/` dir).
|
| metadata | {"internal":true} |
Dogfood verification
Hard-won process for booting and driving the real app. Three pillars: isolate
the environment, know the build model, verify visually/authoritatively
before asserting. Skipping pillar 1 or 3 is where time gets burned.
0. Pre-flight — isolate the environment (do this FIRST)
The dev working tree, the dev-server port, and the preview browser are all
shared: a parallel Claude/dogfood session will yank the browser tab, leave
unsaved drafts that block navigation, and dirty the working tree. Isolate up front:
1. Boot
2. Build/runtime model — batch, then ONE restart
3. Verify — visual / API first, DOM last (the anti-false-positive rule)
The biggest trap: preview_eval DOM queries right after navigation return
transitional/empty results (React hasn't hydrated) → you conclude "nav is empty /
feature is broken" and it's a lie.
4. Browser escape hatches (gotchas)
- Stuck page / blocked navigation (unsaved-changes
beforeunload, shared tab): neutralize then navigate —
Object.defineProperty(Event.prototype,'returnValue',{configurable:true,get:()=>undefined,set:()=>{}});
const op=Event.prototype.preventDefault;
Event.prototype.preventDefault=function(){ if(this&&this.type==='beforeunload')return; return op.apply(this,arguments); };
window.onbeforeunload=null; location.replace('<url>');
- Login / React controlled inputs:
preview_fill sets .value but doesn't fire React
onChange → form submits empty. Use the native setter + dispatch input+change, or
just POST the auth endpoint via fetch from the page.
- Cross-origin: pin
fetch to your absolute http://localhost:<port> so a drifted tab
doesn't hit the wrong server; credentials:'include' for cookie-authed routes.
5. Ship — isolated PR (when the working tree is shared/dirty)
6. Shell hygiene
- zsh eats
--include=*.ts when the glob doesn't match → use the dedicated Grep tool,
or quote the glob.
- Prefer explicit args over multi-line
VAR="a b c" in compound git commands.
Golden rule: if a finding would be severe ("the whole settings surface is unreachable"),
treat your first read as a hypothesis and disprove it with a screenshot or the server's own
metadata before writing it down. Most "P0s" found this way are hydration artifacts.