@bongos/core 1.20.73 → 1.20.75

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.
Files changed (43) hide show
  1. package/.bongos-core.json +66 -46
  2. package/clients/bongos-client/README.md +1 -1
  3. package/clients/bongos-client/bongos-client.global.js +4 -0
  4. package/clients/bongos-client/index.cjs +4 -0
  5. package/clients/bongos-client/index.d.ts +8 -0
  6. package/clients/bongos-client/index.mjs +4 -0
  7. package/docs/adr/0359-nobody-sets-a-module-score-by-hand-metic-can-ask-for-a-re-check.md +40 -0
  8. package/docs/adr/README.md +1 -0
  9. package/docs/api/openapi.json +185 -3
  10. package/docs/api-reference.md +5 -3
  11. package/docs/architecture.md +1 -1
  12. package/docs/copy-inventory.md +447 -373
  13. package/docs/copy-registry.json +1157 -468
  14. package/docs/module-api-changelog.md +4 -0
  15. package/docs/page-inventory.json +6 -1
  16. package/docs/page-readings.json +1044 -650
  17. package/modules/government/catalog.js +3 -0
  18. package/modules/government/migrations/government_021_module_assessment_rerun.sql +36 -0
  19. package/modules/provisioning/routes/provisioning.js +35 -0
  20. package/modules/public-landing/public/assets/cosmos.css +1 -1
  21. package/modules/public-landing/public/projects.html +589 -63
  22. package/modules/public-landing/public/projects.probes.json +8 -5
  23. package/modules/public-landing/public/projects.states.json +19 -14
  24. package/modules/ui-design/kit/lib.js +4 -2
  25. package/modules/ui-design/kit/serve.js +5 -0
  26. package/package-lock.json +2 -2
  27. package/package.json +1 -1
  28. package/release-notes.json +12 -0
  29. package/src/bongos/route-rank-check.js +3 -0
  30. package/src/bongos/routes/modules.js +27 -0
  31. package/src/module-api.js +1 -1
  32. package/tests/module_store_reassess.mjs +120 -0
  33. package/tests/projects_hub.mjs +9 -5
  34. package/tests/projects_hub_app_status.mjs +1 -1
  35. package/tests/projects_hub_app_step.mjs +10 -10
  36. package/tests/projects_hub_look.mjs +7 -7
  37. package/tests/projects_hub_module_picker.mjs +9 -9
  38. package/tests/projects_hub_pre_uat.mjs +2 -1
  39. package/tests/wizard_demo.mjs +1 -1
  40. package/tests/wizard_draft_resume.mjs +1 -1
  41. package/tests/wizard_front_door.mjs +11 -7
  42. package/tests/wizard_intent_resume.mjs +9 -9
  43. package/tests/wizard_physics.mjs +264 -0
@@ -159,16 +159,19 @@
159
159
  "steps": [["wait",900],["click","[data-disc-ask]"],["wait",200],["fill","#mDiscName","old-lantern"],["wait",100],["click","[data-disc-yes]"],["wait",900]],
160
160
  "expect": {"text":[["#mDisc .addr","This project is being disconnected."],["#mName","old-lantern"]],"hidden":["#mDiscName","[data-disc-ask]"]} },
161
161
  { "name": "the wizard driver (task 1003346): name, type, about, home (fresh; the stub grants repo access, so the new repository is named from the project), address (the handle's verdict), the review as a ledger, then the filing — the done panel with the standup rail and the human steps", "auth": true, "width": 1440, "url": "/projects?view=new",
162
- "steps": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400],["click","#panel-home button[type=submit]"],["wait",400],["fill","#f-slug","mercury"],["wait",900],["fill","#f-domain","mercury.example.com"],["wait",200],["click","#panel-address button[type=submit]"],["wait",400],["click","#panel-app button[type=submit]"],["wait",400],["click","#panel-look button[type=submit]"],["wait",400],["click","#doCreate"],["wait",1500]],
162
+ "steps": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"new\"]"],["click","#physNext"],["wait",500],["select","#physCountry","US"],["click","[data-phys=\"builder_geography\"][data-val=\"global\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"minors_on_board\"][data-val=\"false\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"entity\"][data-val=\"intent-solo\"]"],["click","#physNext"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400],["click","#panel-home button[type=submit]"],["wait",400],["fill","#f-slug","mercury"],["wait",900],["fill","#f-domain","mercury.example.com"],["wait",200],["click","#panel-address button[type=submit]"],["wait",400],["click","#panel-app button[type=submit]"],["wait",400],["click","#panel-look button[type=submit]"],["wait",400],["click","#doCreate"],["wait",1500]],
163
163
  "expect": {"visible":["#panel-done","#liveProgress .prog","#liveProgress .prog .stages li.now","#humanSteps li"],"hidden":["#panel-review","#panel-name"],"text":[["#done-h","The drums are rolling"]],"attr":[["#panel-done","class","panel on"]]} },
164
- { "name": "the front door (task 1004417): Proceed is refused until the terms are ticked, the fork's demo door opens the demo's setup and Back returns to the doors, and Begin planet creation goes on to the name step with the rail back", "auth": true, "width": 1440, "url": "/projects?view=new",
165
- "steps": [["wait",600],["click","#panel-terms button[type=submit]"],["wait",300],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#wizDemo"],["wait",200],["click","#demoBack1"],["wait",200],["click","#panel-fork button[type=submit]"],["wait",400]],
166
- "expect": {"visible":["#panel-name","#view-new .steps","#view-new .steps li.now"],"hidden":["#panel-fork","#panel-terms"],"attr":[["#wizDemo","aria-expanded","false"],["#view-new .steps li.now","data-step","3"]]} },
164
+ { "name": "the front door (task 1004417): Proceed is refused until the terms are ticked, the fork's demo door opens the demo's setup and Back returns to the doors, and Begin planet creation goes on, through the four planet-physics questions, to the name step with the rail back", "auth": true, "width": 1440, "url": "/projects?view=new",
165
+ "steps": [["wait",600],["click","#panel-terms button[type=submit]"],["wait",300],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#wizDemo"],["wait",200],["click","#demoBack1"],["wait",200],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"new\"]"],["click","#physNext"],["wait",500],["select","#physCountry","US"],["click","[data-phys=\"builder_geography\"][data-val=\"global\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"minors_on_board\"][data-val=\"false\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"entity\"][data-val=\"intent-solo\"]"],["click","#physNext"],["wait",400]],
166
+ "expect": {"visible":["#panel-name","#view-new .steps","#view-new .steps li.now"],"hidden":["#panel-fork","#panel-terms"],"attr":[["#wizDemo","aria-expanded","false"],["#view-new .steps li.now","data-step","4"]]} },
167
+ { "name": "planet physics (task 1004418): an existing planet asks what exists and which is main, a country with states asks for one, young builders put the protective ring on the planet and show the age tiers, and an entity gives the planet its core", "auth": true, "width": 1440, "url": "/projects?view=new",
168
+ "steps": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"existing\"]"],["click","#physExisting [data-work=\"code\"]"],["click","#physNext"],["wait",500],["select","#physCountry","US"],["wait",100],["select","#physRegion","US-CA"],["click","[data-phys=\"builder_geography\"][data-val=\"us-eu\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"minors_on_board\"][data-val=\"true\"]"],["wait",100],["click","#physNext"],["wait",200],["click","[data-phys=\"entity\"][data-val=\"for-profit\"]"],["wait",200]],
169
+ "expect": {"visible":["#panel-physics .physQ[data-q=\"4\"]","#physForms","#physGuard","#physPlanet"],"hidden":["#physIntent","#panel-name"],"attr":[["#physPlanet","src","/assets/world/r3-gold-blob-cut.webp"],["[data-phys=\"entity\"][data-val=\"for-profit\"]","aria-pressed","true"]],"text":[["#physCoords","state existing · home us-ca · builders us + eu · ages 13+ · core organization"]]} },
167
170
  { "name": "the front door at 390: the fork's two doors stack inside one pill and the walk still reaches the name step", "auth": true, "width": 390, "url": "/projects?view=new",
168
171
  "steps": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400]],
169
172
  "expect": {"visible":["#panel-fork",".doorPill","#wizDemo","#panel-fork button[type=submit]"],"hidden":["#view-new .steps"]} },
170
173
  { "name": "the wizard driver at 390: the rail folds to two rows of three and the walk still reaches the review", "auth": true, "width": 390, "url": "/projects?view=new",
171
- "steps": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400],["click","#panel-home button[type=submit]"],["wait",400],["fill","#f-slug","mercury"],["wait",900],["fill","#f-domain","mercury.example.com"],["wait",200],["click","#panel-address button[type=submit]"],["wait",400],["click","#panel-app button[type=submit]"],["wait",400],["click","#panel-look button[type=submit]"],["wait",400]],
174
+ "steps": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"new\"]"],["click","#physNext"],["wait",500],["select","#physCountry","US"],["click","[data-phys=\"builder_geography\"][data-val=\"global\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"minors_on_board\"][data-val=\"false\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"entity\"][data-val=\"intent-solo\"]"],["click","#physNext"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400],["click","#panel-home button[type=submit]"],["wait",400],["fill","#f-slug","mercury"],["wait",900],["fill","#f-domain","mercury.example.com"],["wait",200],["click","#panel-address button[type=submit]"],["wait",400],["click","#panel-app button[type=submit]"],["wait",400],["click","#panel-look button[type=submit]"],["wait",400]],
172
175
  "expect": {"visible":["#panel-review","#reviewList li","#doCreate"],"hidden":["#panel-address"],"text":[["#rev-h","Ready to roll"]]} }
173
176
  ]
174
177
  }
@@ -41,21 +41,26 @@
41
41
  "in-new-fork": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400]], "expect": {"visible":["#panel-fork",".doorPill","#wizDemo",".forkStage",".forkRoutes"],"hidden":["#panel-terms","#view-new .steps","#demoSoon",".bongoCell"]} },
42
42
  "in-new-fork-demo": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#wizDemo"],["wait",300]], "expect": {"visible":["#panel-fork","#demoSetup","#demoFitVerdict","#demoRing"],"hidden":["#forkIntro","#demoReady"],"attr":[["#wizDemo","aria-expanded","true"]]} },
43
43
  "in-new-demo-ready": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#wizDemo"],["wait",300],["click","[data-demo-step=\"hours\"][data-by=\"1\"]"],["click","#demoNext1"],["wait",300]], "expect": {"visible":["#demoReady",".demoLedger","#demoInvite1","#demoInvite2"],"hidden":["#demoSetup","#forkIntro"],"text":[["#demoLHours","5 hours each"]]} },
44
- "in-new-name": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400]], "expect": {"visible":["#panel-name","#newName","#view-new .steps"],"hidden":["#panel-fork","#panel-terms"]} },
44
+ "in-new-physics": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400]], "expect": {"visible":["#panel-physics","#physStage","[data-phys-start]"],"hidden":["#panel-fork","#physRail"]} },
45
+ "in-new-physics-state": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"existing\"]"],["click","#physExisting [data-work=\"code\"]"],["click","#physExisting [data-work=\"digital-files\"]"],["wait",200]], "expect": {"visible":["#physExisting","#physDesc","#physRail"],"hidden":["#physStage .physGuard"]} },
46
+ "in-new-physics-geo": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"new\"]"],["click","#physNext"],["wait",500],["select","#physCountry","US"],["wait",100],["select","#physRegion","US-CA"],["click","[data-phys=\"builder_geography\"][data-val=\"us-eu\"]"],["wait",200]], "expect": {"visible":["#physCountry","#physRegionField"]} },
47
+ "in-new-physics-ages": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"new\"]"],["click","#physNext"],["wait",500],["select","#physCountry","US"],["wait",100],["select","#physRegion","US-CA"],["click","[data-phys=\"builder_geography\"][data-val=\"us-eu\"]"],["wait",200],["click","#physNext"],["wait",200],["click","[data-phys=\"minors_on_board\"][data-val=\"true\"]"],["wait",200]], "expect": {"visible":["#physAges","#physGuard"]} },
48
+ "in-new-physics-entity": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"new\"]"],["click","#physNext"],["wait",500],["select","#physCountry","US"],["wait",100],["select","#physRegion","US-CA"],["click","[data-phys=\"builder_geography\"][data-val=\"us-eu\"]"],["wait",200],["click","#physNext"],["wait",200],["click","[data-phys=\"minors_on_board\"][data-val=\"true\"]"],["wait",200],["click","#physNext"],["wait",200],["click","[data-phys=\"entity\"][data-val=\"intent-solo\"]"],["wait",200]], "expect": {"visible":["#physIntent","#physHaveEntity"],"hidden":["#physForms"]} },
49
+ "in-new-name": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"new\"]"],["click","#physNext"],["wait",500],["select","#physCountry","US"],["click","[data-phys=\"builder_geography\"][data-val=\"global\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"minors_on_board\"][data-val=\"false\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"entity\"][data-val=\"intent-solo\"]"],["click","#physNext"],["wait",400]], "expect": {"visible":["#panel-name","#newName","#view-new .steps"],"hidden":["#panel-fork","#panel-terms"]} },
45
50
  "out-new": { "auth": false, "url": "/projects?view=new", "expect": { "hidden": ["#qWrap"] } },
46
- "in-new-type": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400]], "expect": {"visible":["#panel-type"],"hidden":["#panel-name","#qWrap"]} },
47
- "in-new-about": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400]], "expect": {"visible":["#panel-detail"],"hidden":["#panel-type","#qWrap"]} },
48
- "in-new-modules": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900]], "expect": {"visible":["#panel-modules","#modQ","#modCards .tpill[aria-pressed=\"true\"]","#modCoreNote"],"hidden":["#panel-detail","#qWrap"]} },
49
- "in-new-modules-search": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["fill","#modQ","discord"],["wait",200]], "expect": {"visible":["#panel-modules","#modQ"],"value":[["#modQ","discord"]],"count":[["#modCards .tpill",1],["#modCards .tpill[data-mod=\"discord\"]",1]],"text":[["#modFilterNote","Showing 1 of 3. 2 extras are switched on, including any this search is hiding."]]} },
50
- "in-new-home": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400]], "expect": {"visible":["#panel-home"],"hidden":["#panel-detail","#qWrap"]} },
51
- "in-new-address": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400],["click","#panel-home button[type=submit]"],["wait",400]], "expect": {"visible":["#panel-address"],"hidden":["#panel-home","#qWrap"]} },
52
- "in-new-app": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400],["click","#panel-home button[type=submit]"],["wait",400],["fill","#f-slug","mercury"],["wait",900],["fill","#f-domain","mercury.example.com"],["wait",200],["click","#panel-address button[type=submit]"],["wait",400]], "expect": {"visible":["#panel-app","#appOpts","#appOptRender"],"hidden":["#panel-address","#panel-review","#qWrap"]} },
53
- "in-new-app-render": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400],["click","#panel-home button[type=submit]"],["wait",400],["fill","#f-slug","mercury"],["wait",900],["fill","#f-domain","mercury.example.com"],["wait",200],["click","#panel-address button[type=submit]"],["wait",400],["click","#appOptRender input"],["wait",300]], "expect": {"visible":["#panel-app","#renderSetup","#f-renderKey","#renderCheck"],"hidden":["#renderWs","#renderSvc","#renderNew"]} },
54
- "in-new-look": {"auth":true,"url":"/projects?view=new","actions":[["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400],["click","#panel-home button[type=submit]"],["wait",400],["fill","#f-slug","mercury"],["wait",900],["fill","#f-domain","mercury.example.com"],["wait",200],["click","#panel-address button[type=submit]"],["wait",400],["click","#panel-app button[type=submit]"],["wait",400]],"expect":{"visible":["#panel-look","#wizLook","#wizLook-chrome-world","#wizTint","#wizLogo",".lookPrev .mh.light",".lookPrev .mh.dark"],"hidden":["#panel-app","#panel-review"]}},
55
- "in-new-look-custom": {"auth":true,"url":"/projects?view=new","actions":[["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400],["click","#panel-home button[type=submit]"],["wait",400],["fill","#f-slug","mercury"],["wait",900],["fill","#f-domain","mercury.example.com"],["wait",200],["click","#panel-address button[type=submit]"],["wait",400],["click","#panel-app button[type=submit]"],["wait",400],["click","#wizLook-custom"],["wait",200]],"expect":{"visible":["#panel-look","#wizAccent","#wizAccentNote"],"hidden":["#panel-review"]}},
56
- "in-new-review": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400],["click","#panel-home button[type=submit]"],["wait",400],["fill","#f-slug","mercury"],["wait",900],["fill","#f-domain","mercury.example.com"],["wait",200],["click","#panel-address button[type=submit]"],["wait",400],["click","#panel-app button[type=submit]"],["wait",400],["click","#panel-look button[type=submit]"],["wait",400]], "expect": {"visible":["#panel-review","#reviewList li"],"hidden":["#panel-address","#qWrap"]} },
57
- "in-new-done": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400],["click","#panel-home button[type=submit]"],["wait",400],["fill","#f-slug","mercury"],["wait",900],["fill","#f-domain","mercury.example.com"],["wait",200],["click","#panel-address button[type=submit]"],["wait",400],["click","#panel-app button[type=submit]"],["wait",400],["click","#panel-look button[type=submit]"],["wait",400],["click","#doCreate"],["wait",1500]], "expect": {"visible":["#panel-done","#liveProgress .prog","#humanSteps li"],"hidden":["#panel-review","#qWrap"]} },
58
- "in-new-resume-offer": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400],["click","#panel-home button[type=submit]"],["wait",400],["fill","#f-slug","mercury"],["wait",900],["fill","#f-domain","mercury.example.com"],["wait",200],["click","#panel-address button[type=submit]"],["wait",400],["click","#panel-app button[type=submit]"],["wait",400],["click","#panel-look button[type=submit]"],["wait",400],["click","#doCreate"],["wait",1500],["click","#projTrig"],["wait",350],["click","#menuProjects [data-nav=\"new\"]"],["wait",500]], "expect": {"visible":["#panel-terms","#wizResume","#wizResumeGo"],"hidden":["#panel-done","#panel-name"],"text":[["#wizResumeName","Mercury"]]} },
51
+ "in-new-type": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"new\"]"],["click","#physNext"],["wait",500],["select","#physCountry","US"],["click","[data-phys=\"builder_geography\"][data-val=\"global\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"minors_on_board\"][data-val=\"false\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"entity\"][data-val=\"intent-solo\"]"],["click","#physNext"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400]], "expect": {"visible":["#panel-type"],"hidden":["#panel-name","#qWrap"]} },
52
+ "in-new-about": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"new\"]"],["click","#physNext"],["wait",500],["select","#physCountry","US"],["click","[data-phys=\"builder_geography\"][data-val=\"global\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"minors_on_board\"][data-val=\"false\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"entity\"][data-val=\"intent-solo\"]"],["click","#physNext"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400]], "expect": {"visible":["#panel-detail"],"hidden":["#panel-type","#qWrap"]} },
53
+ "in-new-modules": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"new\"]"],["click","#physNext"],["wait",500],["select","#physCountry","US"],["click","[data-phys=\"builder_geography\"][data-val=\"global\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"minors_on_board\"][data-val=\"false\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"entity\"][data-val=\"intent-solo\"]"],["click","#physNext"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900]], "expect": {"visible":["#panel-modules","#modQ","#modCards .tpill[aria-pressed=\"true\"]","#modCoreNote"],"hidden":["#panel-detail","#qWrap"]} },
54
+ "in-new-modules-search": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"new\"]"],["click","#physNext"],["wait",500],["select","#physCountry","US"],["click","[data-phys=\"builder_geography\"][data-val=\"global\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"minors_on_board\"][data-val=\"false\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"entity\"][data-val=\"intent-solo\"]"],["click","#physNext"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["fill","#modQ","discord"],["wait",200]], "expect": {"visible":["#panel-modules","#modQ"],"value":[["#modQ","discord"]],"count":[["#modCards .tpill",1],["#modCards .tpill[data-mod=\"discord\"]",1]],"text":[["#modFilterNote","Showing 1 of 3. 2 extras are switched on, including any this search is hiding."]]} },
55
+ "in-new-home": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"new\"]"],["click","#physNext"],["wait",500],["select","#physCountry","US"],["click","[data-phys=\"builder_geography\"][data-val=\"global\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"minors_on_board\"][data-val=\"false\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"entity\"][data-val=\"intent-solo\"]"],["click","#physNext"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400]], "expect": {"visible":["#panel-home"],"hidden":["#panel-detail","#qWrap"]} },
56
+ "in-new-address": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"new\"]"],["click","#physNext"],["wait",500],["select","#physCountry","US"],["click","[data-phys=\"builder_geography\"][data-val=\"global\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"minors_on_board\"][data-val=\"false\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"entity\"][data-val=\"intent-solo\"]"],["click","#physNext"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400],["click","#panel-home button[type=submit]"],["wait",400]], "expect": {"visible":["#panel-address"],"hidden":["#panel-home","#qWrap"]} },
57
+ "in-new-app": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"new\"]"],["click","#physNext"],["wait",500],["select","#physCountry","US"],["click","[data-phys=\"builder_geography\"][data-val=\"global\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"minors_on_board\"][data-val=\"false\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"entity\"][data-val=\"intent-solo\"]"],["click","#physNext"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400],["click","#panel-home button[type=submit]"],["wait",400],["fill","#f-slug","mercury"],["wait",900],["fill","#f-domain","mercury.example.com"],["wait",200],["click","#panel-address button[type=submit]"],["wait",400]], "expect": {"visible":["#panel-app","#appOpts","#appOptRender"],"hidden":["#panel-address","#panel-review","#qWrap"]} },
58
+ "in-new-app-render": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"new\"]"],["click","#physNext"],["wait",500],["select","#physCountry","US"],["click","[data-phys=\"builder_geography\"][data-val=\"global\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"minors_on_board\"][data-val=\"false\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"entity\"][data-val=\"intent-solo\"]"],["click","#physNext"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400],["click","#panel-home button[type=submit]"],["wait",400],["fill","#f-slug","mercury"],["wait",900],["fill","#f-domain","mercury.example.com"],["wait",200],["click","#panel-address button[type=submit]"],["wait",400],["click","#appOptRender input"],["wait",300]], "expect": {"visible":["#panel-app","#renderSetup","#f-renderKey","#renderCheck"],"hidden":["#renderWs","#renderSvc","#renderNew"]} },
59
+ "in-new-look": {"auth":true,"url":"/projects?view=new","actions":[["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"new\"]"],["click","#physNext"],["wait",500],["select","#physCountry","US"],["click","[data-phys=\"builder_geography\"][data-val=\"global\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"minors_on_board\"][data-val=\"false\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"entity\"][data-val=\"intent-solo\"]"],["click","#physNext"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400],["click","#panel-home button[type=submit]"],["wait",400],["fill","#f-slug","mercury"],["wait",900],["fill","#f-domain","mercury.example.com"],["wait",200],["click","#panel-address button[type=submit]"],["wait",400],["click","#panel-app button[type=submit]"],["wait",400]],"expect":{"visible":["#panel-look","#wizLook","#wizLook-chrome-world","#wizTint","#wizLogo",".lookPrev .mh.light",".lookPrev .mh.dark"],"hidden":["#panel-app","#panel-review"]}},
60
+ "in-new-look-custom": {"auth":true,"url":"/projects?view=new","actions":[["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"new\"]"],["click","#physNext"],["wait",500],["select","#physCountry","US"],["click","[data-phys=\"builder_geography\"][data-val=\"global\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"minors_on_board\"][data-val=\"false\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"entity\"][data-val=\"intent-solo\"]"],["click","#physNext"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400],["click","#panel-home button[type=submit]"],["wait",400],["fill","#f-slug","mercury"],["wait",900],["fill","#f-domain","mercury.example.com"],["wait",200],["click","#panel-address button[type=submit]"],["wait",400],["click","#panel-app button[type=submit]"],["wait",400],["click","#wizLook-custom"],["wait",200]],"expect":{"visible":["#panel-look","#wizAccent","#wizAccentNote"],"hidden":["#panel-review"]}},
61
+ "in-new-review": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"new\"]"],["click","#physNext"],["wait",500],["select","#physCountry","US"],["click","[data-phys=\"builder_geography\"][data-val=\"global\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"minors_on_board\"][data-val=\"false\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"entity\"][data-val=\"intent-solo\"]"],["click","#physNext"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400],["click","#panel-home button[type=submit]"],["wait",400],["fill","#f-slug","mercury"],["wait",900],["fill","#f-domain","mercury.example.com"],["wait",200],["click","#panel-address button[type=submit]"],["wait",400],["click","#panel-app button[type=submit]"],["wait",400],["click","#panel-look button[type=submit]"],["wait",400]], "expect": {"visible":["#panel-review","#reviewList li"],"hidden":["#panel-address","#qWrap"]} },
62
+ "in-new-done": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"new\"]"],["click","#physNext"],["wait",500],["select","#physCountry","US"],["click","[data-phys=\"builder_geography\"][data-val=\"global\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"minors_on_board\"][data-val=\"false\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"entity\"][data-val=\"intent-solo\"]"],["click","#physNext"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400],["click","#panel-home button[type=submit]"],["wait",400],["fill","#f-slug","mercury"],["wait",900],["fill","#f-domain","mercury.example.com"],["wait",200],["click","#panel-address button[type=submit]"],["wait",400],["click","#panel-app button[type=submit]"],["wait",400],["click","#panel-look button[type=submit]"],["wait",400],["click","#doCreate"],["wait",1500]], "expect": {"visible":["#panel-done","#liveProgress .prog","#humanSteps li"],"hidden":["#panel-review","#qWrap"]} },
63
+ "in-new-resume-offer": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"new\"]"],["click","#physNext"],["wait",500],["select","#physCountry","US"],["click","[data-phys=\"builder_geography\"][data-val=\"global\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"minors_on_board\"][data-val=\"false\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"entity\"][data-val=\"intent-solo\"]"],["click","#physNext"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400],["click","#panel-home button[type=submit]"],["wait",400],["fill","#f-slug","mercury"],["wait",900],["fill","#f-domain","mercury.example.com"],["wait",200],["click","#panel-address button[type=submit]"],["wait",400],["click","#panel-app button[type=submit]"],["wait",400],["click","#panel-look button[type=submit]"],["wait",400],["click","#doCreate"],["wait",1500],["click","#projTrig"],["wait",350],["click","#menuProjects [data-nav=\"new\"]"],["wait",500]], "expect": {"visible":["#panel-terms","#wizResume","#wizResumeGo"],"hidden":["#panel-done","#panel-name"],"text":[["#wizResumeName","Mercury"]]} },
59
64
  "out-map-projects": { "auth": false, "actions": [["click", "#projTrig"], ["wait", 350]], "expect": { "expanded": true, "hidden": ["#menuProjects [data-nav=\"mine\"]"] } },
60
65
  "card": { "auth": true, "actions": [["dispatchClick", "#orbField a.worldOrb[data-origin=\"https://example.com\"]"], ["wait", 900]], "expect": { "dialog": true, "hasClass": [["#projCard", "has-art"]], "visible": ["#cardArt", "#cardFaces", "#cardBuildersFig", "#cardShippedFig", "#cardOpen", "#cardHall"], "text": [["#cardBuilders", "11"], ["#cardShipped", "0"], ["#cardRel", "you build here"], ["#cardRuns", "example.com"], ["#cardFaces .facesMore", "+6"]], "count": [["#cardFaces img", 5]], "href": [["#cardHall", "https://builders.example.com/"]] } },
61
66
  "card-noart": { "auth": true, "actions": [["dispatchClick", "#orbField a.worldOrb[data-origin=\"https://emersonian-circles.cloudbongos.com\"]"], ["wait", 600]], "expect": { "dialog": true, "hasClass": [["#projCard", "has-art", false]], "hidden": ["#cardArt", "#cardFaces", "#cardHall"], "visible": ["#cardBuildersFig", "#cardShippedFig", "#cardOpen"], "text": [["#cardShipped", "30+"], ["#cardRel", "you build here"]] } },
@@ -83,7 +83,7 @@ function sidecarPath(surfaceDir, urlPath, kind) { return path.join(surfaceDir, `
83
83
  function readJson(file) { return JSON.parse(fs.readFileSync(file, 'utf8')); }
84
84
 
85
85
  // ── the action vocabulary (states + probes) ───────────────────────────────────
86
- const ACTIONS = Object.freeze(['click', 'focus', 'press', 'fill', 'wait', 'clickAt', 'clickIfVisible', 'dispatchClick', 'check', 'back', 'forward']);
86
+ const ACTIONS = Object.freeze(['click', 'focus', 'press', 'fill', 'wait', 'clickAt', 'clickIfVisible', 'dispatchClick', 'check', 'select', 'back', 'forward']);
87
87
  function validateActions(actions, at) {
88
88
  if (actions === undefined) return [];
89
89
  if (!Array.isArray(actions)) return [`${at}: an array of [op, ...args]`];
@@ -92,7 +92,7 @@ function validateActions(actions, at) {
92
92
  const arr = Array.isArray(step) ? step : [step];
93
93
  const [op, a, b] = arr;
94
94
  if (!ACTIONS.includes(op)) { errors.push(`${at}[${i}]: unknown action "${op}" (one of ${ACTIONS.join(', ')})`); return; }
95
- if (['click', 'focus', 'fill', 'clickIfVisible', 'dispatchClick', 'check'].includes(op) && typeof a !== 'string') errors.push(`${at}[${i}]: ${op} needs a selector`);
95
+ if (['click', 'focus', 'fill', 'clickIfVisible', 'dispatchClick', 'check', 'select'].includes(op) && typeof a !== 'string') errors.push(`${at}[${i}]: ${op} needs a selector`);
96
96
  if (op === 'press' && typeof a !== 'string') errors.push(`${at}[${i}]: press needs a key`);
97
97
  if (op === 'wait' && !(Number(a) >= 0)) errors.push(`${at}[${i}]: wait needs milliseconds`);
98
98
  if (op === 'clickAt' && !(Number(a) >= 0 && Number(b) >= 0)) errors.push(`${at}[${i}]: clickAt needs x y`);
@@ -120,6 +120,8 @@ async function runActions(page, actions = []) {
120
120
  case 'check':
121
121
  await page.evaluate(([s, on]) => { const el = document.querySelector(s); if (!el) throw new Error('check: nothing matches ' + s); el.checked = on !== false; el.dispatchEvent(new Event('change', { bubbles: true })); }, [a, b]);
122
122
  break;
123
+ // a <select>'s option by value (task 1004418: the wizard's country picker); fill cannot set one
124
+ case 'select': await page.selectOption(a, b == null ? '' : String(b)); break;
123
125
  case 'back': await page.goBack(); break;
124
126
  case 'forward': await page.goForward(); break;
125
127
  default: throw new Error(`unknown action "${op}"`);
@@ -443,6 +443,11 @@ const server = http.createServer((req, res) => {
443
443
  if (rest === '/me/profile' && req.method === 'PATCH') return AUTH ? readBody(req, (body) => profilePatch(res, body)) : json(res, 401, UNAUTH);
444
444
  if (rest === '/me/handle' && req.method === 'PATCH') return AUTH ? readBody(req, (body) => handlePatch(res, body)) : json(res, 401, UNAUTH);
445
445
  if (rest === '/provisioning/instances' && req.method === 'GET') return AUTH ? instances(res, null, false) : json(res, 401, UNAUTH);
446
+ // the planet-physics questions' pre-create check (task 1004418): nothing stops and no
447
+ // option is limited here — the kit carries neither the server's screen nor its table
448
+ if (rest === '/provisioning/physics-check' && req.method === 'POST') {
449
+ return AUTH ? json(res, 200, { stop: false, message: null, soft_limits: { enforced: false, limits: [] } }) : json(res, 401, UNAUTH);
450
+ }
446
451
  // where a project's app runs (task 1004353): the status read, from a fixture keyed by
447
452
  // project id — a project the fixture does not name has no platform chosen
448
453
  const appRead = rest.match(/^\/provisioning\/instances\/(\d+)\/render$/);
package/package-lock.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@bongos/core",
3
- "version": "1.20.73",
3
+ "version": "1.20.75",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@bongos/core",
9
- "version": "1.20.73",
9
+ "version": "1.20.75",
10
10
  "license": "AGPL-3.0-or-later",
11
11
  "dependencies": {
12
12
  "express": "^4.21.2",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bongos/core",
3
- "version": "1.20.73",
3
+ "version": "1.20.75",
4
4
  "description": "Cloud Bongos — the AI-first build platform core (GDS + platform surfaces + module system), installed as a versioned dependency (ADR 0108).",
5
5
  "license": "AGPL-3.0-or-later",
6
6
  "main": "src/platform-server.js",
@@ -8567,5 +8567,17 @@
8567
8567
  "id": "1003795",
8568
8568
  "text": "There is now an automatic check that free modules are scored exactly like paid ones. If anyone ever makes price affect a module's score, the check fails and points at the line."
8569
8569
  }
8570
+ ],
8571
+ "1.20.74": [
8572
+ {
8573
+ "id": "1003796",
8574
+ "text": "Nobody can change a module's score by hand. Senior builders can ask for a module to be checked again, with a reason, and the score updates from the fresh check."
8575
+ }
8576
+ ],
8577
+ "1.20.75": [
8578
+ {
8579
+ "id": "1004418",
8580
+ "text": "Creating a project now starts with four questions about its \"planet physics\": is it new or already started, where is everyone, will anyone under 18 be building, and what kind of entity is behind it. A planet forms beside the q"
8581
+ }
8570
8582
  ]
8571
8583
  }
@@ -237,6 +237,9 @@ const EXPECTED_RANKS = {
237
237
  // pins above — a silent downgrade puts the defense inventory below the trust line.
238
238
  // Newly VISIBLE in BV1.R109b (declared multi-line, so previously unpinnable).
239
239
  'GET /security/adr': 'metic+archon',
240
+ // Re-running a store version's assessment (task 1003796, ADR 0359) spends a Docs
241
+ // grader call and re-opens the Security gate, so it is pinned to its own atom.
242
+ 'POST /store/modules/:key/versions/:version/reassess': 'perm:module.assessment.rerun',
240
243
  };
241
244
 
242
245
  // The authz-core route pins (ADR 0174). Paths and the gating atom were renamed
@@ -402,6 +402,33 @@ module.exports = function buildModulesRouter() {
402
402
  setImmediate(() => moduleAssessVersion.queueAssessment(result.version.id, { log }));
403
403
  }));
404
404
 
405
+ // POST /api/bongos/store/modules/:key/versions/:version/reassess — a Metic+ person
406
+ // asks for a published version's assessment to run again: the Security gate, the
407
+ // Docs grader, then the score (task 1003796, ADR 0359). There is deliberately no
408
+ // way to SET a score: the owner ruled a person may trigger a re-check, never change
409
+ // the number. A reason is required; the audit middleware records it with who
410
+ // asked. Answers 202 — the run is queued like a publish's.
411
+ router.post('/store/modules/:key/versions/:version/reassess', auth.requireBuilder, auth.requirePermission('module.assessment.rerun'),
412
+ asyncHandler('POST /store/modules/:key/versions/:version/reassess', async (req, res) => {
413
+ if (validateOrRespond(req, res, { reason: { type: 'string', maxLength: 2000 } })) return;
414
+ const { key, version } = req.params;
415
+ if (!KEY_RE.test(key) || !parseVersion(version)) {
416
+ return res.fail('bad_request', { status: 400, message: 'A module key is lowercase kebab-case and a version is exact X.Y.Z.' });
417
+ }
418
+ const reason = String(req.body?.reason || '').trim();
419
+ if (!reason) {
420
+ return res.fail('reason_required', { status: 400, message: 'Say why this version should be checked again, in reason. A re-check runs the automatic assessment; it never sets a score by hand.' });
421
+ }
422
+ const r = await resolveReadable(key, version);
423
+ if (!r.ok) return res.fail(r.code, { status: r.status, message: r.message });
424
+ const queued = moduleAssessVersion.queueAssessment(r.version.id, { log });
425
+ if (!queued) {
426
+ return res.fail('assessment_queue_full', { status: 503, message: 'The assessment queue is full. Try again in a few minutes.' });
427
+ }
428
+ log.info({ versionId: r.version.id, builderId: req.builder.id }, `re-assessment of ${key} ${version} queued`);
429
+ res.status(202).json({ ok: true, queued: true, module_key: key, version, version_id: r.version.id });
430
+ }));
431
+
405
432
  // GET /api/bongos/store/entitlements and /store/modules/:key/entitlement — the
406
433
  // read side of the entitlement record (task 1003813, ADR 0338 D1). Own-scoped
407
434
  // like /me/sessions: the holder is ALWAYS the caller (holder_kind 'builder',
package/src/module-api.js CHANGED
@@ -75,7 +75,7 @@ const { responsibilityFor, ROLE_RESPONSIBILITIES } = require('./role-responsibil
75
75
  // MAJOR (see allowBoxScope below): passes the request through untouched.
76
76
  function deprecatedNoopMiddleware(_req, _res, next) { next(); }
77
77
 
78
- const CORE_VERSION = '1.20.73'; // CI auto-patch carrier (ADR 0161); changelog: docs/module-api-changelog.md
78
+ const CORE_VERSION = '1.20.75'; // CI auto-patch carrier (ADR 0161); changelog: docs/module-api-changelog.md
79
79
 
80
80
  // A namespaced logger so a module's log lines are attributable + consistent.
81
81
  // Usage: const log = api.logger('discord'); log.info('mounted');
@@ -0,0 +1,120 @@
1
+ // tests/module_store_reassess.mjs — a Metic+ person can ask for a store version's
2
+ // assessment to run again, and can never set a score by hand (task 1003796,
3
+ // ADR 0359). Drives the real POST /store/modules/:key/versions/:version/reassess
4
+ // handler off the real router (no port, no real DB — pool.js is replaced in the
5
+ // require cache, the module_store_howto.mjs harness), with the assessment queue
6
+ // stubbed so nothing runs npm or a model.
7
+ //
8
+ // Run: node tests/module_store_reassess.mjs
9
+
10
+ import { strict as assert } from 'node:assert';
11
+ import { test } from 'node:test';
12
+ import { createRequire } from 'node:module';
13
+ import fs from 'node:fs';
14
+ import path from 'node:path';
15
+ import { fileURLToPath } from 'node:url';
16
+
17
+ const require = createRequire(import.meta.url);
18
+ const ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
19
+
20
+ const state = { modules: { weather: { module_key: 'weather', title: 'Weather', author_id: 42, status: 'listed' } }, versions: [{ id: 7, module_key: 'weather', version: '1.2.0', tarball_sha256: 'x', artifact_path: 'weather/weather-1.2.0.tgz', published_at: '2026-09-30T00:00:00Z' }], sql: [] };
21
+ const query = async (sql, params = []) => {
22
+ state.sql.push(sql);
23
+ if (/FROM store_modules WHERE module_key = \$1/.test(sql)) {
24
+ const m = state.modules[params[0]]; return { rows: m ? [m] : [] };
25
+ }
26
+ if (/FROM store_module_versions WHERE module_key = \$1 AND version = \$2/.test(sql)) {
27
+ return { rows: state.versions.filter((v) => v.module_key === params[0] && v.version === params[1]) };
28
+ }
29
+ return { rows: [] };
30
+ };
31
+ const poolPath = require.resolve('../src/bongos/pool.js');
32
+ require.cache[poolPath] = { id: poolPath, filename: poolPath, loaded: true, exports: { pool: { connect: async () => ({ query, release() {} }), query } } };
33
+
34
+ const moduleAssessVersion = require('../scripts/gds/module-assess-version.js');
35
+ const queued = [];
36
+ let queueAccepts = true;
37
+ moduleAssessVersion.queueAssessment = (id) => { queued.push(id); return queueAccepts; };
38
+ const buildModulesRouter = require('../src/bongos/routes/modules.js');
39
+
40
+ const PATH = '/store/modules/:key/versions/:version/reassess';
41
+ function handlerFor(router) {
42
+ const layer = router.stack.find((l) => l.route && l.route.path === PATH && l.route.methods.post);
43
+ assert.ok(layer, `no POST ${PATH} on the router`);
44
+ const stack = layer.route.stack;
45
+ return { handle: stack[stack.length - 1].handle, depth: stack.length };
46
+ }
47
+ async function invoke(handle, { key = 'weather', version = '1.2.0', body = {} } = {}) {
48
+ const res = {
49
+ statusCode: 200, body: undefined,
50
+ json(b) { this.body = b; return this; },
51
+ status(c) { this.statusCode = c; return this; },
52
+ set() { return this; },
53
+ fail(code, opts, details) { const o = typeof opts === 'number' ? { status: opts, details } : (opts || {}); this.statusCode = o.status; this.body = { error: code, ...o }; return this; },
54
+ };
55
+ let nextErr = null;
56
+ await handle({ params: { key, version }, body, builder: { id: 3 } }, res, (err) => { nextErr = err; });
57
+ if (nextErr) throw nextErr;
58
+ return res;
59
+ }
60
+
61
+ const { handle, depth } = handlerFor(buildModulesRouter());
62
+
63
+ test('the route is gated by its own Metic+ atom, granted to metic and archon', () => {
64
+ assert.ok(depth >= 3, 'requireBuilder + requirePermission sit in front of the handler');
65
+ const src = fs.readFileSync(path.join(ROOT, 'src/bongos/routes/modules.js'), 'utf8');
66
+ assert.match(src, /router\.post\('\/store\/modules\/:key\/versions\/:version\/reassess', auth\.requireBuilder, auth\.requirePermission\('module\.assessment\.rerun'\)/);
67
+ const { byKey } = require('../modules/government/catalog.js');
68
+ const p = byKey('module.assessment.rerun');
69
+ assert.equal(p.floor, 'metic');
70
+ assert.equal(p.system, false);
71
+ const mig = fs.readFileSync(path.join(ROOT, 'modules/government/migrations/government_021_module_assessment_rerun.sql'), 'utf8');
72
+ for (const rank of ['metic', 'archon']) assert.match(mig, new RegExp(`SELECT '${rank}', unnest\\(ARRAY\\[\\s*'module\\.assessment\\.rerun'`));
73
+ });
74
+
75
+ test('a re-check with a reason is queued and answers 202', async () => {
76
+ queued.length = 0;
77
+ const res = await invoke(handle, { body: { reason: 'the grader was down when this was published' } });
78
+ assert.equal(res.statusCode, 202);
79
+ assert.deepEqual(res.body, { ok: true, queued: true, module_key: 'weather', version: '1.2.0', version_id: 7 });
80
+ assert.deepEqual(queued, [7]);
81
+ });
82
+
83
+ test('no reason, no re-check', async () => {
84
+ queued.length = 0;
85
+ for (const body of [{}, { reason: '' }, { reason: ' ' }]) {
86
+ const res = await invoke(handle, { body });
87
+ assert.equal(res.statusCode, 400);
88
+ assert.equal(res.body.error, 'reason_required');
89
+ }
90
+ assert.equal(queued.length, 0);
91
+ });
92
+
93
+ test('a score can never be set by hand: a score in the body is refused, and nothing writes a score row', async () => {
94
+ queued.length = 0;
95
+ state.sql.length = 0;
96
+ const res = await invoke(handle, { body: { reason: 'r', overall: 100 } });
97
+ assert.equal(res.statusCode, 400, 'only `reason` is accepted');
98
+ assert.equal(queued.length, 0);
99
+ const ok = await invoke(handle, { body: { reason: 'r' } });
100
+ assert.equal(ok.statusCode, 202);
101
+ assert.deepEqual(queued, [7], 'it only queues the automatic assessment');
102
+ assert.ok(state.sql.every((q) => !/module_assessment_scores|module_assessment_signals/.test(q)), 'the route itself writes no score or signal');
103
+ const src = fs.readFileSync(path.join(ROOT, 'src/bongos/routes/modules.js'), 'utf8');
104
+ assert.doesNotMatch(src, /module_assessment_scores/, 'no store route writes a score row');
105
+ });
106
+
107
+ test('a bad key or version, an unknown version, and a full queue are refused', async () => {
108
+ queued.length = 0;
109
+ assert.equal((await invoke(handle, { key: 'Bad_Key', body: { reason: 'r' } })).statusCode, 400);
110
+ assert.equal((await invoke(handle, { version: '1.2', body: { reason: 'r' } })).statusCode, 400);
111
+ const missing = await invoke(handle, { version: '9.9.9', body: { reason: 'r' } });
112
+ assert.equal(missing.statusCode, 404);
113
+ assert.equal(missing.body.error, 'version_not_found');
114
+ assert.equal(queued.length, 0);
115
+ queueAccepts = false;
116
+ const full = await invoke(handle, { body: { reason: 'r' } });
117
+ queueAccepts = true;
118
+ assert.equal(full.statusCode, 503);
119
+ assert.equal(full.body.error, 'assessment_queue_full');
120
+ });
@@ -696,7 +696,10 @@ test('the About step is OFFERED by every form and can be walked past — the ski
696
696
  test('the About answers travel on the create request, and an empty one is OMITTED not blanked', () => {
697
697
  assert.match(SCRIPT, /description: String\(state\.description \|\| ''\)\.trim\(\) \|\| undefined/,
698
698
  'a skipped description is absent from the body — an empty string would read as answered');
699
- assert.match(SCRIPT, /detail: state\.teamShape \? \{ team_shape: state\.teamShape \} : undefined/,
699
+ // task 1004418: createDetail() builds the detail, adding the team shape only when it
700
+ // was answered and omitting the whole detail when nothing was
701
+ assert.match(SCRIPT, /detail: createDetail\(\),/);
702
+ assert.match(SCRIPT, /if \(state\.teamShape\) d\.team_shape = state\.teamShape;\r?\n\s*return Object\.keys\(d\)\.length \? d : undefined;/,
700
703
  'and an unanswered team shape is never guessed into the request');
701
704
  // the review is the last screen before Create, so the skip's cost is restated there
702
705
  const review = (SCRIPT.match(/function renderReview\(\)\s*\{([\s\S]*?)\n \}/) || [, ''])[1];
@@ -716,8 +719,9 @@ test('a renumbering of the wizard invalidates old drafts — the key carries the
716
719
  const count = [...panels.matchAll(/\d+:\s*'panel-/g)].length;
717
720
  // task 1004417 put the front door's two screens (terms, fork) in front: the sixth renumbering
718
721
  // task 1004421 put the Look step between App and Review: the seventh
719
- assert.equal(count, 13, 'gate + the front door\'s two + nine numbered steps + done — bump DRAFT_KEY when this changes');
720
- assert.equal(key, 'cb-create-draft-v7', 'and the key moved with the Look step');
722
+ // task 1004418 put planet physics right after the fork: the eighth
723
+ assert.equal(count, 14, 'gate + the front door\'s two + ten numbered steps + done — bump DRAFT_KEY when this changes');
724
+ assert.equal(key, 'cb-create-draft-v8', 'and the key moved with the physics step');
721
725
  });
722
726
 
723
727
  test('every row lays the same five parts — the ledger has no ragged row', () => {
@@ -2138,7 +2142,7 @@ test('the wizard takes the world by scope: no card ground, the six-step strip as
2138
2142
  assert.match(block, /#view-new \.card\{background:none;border-radius:0;box-shadow:none;/, 'no card ground');
2139
2143
  // eight tracks since task 1004351 added the App step (seven since 1002339); the count is the
2140
2144
  // rail's own, so it moves with the panels map rather than being a magic number
2141
- assert.match(block, /#view-new \.steps\{display:grid;grid-template-columns:repeat\(9,1fr\);/, 'the strip lays a track per numbered step');
2145
+ assert.match(block, /#view-new \.steps\{display:grid;grid-template-columns:repeat\(10,1fr\);/, 'the strip lays a track per numbered step');
2142
2146
  assert.match(block, /#view-new \.steps li::before\{content:"";position:absolute;top:-4px;left:0;right:auto;width:7px;height:7px;/, 'the connector becomes the 7px dot');
2143
2147
  assert.match(block, /#view-new \.steps li\.now::before\{background:var\(--accent\);border-color:var\(--accent\);outline:4px solid/, 'the lit step carries the accent and an outline halo');
2144
2148
  assert.match(block, /#view-new \.panel h1\{font-weight:300;[^}]*text-transform:lowercase;/, 'the step title in the display voice, lowercase');
@@ -2185,7 +2189,7 @@ test('the wizard\'s own structures wear the world: hairline fields, cells of one
2185
2189
  assert.match(block, /\.addrBig code\{display:block;font-family:var\(--font-display\);/, 'the address stands in the display voice');
2186
2190
  assert.doesNotMatch(block, /linear-gradient/, 'no tinted plates');
2187
2191
  assert.doesNotMatch(block, /box-shadow:(?!none)/, 'no box shadow in the wizard block');
2188
- assert.match(HUB, /<div class="nav">\s*<button type="button" class="btn ghost" data-back="10">← Back<\/button>\s*<button type="button" class="btn big" id="doCreate">Create my project<\/button>/, 'the review\'s doors sit on one row, back then the primary');
2192
+ assert.match(HUB, /<div class="nav">\s*<button type="button" class="btn ghost" data-back="11">← Back<\/button>\s*<button type="button" class="btn big" id="doCreate">Create my project<\/button>/, 'the review\'s doors sit on one row, back then the primary');
2189
2193
  assert.match(HUB, /<h2 class="stepsHead" id="doneStepsHead">Your steps — the parts only you can play<\/h2>/, 'the steps heading is the label face by class, not an inline style (the id is where a skipped invite step hands focus on, task 1002346)');
2190
2194
  // what is enqueued is unchanged (ADR 0111): the filing body the control plane reads
2191
2195
  assert.match(SCRIPT, /body: JSON\.stringify\(\{\s*slug: state\.slug,/, 'the filing still carries the slug first');
@@ -240,7 +240,7 @@ test('a repaint never lands on top of an open Retry — from this watch or a fre
240
240
  });
241
241
 
242
242
  test('both surfaces use it: the done panel and the project page', () => {
243
- assert.match(HUB, /if \(box\) watchApp\(instanceId, box, function \(\) \{ return state\.step === 12; \}, 5000\);/);
243
+ assert.match(HUB, /if \(box\) watchApp\(instanceId, box, function \(\) \{ return state\.step === 13; \}, 5000\);/);
244
244
  assert.match(HUB, /<div id="doneApp" hidden><\/div>/);
245
245
  assert.match(HUB, /<div class="card mSec" id="mAppCard" hidden>\n\s*<h2>Where its app runs<\/h2>\n\s*<div id="mApp"><\/div>/);
246
246
  assert.match(HUB, /loadAppStatus\(inst\.id \|\| asked, inst\);/);
@@ -144,18 +144,18 @@ test('the panel is real markup: Render and Decide later, Decide later the defaul
144
144
  assert.doesNotMatch(PANEL, /Coming soon/, 'and is no longer marked soon');
145
145
  assert.match(PANEL, /<input type="radio" name="appPlatform" value="later" checked>/, 'Decide later is the default');
146
146
  assert.match(PANEL, /We host your Builders' hall/, 'the step says the hall is ours to host (ADR 0345 D1), in the page\'s one spelling of it');
147
- assert.match(PANEL, /<form data-next="10">/, 'Next leads to the Look step (task 1004421), then the review');
148
- assert.match(PANEL, /data-back="8"/, 'Back returns to the address step');
147
+ assert.match(PANEL, /<form data-next="11">/, 'Next leads to the Look step (task 1004421), then the review');
148
+ assert.match(PANEL, /data-back="9"/, 'Back returns to the address step');
149
149
  });
150
150
 
151
151
  test('the step sits between Address and the Look step in the panels map and on the rail', () => {
152
- assert.match(HUB, /8: 'panel-address', 9: 'panel-app', 10: 'panel-look', 11: 'panel-review', 12: 'panel-done'/);
153
- assert.match(HUB, /<li data-step="9"><span class="snum">7<\/span><span class="slbl">App<\/span><\/li>/);
154
- assert.match(HUB, /<li data-step="10"><span class="snum">8<\/span><span class="slbl">Look<\/span><\/li>/);
155
- assert.match(HUB, /<li data-step="11"><span class="snum">9<\/span><span class="slbl">Create<\/span><\/li>/);
156
- assert.match(HUB, /data-back="10">← Back<\/button>\n\s*<button type="button" class="btn big" id="doCreate">/, "the review's Back returns to the Look step");
157
- assert.match(HUB, /if \(step === 9\) \{ syncAppStep\(\); syncRenderSetup\(\); \}\n\s*if \(step === 10\) renderLook\(\);\n\s*if \(step === 11\) renderReview\(\);/, 'entering the step repaints it, Render setup included');
158
- assert.match(HUB, /if \(step === 9\) return validateRender\(\);/, 'Next on the step runs the Render check');
152
+ assert.match(HUB, /9: 'panel-address', 10: 'panel-app', 11: 'panel-look', 12: 'panel-review', 13: 'panel-done'/);
153
+ assert.match(HUB, /<li data-step="10"><span class="snum">8<\/span><span class="slbl">App<\/span><\/li>/);
154
+ assert.match(HUB, /<li data-step="11"><span class="snum">9<\/span><span class="slbl">Look<\/span><\/li>/);
155
+ assert.match(HUB, /<li data-step="12"><span class="snum">10<\/span><span class="slbl">Create<\/span><\/li>/);
156
+ assert.match(HUB, /data-back="11">← Back<\/button>\r?\n\s*<button type="button" class="btn big" id="doCreate">/, "the review's Back returns to the Look step");
157
+ assert.match(HUB, /if \(step === 10\) \{ syncAppStep\(\); syncRenderSetup\(\); \}\r?\n\s*if \(step === 11\) renderLook\(\);\r?\n\s*if \(step === 12\) renderReview\(\);/, 'entering the step repaints it, Render setup included');
158
+ assert.match(HUB, /if \(step === 10\) return validateRender\(\);/, 'Next on the step runs the Render check');
159
159
  });
160
160
 
161
161
  test('a fresh draft reads "decide later", and the Render setup stays hidden', () => {
@@ -489,5 +489,5 @@ test('the review names exactly what was chosen, prices included', () => {
489
489
  });
490
490
 
491
491
  test('Create hands the app to Render straight after the project is filed', () => {
492
- assert.match(HUB, /show\(12, true\);\n\s*sendRenderSetup\(data\.instance && data\.instance\.id\);/);
492
+ assert.match(HUB, /show\(13, true\);\r?\n\s*sendRenderSetup\(data\.instance && data\.instance\.id\);/);
493
493
  });