ravensight-playtest 0.5.2 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +319 -14
- package/addons/ravensight_driver/driver.gd +406 -8
- package/addons/ravensight_simulate/simulate.gd +360 -0
- package/docs/godot-driver.md +70 -8
- package/package.json +4 -3
- package/src/api/README.md +4 -1
- package/src/api/client.js +120 -3
- package/src/api/errors.js +17 -1
- package/src/api/http.js +43 -17
- package/src/assets/formats.js +267 -0
- package/src/assets/index.js +260 -0
- package/src/assets/integration.js +429 -0
- package/src/assets/inventory.js +337 -0
- package/src/assets/measure.js +392 -0
- package/src/cli.js +233 -0
- package/src/commands/assets.js +62 -0
- package/src/commands/check.js +4 -1
- package/src/commands/create.js +734 -0
- package/src/commands/fakeCore.js +16 -1
- package/src/commands/feature.js +845 -0
- package/src/commands/fix.js +647 -70
- package/src/commands/init.js +19 -3
- package/src/commands/lists.js +206 -0
- package/src/commands/profile.js +25 -6
- package/src/commands/punch.js +116 -0
- package/src/commands/replay.js +204 -0
- package/src/commands/resume.js +7 -0
- package/src/commands/run.js +200 -24
- package/src/commands/tape.js +74 -0
- package/src/commands/template.js +70 -0
- package/src/commands/validate.js +414 -0
- package/src/commands/validateHosted.js +292 -0
- package/src/create/scaffold.js +192 -0
- package/src/run/acceptance.js +212 -0
- package/src/run/args.js +18 -1
- package/src/run/checks.js +705 -0
- package/src/run/dimension.js +95 -0
- package/src/run/drivers/godot-observation.js +59 -11
- package/src/run/drivers/godot-project.js +201 -31
- package/src/run/drivers/godot.js +532 -45
- package/src/run/drivers/web.js +18 -0
- package/src/run/evidence.js +170 -0
- package/src/run/featureLoop.js +288 -0
- package/src/run/fixLoop.js +82 -12
- package/src/run/git.js +110 -20
- package/src/run/json.js +65 -9
- package/src/run/labsOutcome.js +136 -0
- package/src/run/liveWork.js +103 -0
- package/src/run/model.js +105 -5
- package/src/run/openPr.js +107 -0
- package/src/run/paths.js +4 -1
- package/src/run/pendingRegister.js +81 -0
- package/src/run/personaLoop.js +111 -4
- package/src/run/profile.js +68 -7
- package/src/run/replay.js +236 -0
- package/src/run/repoTools.js +227 -27
- package/src/run/report.js +7 -1
- package/src/run/resume.js +19 -1
- package/src/run/secretScan.js +35 -0
- package/src/run/settle.js +41 -0
- package/src/run/tools.js +33 -4
- package/src/run/trace.js +124 -0
- package/src/simulation/godotPack.js +112 -0
- package/src/ui/index.js +61 -9
- package/src/upload/allowlist.js +6 -2
- package/src/upload/index.js +5 -4
- package/templates/godot-2d/README.md +36 -0
- package/templates/godot-2d/addons/ravensight/LICENSE +21 -0
- package/templates/godot-2d/addons/ravensight/Ravensight.gd +1823 -0
- package/templates/godot-2d/export_presets.cfg +27 -0
- package/templates/godot-2d/gitignore +10 -0
- package/templates/godot-2d/project.godot +58 -0
- package/templates/godot-2d/scenes/main.tscn +67 -0
- package/templates/godot-2d/scripts/autoload/game_config.gd +83 -0
- package/templates/godot-2d/scripts/autoload/game_state.gd +44 -0
- package/templates/godot-2d/scripts/autoload/telemetry.gd +37 -0
- package/templates/godot-2d/scripts/main.gd +32 -0
- package/templates/godot-2d/scripts/player.gd +10 -0
- package/templates/godot-2d/scripts/state_hook.gd +16 -0
- package/templates/godot-2d/template.json +14 -0
- package/templates/godot-2d/tools/inject_release_key.sh +19 -0
- package/templates/godot-2d/tools/selftest.gd +70 -0
- package/templates/godot-3d/README.md +49 -0
- package/templates/godot-3d/addons/ravensight/LICENSE +21 -0
- package/templates/godot-3d/addons/ravensight/Ravensight.gd +1823 -0
- package/templates/godot-3d/export_presets.cfg +27 -0
- package/templates/godot-3d/gitignore +10 -0
- package/templates/godot-3d/project.godot +56 -0
- package/templates/godot-3d/scenes/main.tscn +154 -0
- package/templates/godot-3d/scripts/autoload/game_config.gd +83 -0
- package/templates/godot-3d/scripts/autoload/game_state.gd +44 -0
- package/templates/godot-3d/scripts/autoload/telemetry.gd +37 -0
- package/templates/godot-3d/scripts/beacon.gd +20 -0
- package/templates/godot-3d/scripts/main.gd +49 -0
- package/templates/godot-3d/scripts/player.gd +19 -0
- package/templates/godot-3d/scripts/state_hook.gd +25 -0
- package/templates/godot-3d/template.json +16 -0
- package/templates/godot-3d/tools/inject_release_key.sh +19 -0
- package/templates/godot-3d/tools/selftest.gd +77 -0
package/README.md
CHANGED
|
@@ -57,8 +57,8 @@ progression checks through your own game adapter. It runs locally without
|
|
|
57
57
|
model calls and saves bounded results to the same Playtest workspace. See
|
|
58
58
|
[Simulation Runner](docs/SIMULATION.md) for setup.
|
|
59
59
|
|
|
60
|
-
You need a Ravensight account and Node 22 or newer. You do not need
|
|
61
|
-
|
|
60
|
+
You need a Ravensight account and Node 22 or newer. You do not need a model
|
|
61
|
+
provider's API key: model calls go through Ravensight under the same token you
|
|
62
62
|
log in with, so there is one credential on your machine and you can revoke it
|
|
63
63
|
from the dashboard.
|
|
64
64
|
|
|
@@ -123,7 +123,7 @@ In CI, set `RAVENSIGHT_TOKEN` instead and skip `login` entirely.
|
|
|
123
123
|
|
|
124
124
|
## Commands
|
|
125
125
|
|
|
126
|
-
|
|
126
|
+
Fourteen commands. Flags below are the ones the code accepts, not the ones the
|
|
127
127
|
prose elsewhere describes; `--help` on any command prints the same list.
|
|
128
128
|
|
|
129
129
|
Every command takes these four:
|
|
@@ -274,6 +274,11 @@ login).
|
|
|
274
274
|
| `--game <gameId>` | The game to link. Optional with one visible game, or in a terminal. |
|
|
275
275
|
| `--force` | Relink a repo that is already linked. |
|
|
276
276
|
|
|
277
|
+
A repository with a `project.godot` at its root is linked with `driver:
|
|
278
|
+
godot_driver` and `build: { kind: godot_project, ref: "." }`, so `run` needs no
|
|
279
|
+
`--driver` or `--godot-project`. The concurrency written is the one `check`
|
|
280
|
+
recommends for this machine.
|
|
281
|
+
|
|
277
282
|
### personas
|
|
278
283
|
|
|
279
284
|
Lists the persona slugs `--personas` accepts, from the content pack this game
|
|
@@ -415,13 +420,15 @@ splitting the job in two is what gets everything played.
|
|
|
415
420
|
| `--personas <list>` | Comma separated persona slugs. Defaults to one, `curious-kid`; `ravensight-playtest personas` lists them. |
|
|
416
421
|
| `--driver <name>` | `playwright_web`, `godot_driver`, `cli_stdio`, or a native driver: `desktop_driver`, `unity_driver`, `unreal_driver`, `android_driver`, `ios_driver`. |
|
|
417
422
|
| `--build-url <url>` | The web build to play. |
|
|
418
|
-
| `--godot-project <dir>` | The Godot project directory. |
|
|
423
|
+
| `--godot-project <dir>` | The Godot project directory. A relative path is read from the repository root. |
|
|
424
|
+
| `--godot-path <path>` | Where Godot is, if it is not on the PATH. `RAVENSIGHT_GODOT` does the same. |
|
|
425
|
+
| `--realtime` | `godot_driver` only: let the game run in real time between actions. By default the game is paused while the persona decides and runs only while an action executes. |
|
|
419
426
|
| `--driver-config <file>` | The native driver config, or the JSON-RPC bridge config for `cli_stdio`. |
|
|
420
427
|
| `--skip-preflight` | Register without the free checks first: the build health check (any driver) and the automation probe (native drivers). The job is registered and charged even if the build or the automation server turns out to be down. |
|
|
421
428
|
| `--cli <command>` | The command that starts a text build. |
|
|
422
429
|
| `--max-actions <n>` | Lower the actions one persona may take. It can only lower the persona's own patience (and the server's per run ceiling), never raise it. |
|
|
423
430
|
| `--long` | A long persona run: twice the actions, model budget and wall time of a standard run, at twice the price. The price is read from the estimate and confirmed before any charge. |
|
|
424
|
-
| `--concurrency <n>` | Personas at once. Default
|
|
431
|
+
| `--concurrency <n>` | Personas at once. Default the number `init` wrote, which is what `check` recommends for this machine. |
|
|
425
432
|
| `--controller <name>` | One playthrough using `standard` or an available System One controller. The server must advertise and quote that exact choice. |
|
|
426
433
|
| `--compare-with jev` | Separate agent/skill and Jev playthroughs for each chosen persona. Shows their combined quote before purchase. Comparisons run one playthrough at a time. |
|
|
427
434
|
| `--record-video` | Capture the selected web or graphical Godot game locally. Does not upload the video. |
|
|
@@ -616,6 +623,14 @@ ravensight-playtest fix fnd_7g3k --no-verify
|
|
|
616
623
|
The target is either `<jobId>/<label>`, where the label is the one the report
|
|
617
624
|
gives the finding, or a bare finding id.
|
|
618
625
|
|
|
626
|
+
It can also be a punch list or blue tape item, `li_...`, when the item came
|
|
627
|
+
from a finding or a fresh-eyes finding.
|
|
628
|
+
The fix then runs exactly as it does for that finding, at the same price. After
|
|
629
|
+
the job registers, the job id is recorded on the item. The item stays open
|
|
630
|
+
until you close it. An item that did not come from a finding is refused before
|
|
631
|
+
anything is charged; `feature` is the tool for that item. See
|
|
632
|
+
[Punch list and blue tape](#punch-list-and-blue-tape-labs-beta).
|
|
633
|
+
|
|
619
634
|
| Flag | Effect |
|
|
620
635
|
|---|---|
|
|
621
636
|
| `--game <gameId>` | The game, when this repo is not linked. |
|
|
@@ -625,6 +640,11 @@ gives the finding, or a bare finding id.
|
|
|
625
640
|
| `--max-actions <n>` | Cap the turns the fix may spend. Capped at 60 whatever you ask for. |
|
|
626
641
|
| `--build-url <url>`, `--godot-project <dir>`, `--driver <name>` | Where the verify run plays, resolved exactly as `run` resolves them. |
|
|
627
642
|
| `--json` | Print the changeset instead of the summary. |
|
|
643
|
+
| `--open-pr` | Fix v2 (Labs beta) only. After a fix the verify scored as fixed, ask, then commit the fix's files, push the branch and open a pull request with the evidence report. |
|
|
644
|
+
| `--no-labs` | Run the ordinary fix even when Fix v2 is on for the game. |
|
|
645
|
+
| `--allow-tests` | Fix v2: let the checks run the project's GUT or gdUnit4 tests, and run on edits to test files. Asked at a terminal when not given. |
|
|
646
|
+
| `--allow-tool-scripts` | Fix v2: let the checks import a project whose edits touched `project.godot`, `export_presets.cfg`, `override.cfg`, `addons/`, `.godot/` or a `@tool` script. |
|
|
647
|
+
| `--godot-path <file>` | The Godot binary for the verify run and the Fix v2 checks. |
|
|
628
648
|
|
|
629
649
|
What happens, in order:
|
|
630
650
|
|
|
@@ -643,15 +663,21 @@ What happens, in order:
|
|
|
643
663
|
7. `changeset.json` and `report.md` are written, uploaded and attached to the
|
|
644
664
|
fix run, and the pull request command is printed.
|
|
645
665
|
|
|
646
|
-
**It never pushes and never commits
|
|
647
|
-
and
|
|
666
|
+
**It never pushes and never commits** unless you pass `--open-pr` to a Fix v2
|
|
667
|
+
attempt and answer yes at its prompt (see below). You are left on the branch with
|
|
648
668
|
the change in your working tree, and the last thing printed is the command to
|
|
649
669
|
open the pull request once you have read the diff.
|
|
650
670
|
|
|
651
|
-
A fix attempt is one unit
|
|
652
|
-
design intent,
|
|
653
|
-
|
|
654
|
-
in the price
|
|
671
|
+
A fix attempt is one unit, refunded in full in three cases: the finding turns
|
|
672
|
+
out to be design intent, the attempt changes nothing, or the game did not boot
|
|
673
|
+
for the verify run, in which case the $5.00 comes back because the fix could
|
|
674
|
+
not be verified. The verify run is included in the price, and the CLI always
|
|
675
|
+
completes the verify run before the fix run so the server can read it.
|
|
676
|
+
|
|
677
|
+
An account gets 5 refunds in any 30 days of a fix attempt that used model time,
|
|
678
|
+
counting a cancel or any other failure. Past that the attempt is kept, and the CLI
|
|
679
|
+
prints the server's note saying so instead of a refund. An attempt that used no model
|
|
680
|
+
time always comes back. A persona run has the same rule with 20 refunds, and a game profile with 5.
|
|
655
681
|
|
|
656
682
|
**A verify can only mean something against a build this machine serves.** The
|
|
657
683
|
change exists in your working tree and nowhere else, so a `--build-url`
|
|
@@ -663,6 +689,90 @@ branch locally before the verify, or skip it.
|
|
|
663
689
|
The verdict is printed in words: fixed below 0.35, still reproduced above 0.65,
|
|
664
690
|
unknown in between, and "not verified" when there was no verify run.
|
|
665
691
|
|
|
692
|
+
#### Fix v2 (Labs beta)
|
|
693
|
+
|
|
694
|
+
When Ravensight Labs is on for the game and the server reports Fix v2 as live,
|
|
695
|
+
`fix` adds four things. Without that answer from the server, `fix` is exactly
|
|
696
|
+
the command described above.
|
|
697
|
+
|
|
698
|
+
- **An acceptance contract before any edit.** The CLI writes
|
|
699
|
+
`{ expected, actual, reproSteps, regressionPersonas }` from the finding,
|
|
700
|
+
prints it before the price, and sends it when the job is registered. The
|
|
701
|
+
server freezes it on the job. The apply step reads it and cannot change it,
|
|
702
|
+
and the verify brief is built from it alone. If the server does not freeze
|
|
703
|
+
it, the attempt carries on as an ordinary fix and says so.
|
|
704
|
+
- **Named checks, never a shell.** The apply step may call `run_check` with one
|
|
705
|
+
of three names, and the CLI runs all three after every apply:
|
|
706
|
+
|
|
707
|
+
| Check | What runs |
|
|
708
|
+
|---|---|
|
|
709
|
+
| `godot_import` | `godot --headless --path <copy> --import`, then every script error in the log |
|
|
710
|
+
| `godot_script_check` | `--check-only` on each changed `.gd` file, after the import |
|
|
711
|
+
| `project_tests` | GUT (`addons/gut`) or gdUnit4 (`addons/gdUnit4`), whichever the project ships |
|
|
712
|
+
|
|
713
|
+
Each runs on a fresh temporary copy of the project (no `.git`, no
|
|
714
|
+
`.ravensight`), with a time limit and an output cap, and the copy is
|
|
715
|
+
deleted afterwards. A check that cannot run (no Godot, no tests) is reported
|
|
716
|
+
as unavailable, not as passed. **A fix whose `godot_import` or
|
|
717
|
+
`godot_script_check` still fails after its repairs is never uploaded:** the
|
|
718
|
+
fix run is completed as failed, the unit comes back, the edit stays on the
|
|
719
|
+
branch and the evidence stays in the run directory. Project tests that still
|
|
720
|
+
fail do not block: the change uploads, the unit is kept, and the report's
|
|
721
|
+
first line and the terminal name the failing checks.
|
|
722
|
+
- **What a fix can never touch.** The model's tools refuse, whatever a file in
|
|
723
|
+
the repository asks for: anything outside the repository or through a symbolic
|
|
724
|
+
link; `.git`; credential files by name (`.env`, keys, `.netrc`, `secrets.json`,
|
|
725
|
+
`export_presets.cfg` and the like); gitignored files, which are neither read nor
|
|
726
|
+
written because git would never show the change; a nested repository or
|
|
727
|
+
submodule; git's own controls, hooks and CI (`.gitignore`, `.gitattributes`,
|
|
728
|
+
`.husky`, `.github/workflows`, the directory `core.hooksPath` names and so on);
|
|
729
|
+
art, audio and anything that is not UTF-8 text; and a file name with control or
|
|
730
|
+
invisible characters. Each refusal goes back to the model as an answer.
|
|
731
|
+
- **What runs on your machine.** The checks and the verify run execute the
|
|
732
|
+
edited project on this machine, and the price confirmation says so. A
|
|
733
|
+
Godot import runs editor-side code, and tests run your test code with the
|
|
734
|
+
model's edits in place, so:
|
|
735
|
+
- every check gets a reduced environment: `PATH` and the locale from yours,
|
|
736
|
+
and `HOME`, the temp directories and Godot's user-data directory pointed
|
|
737
|
+
into the check's own temp root. No token, provider key, SSH agent, cloud
|
|
738
|
+
or GitHub credential is passed on. The verify run's Godot gets the
|
|
739
|
+
driver's own short allowlist, as before.
|
|
740
|
+
- no check runs when the edits touched `project.godot`,
|
|
741
|
+
`export_presets.cfg`, `override.cfg`, anything under `addons/` or
|
|
742
|
+
`.godot/`, or a `@tool` script, unless you pass `--allow-tool-scripts`;
|
|
743
|
+
nor when they touched test files (`test/`, `tests/`, `test_*.gd`,
|
|
744
|
+
`*Test.gd`, `*_test.gd`, or a directory in `.gutconfig.json`) unless you
|
|
745
|
+
allow tests. The result is `check_refused`, and the fix is not uploaded.
|
|
746
|
+
- `project_tests` runs only with `--allow-tests`, or a yes at a terminal;
|
|
747
|
+
otherwise it is unavailable.
|
|
748
|
+
- the temp copy leaves out credential files, and a check's process group is
|
|
749
|
+
killed with it at its time limit and at Ctrl-C
|
|
750
|
+
- on macOS, when `sandbox-exec` exists, each check runs under a profile
|
|
751
|
+
that denies all network access and every write outside its temp root.
|
|
752
|
+
On Linux and Windows no OS sandbox is applied: the reduced environment
|
|
753
|
+
and the temp copy are the whole of the isolation.
|
|
754
|
+
- **Bounded repair.** A failed check, or a verify that still reproduces the
|
|
755
|
+
finding (above 0.65), starts one more apply turn set inside the same run
|
|
756
|
+
budget, with the failure in front of the model and the contract unchanged.
|
|
757
|
+
At most two repairs. A repair after a verify needs a spare verify run from
|
|
758
|
+
the server to judge it; without one the result is reported, not repaired.
|
|
759
|
+
- **An evidence report as the pull request body.** `report.md` carries the
|
|
760
|
+
contract, the checks with their results and times, the files, the verify
|
|
761
|
+
before and after, the remaining risks, and keeps verified facts (what the
|
|
762
|
+
CLI and git measured) apart from model judgement (the hypothesis, the
|
|
763
|
+
description, the verify score).
|
|
764
|
+
|
|
765
|
+
`--open-pr` is the one way this command pushes. It needs Fix v2, a verify that
|
|
766
|
+
scored the fix as fixed, `gh auth status` to pass and a yes at its own prompt
|
|
767
|
+
(`--yes` agrees to the price, not to publishing). It commits only the files the
|
|
768
|
+
fix changed, pushes with a plain `git push -u origin <branch>`, never forced,
|
|
769
|
+
and runs `gh pr create` with the evidence report as the body. Later runs in this
|
|
770
|
+
repository check that pull request with your own `gh`, in the background, and tell
|
|
771
|
+
the job whether it was merged, reverted or abandoned. The URL stays in the local
|
|
772
|
+
journal, the check never holds up or fails a command, and no charge or refund reads
|
|
773
|
+
the answer. A revert pushed directly rather than through a pull request reads as
|
|
774
|
+
merged.
|
|
775
|
+
|
|
666
776
|
**A fix cannot be resumed.** Ctrl-C, or cancelling the job from the dashboard,
|
|
667
777
|
abandons the attempt and gives the unit back: whatever was written stays on the
|
|
668
778
|
branch for you to read or delete, and nothing is committed. That is different
|
|
@@ -859,12 +969,14 @@ reasoning, exactly as `profile` already does, and the same guards apply: a file
|
|
|
859
969
|
that trips the secret scan is withheld rather than read, and both files a fix
|
|
860
970
|
writes are scanned again before they are uploaded.
|
|
861
971
|
|
|
972
|
+
Your art and audio stay on your machine. The `assets` command sends nothing. During a `feature` job the model reads, through the same proxy, a list of each asset's path, type, size and measurements, and a model can never read an art or audio file's content. What uploads with the job is `changeset.json` and `report.md` as for a fix, plus how many files, how many used and unused, and how many of each kind of warning, in `report.md`, with no file names. The model writes the pull request text in `report.md`, so it may name a file it used. Placeholders are uploaded by name, because they are what you are being asked to supply. `assets-report.md` and `assets.json`, which name every file, are not on the allowlist.
|
|
973
|
+
|
|
862
974
|
Run `upload --dry-upload` or `run --dry-upload` to see the exact file list and
|
|
863
975
|
byte count before anything leaves the machine.
|
|
864
976
|
|
|
865
|
-
Model calls go to Ravensight's proxy rather than to
|
|
866
|
-
you logged in with. No
|
|
867
|
-
its client with `apiKey` explicitly null, so
|
|
977
|
+
Model calls go to Ravensight's proxy rather than to a model provider, under the
|
|
978
|
+
token you logged in with. No provider key exists on your machine, and the CLI
|
|
979
|
+
builds its client with `apiKey` explicitly null, so a provider key already in
|
|
868
980
|
your environment is never picked up and never sent anywhere.
|
|
869
981
|
|
|
870
982
|
Before anything is written to a run directory, the transcript and `usage.json`
|
|
@@ -994,6 +1106,199 @@ feedback and timing-sensitive gameplay.
|
|
|
994
1106
|
|
|
995
1107
|
Browser and Godot runners share the paid playtest lifecycle with desktop, Unity/Unreal export, Android/iOS and custom JSON-RPC adapters. Native adapters require a locally configured automation server and remain experimental until validated against your build. See [adapter setup and validation boundaries](docs/ADAPTERS.md) and the [native runner starter](docs/NATIVE_RUNNER.md); `check` probes the automation server for free before a paid native run.
|
|
996
1108
|
|
|
1109
|
+
## Validate changes (Labs beta)
|
|
1110
|
+
|
|
1111
|
+
Godot only, and only when Ravensight Labs is on for the game. Plays a branch and its base with the same personas on the same seeds and compares them. Your source stays on your machine; the commits are extracted to temp directories, and both must start before a price is shown.
|
|
1112
|
+
|
|
1113
|
+
```sh
|
|
1114
|
+
ravensight-playtest validate my-branch --base main --runs 5
|
|
1115
|
+
ravensight-playtest replay <runId> --ref my-branch --baseline
|
|
1116
|
+
```
|
|
1117
|
+
|
|
1118
|
+
Each persona run is one standard Playtest purchase of 5 AI units, and the whole plan is charged once at the start. Below five runs a side the result says not significant and shows a direction only. A run that does not earn its unit is refunded and does not count in the comparison. If one side ends with no usable run there is nothing to compare, and the runs on the other side that played and reported keep their units, because those runs happened and their reports are real. `--extend-to <n>` buys more pairs only when the first answer was too small to call. `--fail-on-regression` exits 1 for CI. A replay makes no model call and is free. See [what a replay does and does not prove](docs/REPLAY.md).
|
|
1119
|
+
|
|
1120
|
+
## Create a game (Labs, Experimental)
|
|
1121
|
+
|
|
1122
|
+
Godot 2D only, and only when the platform has Create a game switched on. It is for owners and admins, and for an account that has added at least $10 in top-ups. The balance has to reach the plan's start balance, the whole plan's price plus 25 percent, at least $2 extra, rounded up to a whole dollar, and only the price is charged. The balance has to cover the whole plan you declare, and the command shows that total before you confirm. It may not produce a game you want.
|
|
1123
|
+
|
|
1124
|
+
```bash
|
|
1125
|
+
ravensight-playtest create "A keeper walks a dark hall and lights each lamp in turn" --name "Lantern Sweep" --milestones 3 --size medium
|
|
1126
|
+
# read the design and approve it in the dashboard, then, from the project folder:
|
|
1127
|
+
ravensight-playtest create <job-id>
|
|
1128
|
+
```
|
|
1129
|
+
|
|
1130
|
+
The first command makes a new game, with its key in `ravensight_key.cfg`, which git ignores, and asks for a game design. A person approves or rejects that in the dashboard. Rejecting it gives the whole charge back, within the refund limit below. To change a design, reject it and start again from a better brief.
|
|
1131
|
+
|
|
1132
|
+
The second command writes the scaffold and checks in Godot that it imports and starts. Then it builds one milestone at a time, each an ordinary Build a feature job with its own charge, refund rules and branch, landing on `main` when it validates. A milestone that does not validate stops the run: its branch holds the attempt, and the same command tries again, which uses up another declared milestone if that attempt kept its charge. The run always stops at the declared count, however many milestones the design lists.
|
|
1133
|
+
|
|
1134
|
+
When every declared milestone has validated, a persona plays the finished game. Playable means Ravensight's own records show that run finished cleanly, and the game itself reports at least one completed core loop. A persona is a model playing the game, not a player, so play it yourself before you ship it.
|
|
1135
|
+
|
|
1136
|
+
**Stopping.** Ctrl-C, or `create <job-id> --stop` later, closes the plan. What finished stays paid for, the playable check comes back if it never started, and a milestone that was never started was never charged. If the process dies without that, run the same command to carry on. A plan left alone closes after 14 days.
|
|
1137
|
+
|
|
1138
|
+
**The refund limit.** Once the model has been used on a plan, an account can get its first charge back twice in any 30 days. Past that, a brief that is declined, a design you reject and a plan that stops before its scaffold boots all keep that charge, and the plan's page and this command say so. The persona run that never played still comes back. The command states how many you have left before you confirm.
|
|
1139
|
+
|
|
1140
|
+
**The hourly limit.** A studio has an hourly model spend limit, and a large milestone's budget can pass it. The job pauses until the top of the next hour, says how long, and carries on. Ctrl-C ends the wait. The wait costs no model time, but it does count toward the run's own time limit, so a run that passes that limit while it waits stops there and its job's refund rules apply.
|
|
1141
|
+
|
|
1142
|
+
**Your own art and audio.** Ravensight does not make any. The first command says where the files go, inside the new project: `assets`, or the folder you name with `--assets-dir`. Put them there before the second command, and each milestone reads what was measured about them and can use them, as in [Your own art and audio](#your-own-art-and-audio). Anything missing stays a placeholder. If you add files after the scaffold is written, commit them before you carry on, because a milestone only starts from a clean tree.
|
|
1143
|
+
|
|
1144
|
+
**The scaffold** is a Godot 4 2D project from the template in this package, with the public Ravensight SDK unmodified, a key loader, a player opt-out in its settings, build-time key injection for a public build, events that always say what they mean through `rs_kind`, and a `_ravensight_state()` node a playtest reads. Every visual is a placeholder primitive. Studios bring their own art and audio: nothing is generated. `README.md` in the project says how each part works, and `tools/selftest.gd` checks them.
|
|
1145
|
+
|
|
1146
|
+
| Flag | What it does |
|
|
1147
|
+
|---|---|
|
|
1148
|
+
| `--name <title>` | The working title. |
|
|
1149
|
+
| `--dir <path>` | Where to make the project, default `./<title>`. It has to be new or empty. |
|
|
1150
|
+
| `--milestones <n>` | How many milestones to buy at most, default 3. |
|
|
1151
|
+
| `--size <size>` | The largest a milestone may be: `small`, `medium` or `large`. |
|
|
1152
|
+
| `--personas <list>` | Persona slugs. |
|
|
1153
|
+
| `--godot-path <path>` | Where Godot is, if it is not on the `PATH`. |
|
|
1154
|
+
| `--headless` | Play headless: no screenshots, and no mouse or GUI input reaches the game. |
|
|
1155
|
+
| `--allow-tool-scripts` | Let the checks import edits to `project.godot`, addons, `.godot` or `@tool` scripts. |
|
|
1156
|
+
| `--stop` | Close the plan now. |
|
|
1157
|
+
| `--assets-dir <dir>` | The folder inside the project that holds your art and audio, default `assets`. |
|
|
1158
|
+
|
|
1159
|
+
## Build a feature (Labs beta)
|
|
1160
|
+
|
|
1161
|
+
2D Godot projects only, and only when Ravensight Labs is on for the game and the platform has Build a feature switched on. The specification and the job are separate, so a person approves what will be built before any code is bought.
|
|
1162
|
+
|
|
1163
|
+
```sh
|
|
1164
|
+
ravensight-playtest feature "Hold shift to sprint, draining stamina that refills at rest"
|
|
1165
|
+
# read, edit and approve it on the Labs page in the dashboard, then:
|
|
1166
|
+
ravensight-playtest feature <spec-id> --godot-project .
|
|
1167
|
+
```
|
|
1168
|
+
|
|
1169
|
+
Writing a specification is one AI unit. It covers requirements, acceptance criteria, affected systems, proposed files, the SDK events to add, and up to three test scenarios. A brief bigger than the large size, outside the bounded gameplay systems (movement, health, stamina, inventory, scoring, simple enemy behaviour, HUD widgets), or needing 3D is declined and costs nothing. A CLI token cannot edit or approve a specification.
|
|
1170
|
+
|
|
1171
|
+
Building it needs an account that has added at least $10 in top-ups, a clean working tree, and a balance at the plan's start balance (the whole plan's price plus 25 percent, at least $2 extra, rounded up to a whole dollar), shown before you confirm with only the price charged. The plan is a price set by the specification's size, plus one persona run per test scenario, charged once. Everything then happens on your machine, on a new branch that is never committed or pushed for you: plan, edits (at most 8 files for a small feature, 20 for a medium one and 40 for a large one, counted across the repairs too), the named checks, a persona playing each scenario, and a summary. A failed check or a failed scenario starts a repair, at most two, and the specification frozen on the job never moves.
|
|
1172
|
+
|
|
1173
|
+
The whole plan comes back if nothing changed or the change does not pass its checks, up to three times in any 30 days per account once a job has used model time. Past that the feature's own price is kept, the command and the job say so, and scenario runs that did not play still come back. A job that used no model time is always refunded. The unit is kept once a change is delivered, verified or not, and the report says which. Verified means the server's own records show every scenario's persona run finished with an accepted report, no script errors and no blocker or major finding; those personas are model players, so play it yourself before you ship it. After a repair, a scenario that already passed replays its recorded inputs for free, and if they no longer replay the same it stops counting as passed.
|
|
1174
|
+
|
|
1175
|
+
Studios bring their own art and audio. See [Your own art and audio](#your-own-art-and-audio). If the feature needs an asset the project lacks, it is built with a placeholder primitive and named in the report.
|
|
1176
|
+
|
|
1177
|
+
| Flag | Effect |
|
|
1178
|
+
|---|---|
|
|
1179
|
+
| `--game <gameId>` | The game, when this repo is not linked. |
|
|
1180
|
+
| `--assets-dir <dir>` | The folder inside the project that holds your art and audio, default `assets`. |
|
|
1181
|
+
| `--branch <name>` | The branch to create, default `ravensight/feature-<title>-<hex>`. |
|
|
1182
|
+
| `--personas <list>` | Who plays the scenarios, used in turn. |
|
|
1183
|
+
| `--godot-project <dir>`, `--godot-path <path>` | Where the project and Godot are. |
|
|
1184
|
+
| `--headless` | Play the scenarios headless: no screenshots, and no mouse or GUI input reaches the game. |
|
|
1185
|
+
| `--allow-tests`, `--allow-tool-scripts` | The same two permissions a fix asks for. |
|
|
1186
|
+
| `--open-pr` | After a verified feature, ask, then commit its files, push the branch and open a pull request with your own `gh`. |
|
|
1187
|
+
| `--max-actions <n>` | A lower ceiling on model turns in the apply loop. |
|
|
1188
|
+
|
|
1189
|
+
### Your own art and audio
|
|
1190
|
+
|
|
1191
|
+
Ravensight does not make art or audio, and there is no separate price for using yours. Put your files in a folder inside the project, `assets` unless you say otherwise (`--assets-dir`, or `assets_dir` in `.ravensight/config.json`), and a feature uses them.
|
|
1192
|
+
|
|
1193
|
+
```sh
|
|
1194
|
+
ravensight-playtest assets
|
|
1195
|
+
ravensight-playtest assets --assets-dir art --grid 32
|
|
1196
|
+
```
|
|
1197
|
+
|
|
1198
|
+
`assets` reads that folder on your machine and prints each file with what was measured. It needs no login, sends nothing and costs nothing, so run it as often as you like.
|
|
1199
|
+
|
|
1200
|
+
| What | Measured for |
|
|
1201
|
+
|---|---|
|
|
1202
|
+
| Type and size | Every file |
|
|
1203
|
+
| Width, height, transparency, pixel pitch, layout guess (one picture, a tile, a strip or a sheet) | PNG |
|
|
1204
|
+
| Format, channels, sample rate, length | WAV and Ogg |
|
|
1205
|
+
|
|
1206
|
+
Other formats are listed by type and size only. `--grid <n>` warns about any PNG that does not measure `n` art pixels across.
|
|
1207
|
+
|
|
1208
|
+
The warnings come from wiring real art into a real game:
|
|
1209
|
+
|
|
1210
|
+
- **The real pixel pitch.** Measured from the pixels, not from what a file was meant to be. A file described as a 32 grid can be 100 or more art pixels across.
|
|
1211
|
+
- **Alpha before trimming.** Faint, nearly invisible pixels can reach the edge of the canvas, so a trim keeps almost all of it. The warning gives the box both ways.
|
|
1212
|
+
- **Tiles with their own frame.** A frame around each tile draws a grid across the floor. Use tiles with no per-tile frame, or one seamless texture.
|
|
1213
|
+
- **Sound Godot will not import.** Opus in an Ogg file, compressed WAV and WAV saved with the extended header.
|
|
1214
|
+
- **Smooth filtering on pixel art.** Pixel art blurs when the project's default filter is smooth, unless the node drawing it sets the nearest filter.
|
|
1215
|
+
|
|
1216
|
+
During a feature job the model reads a list of those measurements, never the files. It cannot read or quote an art or audio file, and it cannot write one, or anything else in the declared folder except the `.import` settings beside a file. Three more checks join the others: `asset_references` (every asset the change names exists, with that exact case, inside the project), `asset_import` (real Godot imports it) and `pixel_art_settings` (pixel art the change names has the nearest filter and clean import settings). A reference that does not resolve or a file that does not import blocks the change, and the job is refunded, once its repairs are used. A pixel art setting that stays wrong is listed as a risk. Only what the change names can fail a job.
|
|
1217
|
+
|
|
1218
|
+
The report says what was wired in, what the project uses, what is unused and which placeholders are left for you to supply. The names are in `assets-report.md` in the run directory, which stays on your machine.
|
|
1219
|
+
|
|
1220
|
+
## Punch list and blue tape (Labs beta)
|
|
1221
|
+
|
|
1222
|
+
Adding, closing, promoting and drafting need Ravensight Labs on for the game.
|
|
1223
|
+
The list commands still read when Labs is off; they show an empty list then.
|
|
1224
|
+
The dashboard shows the same two lists.
|
|
1225
|
+
|
|
1226
|
+
The punch list holds what has to be finished before handover. You close the
|
|
1227
|
+
items one at a time. Blue tape holds small annoyances a new player meets in the
|
|
1228
|
+
first minutes. Capture them fast, then promote the ones that matter to the
|
|
1229
|
+
punch list.
|
|
1230
|
+
|
|
1231
|
+
```sh
|
|
1232
|
+
ravensight-playtest punch list # open items; --status open|done|dropped|all
|
|
1233
|
+
ravensight-playtest punch add "Make the jump button respond on the first press."
|
|
1234
|
+
ravensight-playtest punch done li_9f2c
|
|
1235
|
+
ravensight-playtest punch drop li_9f2c
|
|
1236
|
+
ravensight-playtest punch draft # one AI unit; prints proposals, saves nothing
|
|
1237
|
+
ravensight-playtest punch draft --accept # one AI unit; adds every proposal
|
|
1238
|
+
|
|
1239
|
+
ravensight-playtest tape "The title music is too loud."
|
|
1240
|
+
ravensight-playtest tape list
|
|
1241
|
+
ravensight-playtest tape promote li_4a1b # moves it to the punch list
|
|
1242
|
+
ravensight-playtest tape drop li_4a1b
|
|
1243
|
+
|
|
1244
|
+
ravensight-playtest fix li_9f2c # an item that came from a finding
|
|
1245
|
+
```
|
|
1246
|
+
|
|
1247
|
+
Reading, adding, closing and promoting are free. `punch draft` proposes items
|
|
1248
|
+
from the game's findings and specifications. It costs one AI unit, and nothing
|
|
1249
|
+
when there is nothing to propose. Without `--accept` it saves nothing. It asks
|
|
1250
|
+
before it spends, so pass `--yes` in a script. A list holds at most 500 open
|
|
1251
|
+
items.
|
|
1252
|
+
|
|
1253
|
+
Each added item gets a free plain-language check, printed as hints under it:
|
|
1254
|
+
long sentences, two instructions in one sentence, passive voice, and words with
|
|
1255
|
+
a simpler choice. The hints follow the rules of Simplified Technical English.
|
|
1256
|
+
They never block an item.
|
|
1257
|
+
|
|
1258
|
+
No command here closes an item for you, including `fix li_...`.
|
|
1259
|
+
|
|
1260
|
+
| Flag | Effect |
|
|
1261
|
+
|---|---|
|
|
1262
|
+
| `--game <gameId>` | The game, when this repo is not linked. |
|
|
1263
|
+
| `--status <status>` | `list` only: `open` (the default), `done`, `dropped` or `all`. |
|
|
1264
|
+
| `--accept` | `punch draft` only: add every proposal to the punch list. |
|
|
1265
|
+
| `--json` | Print the server's answer as JSON. |
|
|
1266
|
+
|
|
1267
|
+
### Fresh eyes
|
|
1268
|
+
|
|
1269
|
+
A fresh-eyes playtest is a persona run with the `fresh-eyes` persona: a player
|
|
1270
|
+
in their first session who reports only small friction. When the job finishes,
|
|
1271
|
+
each of its findings becomes an open blue tape item.
|
|
1272
|
+
|
|
1273
|
+
```sh
|
|
1274
|
+
ravensight-playtest personas # check that fresh-eyes is listed for your game
|
|
1275
|
+
ravensight-playtest run --personas fresh-eyes
|
|
1276
|
+
```
|
|
1277
|
+
|
|
1278
|
+
It is priced as any persona run is. Personas come from the content pack the
|
|
1279
|
+
server sends, so `fresh-eyes` works once the server lists it. No CLI upgrade is
|
|
1280
|
+
needed for it.
|
|
1281
|
+
|
|
1282
|
+
## 3D proof of concept (Labs, Alpha)
|
|
1283
|
+
|
|
1284
|
+
Labs beta is Godot 2D. There is one 3D template, for trying Build a feature and Validate changes on a 3D project. That is the whole of the Alpha: `create` does not make a 3D game from a brief and refuses to try, and how well a real model builds 3D has not been measured. It has no switch of its own, needing the same Labs opt-in and capability switches, and no price of its own: the jobs cost what they cost on a 2D project.
|
|
1285
|
+
|
|
1286
|
+
```sh
|
|
1287
|
+
ravensight-playtest template godot-3d --game <gameId> --dir beacon-walk --name "Beacon Walk"
|
|
1288
|
+
cd beacon-walk
|
|
1289
|
+
ravensight-playtest feature "Each beacon is worth two points" --alpha-3d
|
|
1290
|
+
# read, edit and approve it on the Labs page in the dashboard, then:
|
|
1291
|
+
ravensight-playtest feature <spec-id> --alpha-3d
|
|
1292
|
+
# commit the branch, then:
|
|
1293
|
+
ravensight-playtest validate <branch> --base main --alpha-3d
|
|
1294
|
+
```
|
|
1295
|
+
|
|
1296
|
+
**The template** is a small project of primitive meshes: walk to a beacon, it moves, and that is one pass of the core loop. It has the public Ravensight SDK, unmodified, the same key loader, opt-out and `tools/selftest.gd` as the 2D template, and a `_ravensight_state()` node that reports positions in three axes. It is written with no key, so the SDK does nothing until you add this game's key. Writing it costs nothing and no model is involved.
|
|
1297
|
+
|
|
1298
|
+
**`--alpha-3d`** is how you ask. Without it, `feature` and `validate` refuse a project whose main scene has a 3D root, for free. With it on a 2D project they refuse too, and a specification written for one kind of project does not build on the other.
|
|
1299
|
+
|
|
1300
|
+
**What works differently.** A persona reads positions as `@(x,y,z)` in world units, and can click a node by its path, where the active camera draws it. It plays with keys and input actions: it cannot steer a camera with the mouse, so a feature that needs mouse look cannot be played by a persona. Headless, as in 2D, no mouse input reaches the game. Your own models are listed by `assets` by type and size, are never read by the model, and the checks confirm that Godot imports the ones a change names. See [docs/REPLAY.md](docs/REPLAY.md) for what replays on 3D.
|
|
1301
|
+
|
|
997
1302
|
## Simulation Runner
|
|
998
1303
|
|
|
999
1304
|
Available since `0.4.0`. Simulation Runner requires macOS or Linux (including WSL); native Windows is refused before purchase.
|