{"id":85538,"plugin_id":"plugins_6abfde9851388191aa6d87959f4703c4","kind":"skill","collection_source":"plugin_package","comparison_source":null,"observed_at":"2026-11-07T06:11:23.961Z","digest":"581087dcfce97ad15b7908ce5c5cbbf73a2cf3bedd6df03e041db3c19f4aa9d3","against":null,"payload":{"description":"Build, check and test SightLab 2 (Vizard) eye-tracking experiments from a research brief; use for any SightLab 2 scripting, GUI or data question.","included_files":[{"relative_path":"agents/openai.yaml","size_in_bytes":95},{"relative_path":"api/resources.json","size_in_bytes":43590},{"relative_path":"api/resources.md","size_in_bytes":18763},{"relative_path":"api/sightlab-api.json","size_in_bytes":117584},{"relative_path":"api/sightlab-api.md","size_in_bytes":13405},{"relative_path":"api/undocumented.md","size_in_bytes":3570},{"relative_path":"brief/EXAMPLE-gaze-dwell.md","size_in_bytes":2669},{"relative_path":"brief/TEMPLATE.md","size_in_bytes":2744},{"relative_path":"evals/README.md","size_in_bytes":2703},{"relative_path":"evals/gaze-dwell-rating/acceptance.md","size_in_bytes":946},{"relative_path":"evals/gaze-dwell-rating/autopilot-assertions.json","size_in_bytes":480},{"relative_path":"evals/gaze-dwell-rating/brief.md","size_in_bytes":2837},{"relative_path":"evals/memory-two-conditions/acceptance.md","size_in_bytes":769},{"relative_path":"evals/memory-two-conditions/autopilot-assertions.json","size_in_bytes":557},{"relative_path":"evals/memory-two-conditions/brief.md","size_in_bytes":2821},{"relative_path":"evals/nback-biopac-markers/acceptance.md","size_in_bytes":1404},{"relative_path":"evals/nback-biopac-markers/autopilot-assertions.json","size_in_bytes":462},{"relative_path":"evals/nback-biopac-markers/brief.md","size_in_bytes":2842},{"relative_path":"evals/stim-visual-search/acceptance.md","size_in_bytes":843},{"relative_path":"evals/stim-visual-search/autopilot-assertions.json","size_in_bytes":528},{"relative_path":"evals/stim-visual-search/brief.md","size_in_bytes":2659},{"relative_path":"examples/curated/Biopac_Saving_to_Data_Files_Biopac_Saving_to_Data_Files.py","size_in_bytes":2045},{"relative_path":"examples/curated/Custom_Data_Saving_SavingCustomData.py","size_in_bytes":2090},{"relative_path":"examples/curated/Gaze_Based_Interactions_Gaze_Based_Interaction_Simple.py","size_in_bytes":1725},{"relative_path":"examples/curated/Instructions_instructions_example.py","size_in_bytes":1016},{"relative_path":"examples/curated/Memory_Experiment_Memory_Task.py","size_in_bytes":5295},{"relative_path":"examples/curated/Proximity_Sensors_proximitySensors_example.py","size_in_bytes":5028},{"relative_path":"examples/curated/Randomize_SightLab_VR_Randomize_Blocks.py","size_in_bytes":948},{"relative_path":"examples/curated/RatingScale_GUI_RatingScale_Sample.py","size_in_bytes":1292},{"relative_path":"examples/curated/Reaction_Time_reactionTime.py","size_in_bytes":4925},{"relative_path":"examples/curated/STIM_Files_STIM_File_example.py","size_in_bytes":3215},{"relative_path":"examples/curated/Sample_Code_SightLabVR_NonGUI.py","size_in_bytes":1184},{"relative_path":"examples/curated/Sample_Code_SightLab_VR_GUI.py","size_in_bytes":600},{"relative_path":"examples/index.json","size_in_bytes":82437},{"relative_path":"examples/index.md","size_in_bytes":23177},{"relative_path":"guides/360-media.md","size_in_bytes":12751},{"relative_path":"guides/360-moving-regions.md","size_in_bytes":7649},{"relative_path":"guides/ai-agents.md","size_in_bytes":11443},{"relative_path":"guides/analysis-and-visualization.md","size_in_bytes":3888},{"relative_path":"guides/avatar-agents.md","size_in_bytes":12532},{"relative_path":"guides/controls.md","size_in_bytes":8582},{"relative_path":"guides/dashboard.md","size_in_bytes":2367},{"relative_path":"guides/data-recorder.md","size_in_bytes":11754},{"relative_path":"guides/driving.md","size_in_bytes":15060},{"relative_path":"guides/e-learning-lab.md","size_in_bytes":13390},{"relative_path":"guides/first-project.md","size_in_bytes":7041},{"relative_path":"guides/full-body-avatars.md","size_in_bytes":10344},{"relative_path":"guides/hardware.md","size_in_bytes":4765},{"relative_path":"guides/index.md","size_in_bytes":2919},{"relative_path":"guides/inspector.md","size_in_bytes":5934},{"relative_path":"guides/instructions.md","size_in_bytes":2757},{"relative_path":"guides/models-and-assets.md","size_in_bytes":10364},{"relative_path":"guides/multi-user.md","size_in_bytes":3617},{"relative_path":"guides/object-detection.md","size_in_bytes":3410},{"relative_path":"guides/replay.md","size_in_bytes":4075},{"relative_path":"guides/street-walking.md","size_in_bytes":6173},{"relative_path":"guides/virtual-screen.md","size_in_bytes":2613},{"relative_path":"harness/README.md","size_in_bytes":9972},{"relative_path":"harness/autopilot.py","size_in_bytes":19695},{"relative_path":"harness/autopilot_core.py","size_in_bytes":22877},{"relative_path":"harness/check.py","size_in_bytes":20805},{"relative_path":"patterns/biopac-markers.md","size_in_bytes":3147},{"relative_path":"patterns/gaze-contingent-events.md","size_in_bytes":3035},{"relative_path":"patterns/randomized-conditions.md","size_in_bytes":3011},{"relative_path":"patterns/rating-after-trial.md","size_in_bytes":2931},{"relative_path":"patterns/show-hide-objects-per-trial.md","size_in_bytes":4240},{"relative_path":"patterns/stim-file-stimuli.md","size_in_bytes":3041},{"relative_path":"reference/README.md","size_in_bytes":1110},{"relative_path":"reference/replay.py","size_in_bytes":221923},{"relative_path":"reference/sightlab.py","size_in_bytes":635180},{"relative_path":"reference/viz.py","size_in_bytes":371113},{"relative_path":"register/capabilities-and-custom-development.md","size_in_bytes":5865},{"relative_path":"rules/common-mistakes.md","size_in_bytes":5043},{"relative_path":"rules/environments-and-resources.md","size_in_bytes":6068},{"relative_path":"rules/gaze-objects-and-data.md","size_in_bytes":4943},{"relative_path":"rules/gui-vs-code.md","size_in_bytes":4817},{"relative_path":"rules/imports-and-frame.md","size_in_bytes":5416},{"relative_path":"rules/trials-and-instructions.md","size_in_bytes":2942}],"name":"sightlab-2","skill_md_contents":"---\nname: sightlab-2\ndescription: Build, check and test SightLab 2 (Vizard) eye-tracking experiments from a research brief; use for any SightLab 2 scripting, GUI or data question.\n---\n\n# SightLab 2 AI Kit\n\nYou are helping a researcher build a VR experiment in WorldViz SightLab 2, a Python\nlibrary that runs inside Vizard 7 or 8 on Windows. This kit was generated from\n`sightlab_utils` 2.9.3 on 2026-11-06; the installed version may be newer.\nSightLab scripts are short and regular. Keep to the frame in `rules/imports-and-frame.md`,\ncompose from `patterns/`, and look up every method in `api/sightlab-api.md` before using it.\n\n## Which SightLab\n\nDefault to SightLab 2 unless the user or project indicates SightLab 3. Answer general\nquestions and generate SightLab 2 examples without requiring a generation choice.\nRespect an explicitly stated version; inspect relevant project files when editing code.\nAsk only when conflicting or ambiguous version information materially changes the answer.\nWhen nothing indicates the generation, say in one line that you are assuming SightLab 2,\nso a SightLab 3 user can correct it.\n\nThe import line decides. `import sightlab_utils.sightlab as sl` (any `sightlab_utils`\nimport) is SightLab 2; `import sightlab` or `from sightlab import ...` is SightLab 3, unless\nthe project has its own `sightlab.py` beside the script. A `.oep.json` or `.oep-project.json`\nfile in the project is SightLab 3. On a PC that can be read: Vizard's\n`bin\\lib\\site-packages\\sightlab_utils` is SightLab 2, and `site-packages\\sightlab` with a\n`_sightlab_version.py` is SightLab 3; both can be installed side by side, so the project's\nimport line still decides. Both generations define a class named `SightLab`, so the class\nname alone decides nothing. Keep each generation's APIs and examples separate.\n\nThis skill contains SightLab 2 references. For confirmed SightLab 3 work, use a relevant\nSightLab 3 skill if available; otherwise disclose the coverage gap and consult authoritative\ndocumentation where available. Continue useful planning and version-independent work\nwithout inventing SightLab 3 APIs or applying SightLab 2 code as if it were compatible.\nMention planned SightLab 3 platform support only when relevant, distinguishing plans from\nreleased functionality as described in `register/capabilities-and-custom-development.md`.\n\n## On this host\n\nThis plugin provides instructions and reference material for SightLab 2, plus the harness\nunder `harness/` in this skill's folder (`<kit>` is the folder that holds this SKILL.md).\nConfirm the generation, then size the request (section 0). What you can run depends on the\ntools and environment this session actually has, not on the product's name; check them\nfirst. The two checks need different things:\n\n<!-- openai-review-wording -->\n- Static check: access to the script and this skill's folder, and a Python 3.8+\n  interpreter. When you have them, run `python \"<kit>/harness/check.py\" <script>` after\n  every edit.\n- Vizard test: additionally a Windows environment where you can run the installed programs,\n  with SightLab 2 and Vizard 8. When you have it and the researcher's permission, run\n  `\"C:\\Program Files\\WorldViz\\Vizard8\\bin\\winviz.exe\" \"<kit>/harness/autopilot.py\" \"<absolute path to script>\"`\n  once at the end of a simple build, or at the end of every build step otherwise (in\n  PowerShell, prefix the quoted executable with `&`). Say what a run will check; before the\n  first launch in a session ask, unless the request already asked for a run or a test.\n- For any check you cannot run here: give the researcher the script and the command to run\n  on the SightLab PC, or the installed kit (Claude Code:\n  `claude plugin install sightlab --marketplace worldviz/sightlab-ai-kit`, then\n  `/sightlab:check <script>`; Codex: `codex plugin marketplace add\n  worldviz/sightlab-ai-kit`, install the SightLab VR Assistant, ask it to check the script),\n  ask them to paste the results back, and say clearly which checks were not performed.\n\nGenerated scripts target the researcher's own licensed SightLab/Vizard installation.\n\n\n## 0. Size the request\n\nNot every request is a build. Decide which of these it is, and say so in one line:\n\n- **A question** (\"does SightLab support face tracking?\", \"what does `endFade` do?\"): answer\n  from `api/`, `rules/`, `guides/` and `reference/`, naming the file and line. No brief, no\n  file changes, no checks, no Vizard, no `REVIEW.md`.\n- **A small edit** (a rating scale, a column, a trial count, a text, a resource swap): make\n  the minimal change, run `check.py` on the script, fix what it reports, and say in two lines\n  what changed and what the checker found. No brief, no `REVIEW.md`. Run the autopilot only\n  when the edit changes what happens at run time (trial flow, prompts, events, data written):\n  say what it will check; when the request already asked for a test (\"fix it and test it\"),\n  go ahead, otherwise ask as section 4 describes.\n- **A new study, a restructuring, or a bug you can only see by running**: the full workflow\n  below, from the brief to the autopilot and `REVIEW.md`.\n\nWhen in doubt between the first two, do the smaller thing and offer the larger one.\n\n## 1. Capabilities and custom development\n\nWhen capability, platform or integration constraints matter, consult\n`register/capabilities-and-custom-development.md`. Use it to guide implementation and\nexplain limitations, not to reject requests merely because they require custom development.\n\nDistinguish built-in features, custom extensions, unverified approaches and specific\ntechnical incompatibilities. Investigate relevant source, examples and authoritative\ndocumentation when needed; an absent API-map entry does not establish impossibility.\nHelp with new features, drivers and complex tasks in manageable stages. Explain what\nrequires hardware or additional information, and continue work that can be done reliably.\nWorldViz support can complement this work rather than automatically ending assistance.\n\n## 2. Find the install\n\nPrefer the researcher's installed SightLab over anything bundled here, where this host can\nread files:\n\n- the package: `C:\\Program Files\\WorldViz\\Vizard8\\bin\\lib\\site-packages\\sightlab_utils` (or\n  `Vizard7`); its `__init__.py` has `__version__`. The registry key\n  `HKLM\\SOFTWARE\\WorldViz\\Sightlab2` has a `Path` value written by the SightLab 2 installer\n  (seen on a 2.9.3 install: `C:\\Program Files\\WorldViz\\Sightlab2`) that points at the\n  resources, not the package;\n- the projects folder with `ExampleScripts/`: `Documents\\Sightlab2`;\n- resources: `C:\\Program Files\\WorldViz\\Sightlab2\\sightlab_resources`;\n- Vizard: `C:\\Program Files\\WorldViz\\Vizard8\\bin\\winviz.exe`.\n\nFor an edit or a build, note the installed version in your first message (a question needs\nit only when the answer depends on the version). When you can read the install, run\n`python <kit>/harness/check.py <script> --sightlab-utils <package dir>` so the checks use the\nreal API.\n\n`<kit>` is the folder this `SKILL.md` lives in (the plugin's skill folder; the host section\nabove gives its exact form). The harness runs from there, never from a copy in the project,\nand takes the script's absolute path; everything it writes goes to `.autopilot/` beside the\nscript.\n\n## 3. The brief\n\nThe researcher does not fill in a form. They describe the study, paste a paper, or bring a\nbrief from the hosted Fit Check. You assemble `brief/TEMPLATE.md` from that:\n\n- ask only about ambiguities that change what gets built: how a response is given, what one\n  trial is, how many, which hardware is in the room;\n- fill everything else with sensible defaults marked `(assumed)` so they can be corrected;\n- a Fit Check brief arrives with eleven of twelve sections; ask one targeted hardware question.\n\nStart the skeleton as soon as design, procedure, responses, trials and hardware are settled.\n`brief/EXAMPLE-gaze-dwell.md` shows a finished one.\n\n## 4. The build\n\nWork through these steps on your own: **skeleton → trials → responses → data → polish.**\nFirst decide which way the build runs, and say so in one line:\n\n- **A simple study** (one 3D scene; responses by key, trigger or rating scale; no multi-user,\n  360 media, external application, AI agent, object detection, trackers or custom\n  vizconnect; BIOPAC markers alone do not count against it): build all the steps straight\n  through, with `check.py` after every edit, then one desktop run at the end. If it fails,\n  fix it and run again, up to two attempts (the stop rule below). No headset stop mid-build:\n  the only checkpoint is handoff.\n- **Anything else**, or whenever the researcher asks for it: a desktop run at the end of\n  every step, and a stop for a headset look after the skeleton.\n\nThen:\n\n- after every edit, run `python <kit>/harness/check.py <script>` and fix every error; read every\n  warning against the brief (`W_NO_GAZE_OBJECT` is a question, not noise);\n- the desktop run (once at the end of a simple study, at the end of every step otherwise),\n  where the host can run commands: `\"C:\\Program Files\\WorldViz\\Vizard8\\bin\\winviz.exe\" <kit>/harness/autopilot.py\n  <absolute path to script>`, then read `autopilot-report.json` in the run folder it names\n  (`harness/README.md` explains it): `failed` means fix it; `smoke-passed` means it runs but\n  the harness had to intervene, say where; `behaviour-verified` means it did what the brief\n  says, in desktop mode: every trial completed, every assertion passed; say which assertions,\n  never \"fully verified\". Write the brief's measures as `autopilot-assertions.json` beside the\n  script so the report checks them (`trials_exact` when the brief fixes the trial count).\n  Before the first launch in a session, say what the run will check. When the request\n  already asks for a run or a test (\"build and test it\", \"make sure it runs\"), that is the\n  permission: go ahead. Otherwise ask once: with the host's question tool where it has one,\n  or else as a plain chat question that ends your turn and waits for the reply. Never imply\n  an approval dialog or button the host has not shown you. Never ask twice: an earlier yes in\n  the session, or the host's own command-approval step, is the permission.\n  Later launches in the same session need only the one line.\n  **Opt-out:** when the researcher says not to run Vizard, or a file named `NO_AUTOPILOT`\n  sits in the project folder, do not launch the autopilot (the harness refuses on its own\n  when it sees that file): run `check.py` only, and say in `REVIEW.md` that the run was\n  skipped and what it would have checked;\n- stop only for: a decision the brief does not settle, a `failed` verdict you cannot fix in\n  two attempts, or a headset checkpoint. Checkpoints: before handoff always; after the\n  skeleton (first look at the scene and trial flow) unless the study is simple. The\n  researcher can ask for one after every step.\n\nAt each stop write `REVIEW.md`, starting with the kit version from the line at the top of\nthis file: which way the build ran (simple, or step by step) and why, what changed, the\nverdict and interventions, what to look for in the headset, the questions you need answered. Everything on the report's `needs_human`\nlist (real eye tracking, BIOPAC delivery, timing feel) is always theirs to check.\n\n## 5. Rules\n\nRead these before writing code; they are short and each one has cost someone a day:\n\n- `rules/imports-and-frame.md` — the two imports, the frame, the three closing lines, waits\n- `rules/gaze-objects-and-data.md` — `addSceneObject(..., gaze=True)`, built-in gaze events, what is written\n- `rules/gui-vs-code.md` — GUI, code or both; what each side owns\n- `rules/environments-and-resources.md` — shipped environments, `vizfx.addChild`, `headlight`\n- `rules/trials-and-instructions.md` — `startTrial`/`endTrial` arguments, prompts, timing\n- `rules/common-mistakes.md` — the checker's codes and the mistakes behind them\n\nWrite BIOPAC in capitals.\n\n## 6. When to read what\n\n| Need | Read |\n|---|---|\n| the exact name, arguments and defaults of a method | `api/sightlab-api.md` (generated from the source; trust it over memory) |\n| how to do a kind of study (gaze-contingent, ratings, STIM files, conditions, BIOPAC markers) | `patterns/<name>.md`, then copy its complete script |\n| a shipped example to learn from or copy | `examples/index.md`, then the script in the researcher's `ExampleScripts/` or `examples/curated/` here |\n| whether an environment, object or media file ships, and its exact name | `api/resources.md` (never guess a file name) |\n| capability constraints, platform alternatives and custom integrations | `register/capabilities-and-custom-development.md` |\n| a topic in depth (a first project in the GUI, instructions, controls, models and assets, hardware configurations, full-body avatars, Inspector scene editing, multi-user, object detection, 360 media, 360 moving regions, scripted avatar agents, E-Learning Lab, Street Walking, replay, dashboard, virtual screen, driving, external apps, AI agents, analysis) | `guides/index.md`, then the guide it names |\n| a feature, device or example this kit does not cover (one not in `guides/index.md` or `examples/index.md`, such as another downloadable demo) | the SightLab documentation at help.worldviz.com/sightlab (fetch the page when this host can browse) and the example's own scripts in the researcher's `ExampleScripts/`; when a page and the installed code disagree, the code wins, since some pages are out of date; say which source you used |\n| what SightLab or Vizard actually does when the rules and the API map are silent (what a prompt does to the scene, what an event carries, what a method does with its argument) | `reference/sightlab.py`, `reference/viz.py`, `reference/replay.py` (`reference/README.md`); on an installed machine the installed copies first |\n\nDo not paste large parts of the reference files or the source into your answers; cite the\nfile and quote the lines that matter.\n"},"changes":[],"summary":"First saved snapshot. No earlier version is available for comparison.","summary_kind":"deterministic","summary_metadata":{}}