@bongos/core 1.19.424 → 1.19.426

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 (32) hide show
  1. package/.bongos-core.json +59 -34
  2. package/docs/adr/0210-scouting-graduates-on-an-instance-asserted-owner-claim.md +100 -0
  3. package/docs/adr/README.md +1 -0
  4. package/docs/api/openapi.json +1 -1
  5. package/docs/copy-inventory.md +184 -184
  6. package/docs/copy-registry.json +235 -235
  7. package/docs/design/mocks/hub/wizard.html +421 -0
  8. package/docs/design/projects-hub-direction-v2.md +26 -0
  9. package/docs/file-map.md +2 -0
  10. package/docs/module-api-changelog.md +4 -0
  11. package/modules/hall-ui/public/people.js +5 -5
  12. package/modules/hall-ui/public/settings.html +2 -2
  13. package/modules/hall-ui/public/settings.js +12 -12
  14. package/modules/platform-identity/account-visibility.js +47 -1
  15. package/modules/platform-identity/platform-identity.js +14 -11
  16. package/modules/platform-identity/routes/scouting.js +61 -21
  17. package/modules/platform-identity/routes/sso.js +6 -0
  18. package/modules/platform-identity/scouting-authz.js +139 -0
  19. package/modules/ui-design/kit/serve.js +3 -1
  20. package/package-lock.json +2 -2
  21. package/package.json +1 -1
  22. package/public-landing/assets/cosmos.css +63 -0
  23. package/public-landing/projects.html +207 -199
  24. package/public-landing/projects.probes.json +7 -1
  25. package/public-landing/projects.states.json +7 -1
  26. package/src/bongos/auth.js +59 -3
  27. package/src/module-api.js +1 -1
  28. package/tests/account_privacy_flags.mjs +23 -13
  29. package/tests/effective_visibility_predicate.mjs +49 -4
  30. package/tests/projects_hub.mjs +56 -0
  31. package/tests/scouting_owner_access_and_reach.mjs +544 -0
  32. package/tests/scouting_page_gate.mjs +185 -0
@@ -67,14 +67,19 @@
67
67
  :root[data-mode="dark"] .bongos{--skin-hi:#fdf7ea;--skin-mid:#efe1c8;--skin-lo:#c3ae90;--drum-shadow:#000;}
68
68
  @media (prefers-color-scheme:dark){:root:not([data-mode="light"]) .bongos{--skin-hi:#fdf7ea;--skin-mid:#efe1c8;--skin-lo:#c3ae90;--drum-shadow:#000;}}
69
69
 
70
- /* ── the create wizard (task 1002763, absorbed from /create) ──────────────
71
- Tokens, the reset, the sky and the shared card/button/rail vocabulary all
72
- come from cosmos.css; what lands here is the wizard's own structure. No
73
- literal color anywhere: every surface is a cosmos token or a color-mix
74
- over one, so both modes and a re-brand carry it for free (C1/C2/C4).
75
- Naming: the wizard's field wrapper is .wizField — cosmos owns .field (the
76
- orb map) — and its done checklist is .humanSteps — cosmos owns .steps
77
- (the five-beat rail). Its inputs are scoped to the view so the glass
70
+ /* ── the create wizard (task 1002763, absorbed from /create), in the world
71
+ (task 1003346; direction record §15, the pick: v1 the rail above) ──────
72
+ Tokens, the reset, the sky and the shared vocabulary (.card, .btn, .steps)
73
+ come from cosmos.css, which draws the wizard's FRAME in the world's grammar
74
+ by scope (#view-new: no card ground, the six-step strip as the lifecycle
75
+ rail, the doors as pills); what lands here is the wizard's own structure —
76
+ fields on one bottom hairline, the choices as cells of one band, the review
77
+ as a ledger, the human steps as a numbered ledger, the standup strip as the
78
+ same rail. No literal color anywhere: every surface is a cosmos token or a
79
+ color-mix over one (C1/C2/C4); no plate, no box shadow, no glow — halos are
80
+ outlines. Naming: the wizard's field wrapper is .wizField — cosmos owns
81
+ .field (the orb map) — and its done checklist is .humanSteps — cosmos owns
82
+ .steps (the five-beat rail). Its inputs are scoped to the view so the glass
78
83
  search pills (#mapQ, #mineQ) keep their own look. */
79
84
  .panel{display:none;}
80
85
  .panel.on{display:block;animation:fadeStep .3s ease both;}
@@ -82,246 +87,249 @@
82
87
  /* show() moves focus to each panel's h1 for keyboard/SR context — keep the
83
88
  focus, lose the ring (a black rectangle around a heading; owner walk) */
84
89
  h1[tabindex="-1"]:focus:not(:focus-visible){outline:none;}
85
- /* the done step needs the full card width — the split collapses and the
86
- bongo pair steps aside for the checklist */
90
+ /* the done step needs the full width — the split collapses and the bongo
91
+ pair steps aside for the checklist */
87
92
  .createSplit.wizDone{display:block;}
88
93
  .createSplit.wizDone .bongoCell{display:none;}
89
94
 
90
- .wizField{display:block;margin-bottom:18px;}
91
- .wizField>span{display:block;font-size:13.5px;font-weight:700;color:var(--ink-soft);margin-bottom:7px;letter-spacing:0.2px;}
92
- .wizField small{font-weight:500;color:var(--ink-faint);}
95
+ /* a field: the label in the label face above, the input on one bottom
96
+ hairline that takes ink on focus (the bar's search field), the hint under
97
+ it in the status ink */
98
+ .wizField{display:block;margin:0 0 22px;}
99
+ .wizField>span{display:block;font-family:var(--label-face);font-size:var(--label-size);letter-spacing:var(--label-space);text-transform:uppercase;color:var(--ink-faint);margin-bottom:2px;}
100
+ .wizField small{font-family:var(--font-body);font-size:12.5px;letter-spacing:0;text-transform:none;color:var(--ink-faint);}
93
101
  /* the About step's description is prose, so it is a textarea — it wears the
94
102
  same control skin as every other field (task 1002334), never its own */
95
103
  #view-new input[type=text], #view-new textarea{
96
- width:100%;font-family:var(--font-body);font-size:17px;font-weight:600;color:var(--ink);
97
- background:var(--bg-card);border:2px solid var(--ctl-line);border-radius:14px;padding:13px 16px;outline:none;
98
- transition:border-color .15s ease, box-shadow .15s ease;
104
+ width:100%;min-height:44px;font-family:var(--font-body);font-size:17px;font-weight:400;color:var(--ink);
105
+ background:none;border:0;border-bottom:1px solid var(--rule);border-radius:0;padding:8px 0;outline:none;
106
+ transition:border-color .15s ease;
99
107
  }
100
- #view-new textarea{font-size:15.5px;line-height:1.5;resize:vertical;min-height:84px;display:block;}
108
+ #view-new textarea{font-size:15.5px;line-height:1.5;resize:vertical;min-height:64px;display:block;}
101
109
  /* no fade toward the card — a 70% mix washed placeholders to 2.89:1 (task 1002749) */
102
- #view-new input[type=text]::placeholder, #view-new textarea::placeholder{color:var(--ink-faint);font-weight:500;}
103
- #view-new input[type=text]:focus, #view-new textarea:focus{border-color:var(--accent);box-shadow:0 0 0 4px color-mix(in srgb,var(--accent) 13%,transparent);}
104
- #view-new input[type=text].bad{border-color:var(--err);}
105
- .hint{font-size:13px;font-weight:600;color:var(--ink-faint);margin-top:7px;min-height:18px;}
110
+ #view-new input[type=text]::placeholder, #view-new textarea::placeholder{color:var(--ink-faint);font-weight:400;}
111
+ #view-new input[type=text]:focus, #view-new textarea:focus{border-bottom-color:var(--ink);box-shadow:none;}
112
+ #view-new input[type=text].bad{border-bottom-color:var(--err);}
113
+ .hint{font-size:13.5px;font-weight:400;color:var(--ink-faint);line-height:1.45;margin-top:8px;min-height:18px;}
106
114
  .hint.ok{color:var(--ok);}
107
115
  .hint.err{color:var(--err);}
108
- .hint code{font-family:var(--font-mono);font-size:12.5px;background:var(--bg-deep);border-radius:6px;padding:1px 6px;color:var(--accent-deep);}
109
-
110
- .row2{display:grid;grid-template-columns:1fr 1fr;gap:14px;}
111
-
112
- /* choice cards (greenfield / adopt) */
113
- .choices{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-bottom:18px;}
114
- .choice{
115
- text-align:left;cursor:pointer;background:var(--bg-card);border:2px solid var(--line);border-radius:18px;
116
- padding:16px;font-family:var(--font-body);transition:all .15s ease;
117
- }
118
- .choice:hover{border-color:var(--rule);transform:translateY(-1px);}
119
- .choice[aria-pressed=true]{border-color:var(--accent);background:color-mix(in srgb,var(--accent) 5%,var(--bg-card));box-shadow:0 8px 24px -12px color-mix(in srgb,var(--accent) 35%,transparent);}
120
- .choice svg{display:block;margin-bottom:9px;}
121
- .choice b{display:block;font-size:15.5px;font-weight:700;margin-bottom:3px;}
122
- .choice p{font-size:13px;font-weight:500;color:var(--ink-soft);line-height:1.45;}
123
- .reassure{
124
- display:none;background:color-mix(in srgb,var(--sea) 8%,var(--bg-card));
125
- border:1.5px solid color-mix(in srgb,var(--sea) 25%,var(--bg-card));border-radius:14px;
126
- padding:12px 15px;font-size:13.5px;font-weight:500;color:color-mix(in srgb,var(--sea) 40%,var(--ink));line-height:1.5;margin-bottom:18px;
127
- }
116
+ .hint code{font-family:var(--font-mono);font-size:12.5px;background:none;border-radius:0;padding:0;color:var(--ink-soft);}
117
+ .hint strong{color:var(--ink);font-weight:500;}
118
+
119
+ .row2{display:grid;grid-template-columns:1fr 1fr;gap:0 22px;}
120
+
121
+ /* the choice (start fresh / adopt): two cells of one band on hairlines, the
122
+ chosen one carrying the dot — the dot is the mark, so the icon leaves */
123
+ .choices{display:grid;grid-template-columns:1fr 1fr;gap:0;border-top:1px solid var(--rule);border-bottom:1px solid var(--rule);margin:0 0 22px;}
124
+ .choice{display:grid;align-content:start;justify-items:start;text-align:left;cursor:pointer;background:none;border:0;border-left:1px solid var(--rule-soft);border-radius:0;padding:20px 22px 22px;font-family:var(--font-body);color:var(--ink-soft);transition:color .15s ease;}
125
+ .choice:first-child{border-left:0;padding-left:0;}
126
+ .choice:hover{border-color:var(--rule-soft);transform:none;}
127
+ .choice:hover b{color:var(--ink);}
128
+ .choice[aria-pressed=true]{border-color:var(--rule-soft);background:none;box-shadow:none;}
129
+ .choice svg{display:none;}
130
+ .choice b{display:flex;align-items:center;gap:10px;font-size:17px;font-weight:500;color:var(--ink);margin-bottom:6px;}
131
+ .choice b::before{content:"";width:7px;height:7px;border-radius:50%;border:1px solid var(--rule);background:var(--bg);flex:none;}
132
+ .choice[aria-pressed=true] b::before{background:var(--accent);border-color:var(--accent);outline:4px solid color-mix(in srgb,var(--accent) 22%,transparent);}
133
+ .choice p{font-size:14px;font-weight:400;color:var(--ink-soft);line-height:1.5;max-width:36ch;}
134
+ .choice p strong{color:var(--ink);font-weight:500;}
135
+ /* the reassurance is a clause, not a tinted box */
136
+ .reassure{display:none;font-size:13.5px;font-weight:400;color:var(--ink-soft);line-height:1.5;margin:0 0 22px;max-width:62ch;}
128
137
  .reassure.on{display:block;}
138
+ .reassure p{margin:0 0 10px;}
129
139
 
130
- /* one-click deep link to GitHub's own "New repository" page with the name
131
- pre-filled (greenfield only). No permissions — the visitor creates the empty
132
- repo in GitHub's own UI; we just fill in the blanks. The GitHub brand black
133
- is intentional, not a token (it must not follow a re-brand). */
140
+ /* the GitHub doors: one-click deep links to GitHub's own pages (the visitor
141
+ acts in GitHub's UI; we fill in the blanks). GitHub's brand black used to
142
+ be pinned here; in the world every GitHub door is the INVERTED pill the
143
+ gate's sign-in wears — ink on the ground — one grammar, still not the
144
+ accent, so a re-brand never paints it. */
134
145
  .ghbtn{
135
- display:inline-flex;align-items:center;gap:9px;text-decoration:none;cursor:pointer;
136
- background:#24292f;color:#fff;border:none;border-radius:999px;
137
- font-family:var(--font-body);font-weight:700;font-size:15px;padding:12px 22px;
138
- box-shadow:0 12px 26px -12px rgba(36,41,47,0.55);
139
- transition:transform .12s ease, background .12s ease;
146
+ display:inline-flex;align-items:center;justify-content:center;gap:10px;text-decoration:none;cursor:pointer;
147
+ min-height:44px;background:var(--ink);color:var(--bg);border:1px solid var(--ink);border-radius:999px;
148
+ font-family:var(--font-body);font-weight:500;font-size:15px;padding:0 22px;
149
+ box-shadow:none;transition:background .15s ease;
140
150
  }
141
- .ghbtn:hover{background:#1b1f24;transform:translateY(-1px);}
142
- .ghbtn:active{transform:translateY(0) scale(.98);}
143
- .ghbtn .gh{width:18px;height:18px;fill:currentColor;}
144
- .humanSteps .ghbtn{font-size:14px;padding:9px 16px;margin-top:10px;}
145
-
146
- .nav{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-top:26px;}
147
- /* two controls sharing one end of a nav row — the About step's Skip beside its
148
- Next (task 1002334). Wraps on a narrow card rather than crushing either. */
151
+ .ghbtn:hover{background:color-mix(in srgb,var(--ink) 88%,var(--bg));transform:none;}
152
+ .ghbtn:active{transform:none;}
153
+ .ghbtn .gh{width:17px;height:17px;fill:currentColor;}
154
+ .humanSteps .ghbtn{min-height:40px;font-size:14.5px;padding:0 18px;margin-top:12px;}
155
+
156
+ /* the doors under a step: back on the left, the primary on the right; the
157
+ About step's skip beside its next (task 1002334) wraps rather than crushes */
158
+ .nav{display:flex;align-items:center;justify-content:space-between;gap:8px;flex-wrap:wrap;margin-top:34px;}
149
159
  .navPair{display:inline-flex;align-items:center;gap:10px;flex-wrap:wrap;justify-content:flex-end;}
150
- .btn.big{width:100%;justify-content:center;font-size:18px;padding:17px 30px;}
151
-
152
- /* review list */
153
- .review{list-style:none;border:2px solid var(--line);border-radius:18px;overflow:hidden;margin-bottom:6px;}
154
- .review li{display:flex;justify-content:space-between;gap:16px;padding:13px 17px;font-size:14.5px;}
155
- .review li+li{border-top:1.5px solid var(--line);}
156
- .review .k{font-weight:600;color:var(--ink-faint);flex:0 0 auto;}
157
- .review .v{font-weight:700;text-align:right;word-break:break-word;}
158
- .review .v code{font-family:var(--font-mono);font-size:13px;background:var(--bg-deep);border-radius:6px;padding:1px 7px;color:var(--accent-deep);}
159
-
160
- /* ── done / human steps ── */
161
- .doneHead{display:flex;align-items:center;gap:12px;margin-bottom:8px;}
162
- .doneHead .tick{
163
- flex:0 0 44px;width:44px;height:44px;border-radius:50%;background:var(--ok);color:var(--on-ok);
164
- display:flex;align-items:center;justify-content:center;
165
- animation:pop .45s cubic-bezier(.34,1.56,.64,1) both;
166
- }
167
- @keyframes pop{from{transform:scale(.4);opacity:0}to{transform:scale(1);opacity:1}}
168
- .humanSteps{list-style:none;counter-reset:hs;margin-top:20px;}
160
+
161
+ /* the review: a ledger of what is about to be filed — label · value rows on
162
+ soft hairlines, the last row closed */
163
+ .review{list-style:none;display:grid;grid-template-columns:172px 1fr;gap:0 22px;border:0;border-radius:0;overflow:visible;margin:0 0 6px;}
164
+ .review li{display:contents;}
165
+ .review .k,.review .v{border-top:1px solid var(--rule-soft);padding:13px 0;min-width:0;}
166
+ .review li:last-child .k,.review li:last-child .v{border-bottom:1px solid var(--rule-soft);}
167
+ .review .k{font-family:var(--label-face);font-size:var(--label-size);letter-spacing:var(--label-space);text-transform:uppercase;font-weight:400;color:var(--ink-faint);padding-top:16px;}
168
+ .review .v{font-size:15px;font-weight:400;line-height:1.5;color:var(--ink);text-align:left;overflow-wrap:anywhere;}
169
+ .review .v code{font-family:var(--font-mono);font-size:13px;background:none;border-radius:0;padding:0;color:var(--ink-soft);}
170
+
171
+ /* ── done / human steps: the tick leaves (the rail says filed), the title
172
+ stands in the display voice, the steps only you can play are a numbered
173
+ ledger on soft hairlines — the finished one reads DONE in the ok ink, a
174
+ locked one keeps muted TOKENS, never subtree opacity (task 1002751) ── */
175
+ .doneHead{display:block;margin-bottom:8px;}
176
+ .doneHead .tick{display:none;}
177
+ .stepsHead{font-family:var(--label-face);font-size:var(--label-size);letter-spacing:var(--label-space);text-transform:uppercase;font-weight:400;color:var(--ink-faint);margin:40px 0 0;}
178
+ .humanSteps{list-style:none;counter-reset:hs;margin-top:16px;max-width:680px;}
169
179
  .humanSteps>li{
170
- position:relative;background:var(--bg-card);border:2px solid var(--line);border-radius:18px;
171
- padding:16px 18px 16px 58px;margin-bottom:12px;counter-increment:hs;
180
+ display:grid;grid-template-columns:44px 1fr;gap:0 16px;position:static;background:none;border:0;border-top:1px solid var(--rule-soft);border-radius:0;
181
+ padding:16px 0 18px;margin:0;counter-increment:hs;
172
182
  }
183
+ .humanSteps>li:last-child{border-bottom:1px solid var(--rule-soft);}
184
+ .humanSteps>li>*{grid-column:2;min-width:0;}
173
185
  .humanSteps>li::before{
174
- content:counter(hs);position:absolute;left:16px;top:16px;width:28px;height:28px;border-radius:50%;
175
- background:var(--bg-deep);color:var(--accent-deep);font-family:var(--font-display);font-weight:700;
176
- font-size:14px;display:flex;align-items:center;justify-content:center;
186
+ content:counter(hs,decimal-leading-zero);grid-column:1;grid-row:1;position:static;width:auto;height:auto;border-radius:0;
187
+ background:none;color:var(--ink-faint);font-family:var(--label-face);font-weight:400;font-size:var(--label-size);letter-spacing:var(--label-space);
188
+ display:block;padding-top:4px;
177
189
  }
178
- .humanSteps b{font-size:15px;}
179
- .humanSteps p{font-size:13.5px;font-weight:500;color:var(--ink-soft);line-height:1.55;margin-top:4px;}
190
+ .humanSteps b{display:block;font-size:16px;font-weight:500;color:var(--ink);}
191
+ .humanSteps p{font-size:14px;font-weight:400;color:var(--ink-soft);line-height:1.5;margin-top:4px;max-width:56ch;}
180
192
  /* a repo the platform already handled is named as a plain inline link (task 1002855) —
181
193
  the .ghbtn treatment reads as an action to take, and there is nothing here to do */
182
- .humanSteps p a{color:var(--link-ink);font-weight:700;text-decoration:none;}
183
- .humanSteps p a:hover{text-decoration:underline;}
194
+ .humanSteps p a{color:var(--ink);font-weight:400;text-decoration:underline;text-underline-offset:3px;display:inline-block;padding:3px 0;min-height:24px;line-height:18px;}
195
+ .humanSteps p a:hover{color:var(--ink);}
184
196
  /* live checklist states (task 1002694): a step the platform has verified done, and a
185
197
  step that can't be performed yet (its prerequisite — usually the domain — is missing) */
186
- .humanSteps>li.sdone{border-color:color-mix(in srgb,var(--ok) 30%,var(--bg-card));background:linear-gradient(180deg,color-mix(in srgb,var(--ok) 8%,var(--bg-card)) 0%,var(--bg-card) 100%);}
187
- .humanSteps>li.sdone::before{content:"✓";background:var(--ok);color:var(--on-ok);}
188
- /* locked = muted TOKENS, not subtree opacity — opacity multiplies after the
189
- token resolves and took this copy below AA (task 1002751) */
190
- .humanSteps>li.slocked{border-color:color-mix(in srgb,var(--line) 55%,var(--bg-card));}
198
+ .humanSteps>li.sdone{border-color:var(--rule-soft);background:none;}
199
+ .humanSteps>li.sdone::before{content:"done";text-transform:uppercase;background:none;color:var(--ok);}
200
+ .humanSteps>li.sdone b{color:var(--ink-soft);}
201
+ .humanSteps>li.slocked{border-color:var(--rule-soft);}
191
202
  .humanSteps>li.slocked b{color:var(--ink-soft);}
192
203
  .humanSteps>li.slocked p{color:var(--ink-faint);}
193
204
  .humanSteps>li.slocked::before{color:var(--ink-faint);}
194
205
  .humanSteps details{margin-top:10px;}
195
- .humanSteps summary{cursor:pointer;font-weight:700;font-size:12.5px;color:var(--ink-faint);}
206
+ .humanSteps summary{cursor:pointer;font-weight:400;font-size:13.5px;color:var(--ink-soft);}
207
+ .humanSteps summary:hover{color:var(--ink);}
196
208
  .humanSteps details p{margin-top:8px;}
197
- .kv{
198
- display:flex;align-items:center;gap:8px;margin-top:9px;background:var(--bg);border:1.5px solid var(--line);
199
- border-radius:11px;padding:8px 8px 8px 12px;font-size:12.5px;
200
- }
201
- .kv .kk{font-weight:700;color:var(--ink-faint);flex:0 0 auto;}
202
- .kv code{font-family:var(--font-mono);font-size:12px;color:var(--accent-deep);word-break:break-all;flex:1;}
209
+ .kv{display:flex;align-items:center;gap:10px;margin-top:8px;background:none;border:0;border-top:1px solid var(--rule-soft);border-radius:0;padding:8px 0;font-size:12.5px;}
210
+ .kv .kk{font-family:var(--label-face);font-size:var(--label-size);letter-spacing:var(--label-space);text-transform:uppercase;font-weight:400;color:var(--ink-faint);flex:0 0 auto;}
211
+ .kv code{font-family:var(--font-mono);font-size:12.5px;color:var(--ink-soft);word-break:break-all;flex:1;}
203
212
  .copy{
204
- flex:0 0 auto;cursor:pointer;border-radius:8px;background:var(--bg-card);border:1.5px solid var(--line);
205
- font-family:var(--font-body);font-size:11.5px;font-weight:700;color:var(--ink-soft);padding:5px 10px;
206
- transition:all .12s ease;
213
+ flex:0 0 auto;cursor:pointer;min-height:28px;border-radius:999px;background:none;border:1px solid var(--rule);
214
+ font-family:var(--font-body);font-size:12.5px;font-weight:400;color:var(--ink-soft);padding:0 12px;
215
+ transition:border-color .12s ease,color .12s ease;
207
216
  }
208
- .copy:hover{border-color:var(--accent);color:var(--accent-deep);}
209
- .copy.did{background:var(--ok);border-color:var(--ok);color:var(--on-ok);}
210
- .samePath{font-size:12.5px;font-weight:500;color:var(--ink-faint);margin-top:16px;}
217
+ .copy:hover{border-color:var(--ink-faint);color:var(--ink);}
218
+ .copy.did{background:none;border-color:var(--ok);color:var(--ok);}
219
+ .samePath{font-size:13px;font-weight:400;color:var(--ink-faint);margin-top:18px;}
211
220
  #liveProgress{margin-top:4px;}
212
221
 
213
- /* ── live build progress (task 2083) ── */
214
- .prog{
215
- background:linear-gradient(180deg,color-mix(in srgb,var(--sea) 8%,var(--bg-card)) 0%,var(--bg-card) 100%);
216
- border:2px solid var(--sea-soft);border-radius:18px;padding:18px 20px 16px;margin-top:14px;
217
- }
218
- .prog .stages{display:flex;list-style:none;margin-bottom:4px;}
219
- .prog .stages li{flex:1;display:flex;flex-direction:column;align-items:center;gap:7px;position:relative;}
220
- .prog .stages li:not(:first-child)::before{
221
- content:"";position:absolute;top:11px;right:50%;width:100%;height:3px;border-radius:2px;
222
- background:var(--sea-soft);z-index:0;margin-right:12px;
223
- }
224
- /* state marks paint --sea-ink / --on-ok, mirroring cosmos's .strip (task
225
- 1002751) — raw --sea sat at 3.03:1 in dark and the #fff tick at 1.74:1 on
226
- dark's bright --ok */
227
- .prog .stages li.done:not(:first-child)::before{background:var(--sea-ink);}
228
- .prog .sdot{
229
- position:relative;z-index:1;width:24px;height:24px;border-radius:50%;
230
- border:3px solid var(--sea-soft);background:var(--bg-card);display:flex;align-items:center;justify-content:center;
231
- }
232
- .prog .stages li.done .sdot{border-color:var(--sea-ink);background:var(--sea-ink);}
233
- .prog .stages li.done .sdot::after{content:"";width:8px;height:5px;border-left:2.5px solid var(--on-ok);border-bottom:2.5px solid var(--on-ok);transform:rotate(-45deg) translate(1px,-1px);}
234
- .prog .stages li.now .sdot{border-color:var(--sea-ink);}
235
- .prog .stages li.now .sdot::after{
236
- content:"";width:8px;height:8px;border-radius:50%;background:var(--sea-ink);
237
- animation:beatPulse 1.2s ease-in-out infinite;
238
- }
239
- /* idle labels match cosmos's .strip .slbl — the 55% sea mix washed to 4.15:1 in dark */
240
- .prog .slbl{font-size:12px;font-weight:700;color:var(--ink-faint);}
241
- .prog .stages li.now .slbl,.prog .stages li.done .slbl{color:color-mix(in srgb,var(--sea) 40%,var(--ink));}
242
- .prog .pnote{text-align:center;font-size:13px;font-weight:600;color:color-mix(in srgb,var(--sea) 45%,var(--ink-soft));min-height:18px;}
243
- .prog .pnote a{color:var(--link-ink);font-weight:700;text-decoration:none;}
244
- .prog .pnote a:hover{text-decoration:underline;}
245
- .prog.isLive{background:linear-gradient(180deg,color-mix(in srgb,var(--ok) 8%,var(--bg-card)) 0%,var(--bg-card) 100%);border-color:color-mix(in srgb,var(--ok) 30%,var(--bg-card));}
246
- .prog.isLive .stages li.done:not(:first-child)::before{background:var(--ok);}
222
+ /* ── the standup strip (task 2083), drawn as the lifecycle rail (DESIGN.md):
223
+ three hairlines, a 7px dot, one lit step — no plate, no connector, no
224
+ pulse. The vocabulary is the page's fixed one (F22): filed / standing it
225
+ up / live; isLive in the ok ink, isErr in the error ink, flowDown neutral.
226
+ The marks mirror cosmos's .strip on the derived tokens (task 1002751). ── */
227
+ .prog{background:none;border:0;border-radius:0;padding:0;margin-top:22px;max-width:520px;}
228
+ .prog .stages{display:grid;grid-template-columns:repeat(3,1fr);gap:0 10px;list-style:none;margin:0;}
229
+ .prog .stages li{display:block;position:relative;border-top:1px solid var(--rule);padding:12px 0 0;}
230
+ .prog .stages li:not(:first-child)::before{content:none;}
231
+ .prog .sdot{position:absolute;top:-4px;left:0;width:7px;height:7px;border:1px solid var(--rule);border-radius:50%;background:var(--bg);display:block;}
232
+ .prog .stages li.done{border-top-color:var(--ink-soft);}
233
+ .prog .stages li.done .sdot{border-color:var(--ink-soft);background:var(--ink-soft);}
234
+ .prog .stages li.done .sdot::after{content:none;}
235
+ .prog .stages li.now{border-top-color:var(--accent);}
236
+ .prog .stages li.now .sdot{border-color:var(--accent);background:var(--accent);outline:4px solid color-mix(in srgb,var(--accent) 22%,transparent);}
237
+ .prog .stages li.now .sdot::after{content:none;animation:none;}
238
+ .prog .slbl{display:block;font-family:var(--label-face);font-size:var(--label-size);font-weight:400;letter-spacing:var(--label-space);text-transform:uppercase;line-height:1.3;color:var(--ink-faint);}
239
+ .prog .stages li.now .slbl{color:var(--ink);}
240
+ .prog .stages li.done .slbl{color:var(--ink-soft);}
241
+ .prog .pnote{text-align:left;font-size:13px;font-weight:400;line-height:1.45;color:var(--ink-soft);margin:8px 0 0;min-height:0;}
242
+ .prog .pnote a{color:var(--ink);font-weight:400;text-decoration:underline;text-underline-offset:3px;display:inline-block;padding:3px 0;min-height:24px;line-height:18px;}
243
+ .prog.isLive{background:none;border-color:transparent;}
244
+ .prog.isLive .stages li.done{border-top-color:var(--ok);}
247
245
  .prog.isLive .stages li.done .sdot{border-color:var(--ok);background:var(--ok);}
248
246
  .prog.isLive .slbl{color:var(--ok);}
249
- .prog.isLive .stages li.done .slbl{color:color-mix(in srgb,var(--ok) 75%,var(--ink));}
250
- .prog.isLive .pnote{color:color-mix(in srgb,var(--ok) 75%,var(--ink));font-size:14px;}
251
- .prog.isErr{background:var(--err-soft);border-color:color-mix(in srgb,var(--err) 25%,var(--bg-card));}
247
+ .prog.isLive .stages li.done .slbl{color:var(--ok);}
248
+ .prog.isLive .pnote{color:var(--ok);font-size:13.5px;}
249
+ .prog.isErr{background:none;border-color:transparent;}
250
+ .prog.isErr .stages li.now{border-top-color:var(--err);}
251
+ .prog.isErr .stages li.now .sdot{border-color:var(--err);background:var(--err);outline:4px solid color-mix(in srgb,var(--err) 22%,transparent);}
252
252
  .prog.isErr .pnote{color:var(--err);}
253
- /* teardown's calm neutral (F22) — transcribed from cosmos's .strip.flowDown,
254
- the same .prog-mirrors-.strip duplication as the rest of this block */
255
- .prog.flowDown{border-color:var(--line);background:linear-gradient(180deg,var(--neutral-soft) 0%,var(--bg-card) 100%);}
256
- .prog.flowDown .stages li:not(:first-child)::before{background:var(--line);}
257
- .prog.flowDown .stages li.done:not(:first-child)::before{background:var(--ink-faint);}
258
- .prog.flowDown .sdot{border-color:var(--line);}
259
- .prog.flowDown .stages li.done .sdot{border-color:var(--ink-faint);background:var(--ink-faint);}
260
- .prog.flowDown .stages li.now .sdot{border-color:var(--ink-soft);}
261
- .prog.flowDown .stages li.now .sdot::after{background:var(--ink-soft);}
253
+ /* teardown's calm neutral (F22), the same vocabulary cosmos's .strip.flowDown speaks */
254
+ .prog.flowDown .stages li.done{border-top-color:var(--ink-soft);}
255
+ .prog.flowDown .stages li.now{border-top-color:var(--ink-soft);}
256
+ .prog.flowDown .stages li.now .sdot{border-color:var(--ink-soft);background:var(--ink-soft);outline:none;}
262
257
  .prog.flowDown .slbl{color:var(--ink-faint);}
263
258
  .prog.flowDown .stages li.now .slbl,.prog.flowDown .stages li.done .slbl{color:var(--ink-soft);}
264
259
  .again{
265
- display:inline-block;margin-top:14px;font-size:13px;font-weight:700;color:var(--ink-faint);
260
+ display:inline-block;margin-top:14px;font-size:13.5px;font-weight:400;color:var(--ink-soft);
266
261
  background:none;border:none;cursor:pointer;font-family:var(--font-body);text-decoration:underline;
267
262
  text-underline-offset:3px;padding:6px 2px;min-height:24px;
268
263
  }
269
- .again:hover{color:var(--accent-deep);}
270
- /* every fold on this page is a real target: these summaries are 12.5–13px text
264
+ .again:hover{color:var(--ink);}
265
+ /* every fold on this page is a real target: these summaries are 13–14.5px text
271
266
  and measured under the 24px minimum (WCAG 2.2 target size, AA). Not
272
267
  display:flex — that would drop the disclosure marker every fold shows today. */
273
268
  summary{min-height:24px;padding:3px 0;}
274
269
 
275
- /* the collapsed address step — a confirmation, not a form (task 1002704) */
276
- .addrConfirm{border:2px solid color-mix(in srgb,var(--ok) 30%,var(--bg-card));border-radius:18px;padding:18px 20px;background:linear-gradient(180deg,color-mix(in srgb,var(--ok) 8%,var(--bg-card)) 0%,var(--bg-card) 100%);margin-bottom:16px;}
277
- .addrConfirm.optedOut{border-color:var(--line);background:var(--bg);}
278
- .addrConfirm.optedOut .addrBig{color:var(--ink-soft);}
270
+ /* the address step (task 1002704): the assigned address as a fact in the
271
+ display voice — the address itself large, its clause under it in the body
272
+ face — no box; the alternatives sit under it in the open (task 1002898 N8) */
273
+ .addrConfirm{border:0;border-radius:0;padding:0;background:none;margin:0 0 22px;}
274
+ .addrBig{font-family:var(--font-body);font-weight:400;font-size:14.5px;letter-spacing:0;line-height:1.5;color:var(--ink-soft);overflow-wrap:anywhere;}
275
+ .addrBig code{display:block;font-family:var(--font-display);font-weight:300;font-size:clamp(24px,3vw,36px);letter-spacing:-.03em;line-height:1.1;background:none;border-radius:0;padding:0;margin:0 0 6px;color:var(--ink);word-break:normal;}
276
+ .addrConfirm.optedOut{border-color:transparent;background:none;}
277
+ .addrConfirm.optedOut .addrBig{font-family:var(--font-display);font-weight:300;font-size:clamp(22px,2.6vw,32px);letter-spacing:-.03em;line-height:1.1;color:var(--ink-soft);}
279
278
  .addrConfirm.optedOut>p{color:var(--ink-faint);}
280
279
  /* the handle is not free (task 1002898 N10) — a refusal must not be painted into the
281
- green confirmation box that means "yours" */
282
- .addrConfirm.unavailable{border-color:color-mix(in srgb,var(--err) 45%,var(--bg-card));background:var(--bg);}
283
- .addrConfirm.unavailable .addrBig{color:var(--err);}
284
- .addrBig{font-family:var(--font-display);font-weight:700;font-size:19px;letter-spacing:-0.3px;line-height:1.4;}
285
- .addrBig code{font-family:var(--font-mono);font-size:15px;background:var(--bg-deep);border-radius:8px;padding:2px 9px;color:var(--accent-deep);word-break:break-all;}
286
- .addrConfirm>p{font-size:13.5px;font-weight:500;color:var(--ink-soft);line-height:1.5;margin-top:6px;}
287
- .addrConfirm details{margin-top:12px;}
288
- .addrConfirm summary{cursor:pointer;font-size:13px;font-weight:700;color:var(--ink-faint);}
289
- .addrConfirm details .inner{margin-top:10px;}
290
- .addrOpt{display:flex;align-items:flex-start;gap:8px;margin-top:12px;font-size:12.5px;font-weight:600;color:var(--warn);line-height:1.5;}
291
- .addrOpt input{margin-top:2px;}
292
-
293
- /* GitHub repo picker (task 1002099) */
280
+ green confirmation that means "yours" */
281
+ .addrConfirm.unavailable{border-color:transparent;background:none;}
282
+ .addrConfirm.unavailable .addrBig,.addrConfirm.unavailable .addrBig code{color:var(--err);}
283
+ .addrConfirm>p{font-size:13.5px;font-weight:400;color:var(--ink-soft);line-height:1.5;margin-top:8px;max-width:62ch;}
284
+ .addrConfirm details{margin-top:14px;}
285
+ .addrConfirm summary{cursor:pointer;display:inline-flex;align-items:center;font-size:14.5px;font-weight:400;color:var(--ink-soft);}
286
+ .addrConfirm summary:hover,.addrConfirm details[open] summary{color:var(--ink);}
287
+ .addrConfirm details .inner{margin-top:6px;}
288
+ .addrOpt{display:flex;align-items:flex-start;gap:12px;margin-top:14px;font-size:14px;font-weight:400;color:var(--warn);line-height:1.5;cursor:pointer;}
289
+ .addrOpt input{margin-top:4px;accent-color:var(--accent);}
290
+
291
+ /* GitHub repo picker (task 1002099): hairline rows, the chosen one marked on
292
+ the accent; the private badge in the label face */
294
293
  #ghConnect .btn{margin-top:4px;}
295
- .ghlist{margin-top:8px;max-height:220px;overflow-y:auto;border:1px solid var(--line);border-radius:10px;background:var(--bg-deep);}
294
+ .ghlist{margin-top:4px;max-height:220px;overflow-y:auto;border:0;border-top:1px solid var(--rule);border-radius:0;background:none;}
296
295
  .ghlist:empty{display:none;}
297
- /* rows sit on --bg-deep, so their tints mix over THAT, not the card */
298
- .ghrow{display:flex;align-items:center;gap:8px;width:100%;text-align:left;background:none;border:0;border-bottom:1px solid color-mix(in srgb,var(--ink) 8%,transparent);padding:9px 12px;font:inherit;font-size:13.5px;color:var(--ink);cursor:pointer;}
296
+ .ghrow{display:flex;align-items:center;gap:8px;width:100%;min-height:40px;text-align:left;background:none;border:0;border-bottom:1px solid var(--rule-soft);padding:10px 0;font:inherit;font-size:14px;color:var(--ink);cursor:pointer;}
299
297
  .ghrow:last-child{border-bottom:0;}
300
- .ghrow:hover{background:color-mix(in srgb,var(--accent) 6%,var(--bg-deep));}
301
- .ghrow[aria-current=true]{background:color-mix(in srgb,var(--accent) 12%,var(--bg-deep));box-shadow:inset 3px 0 0 var(--accent);font-weight:600;}
302
- /* --ink-soft, not --ink-faint: the badge tint is the darkest ground on the page,
303
- and faint ink only reaches 3.96:1 on it (task 1002749). */
304
- .ghrow .priv{margin-left:auto;font-size:11px;font-weight:600;color:var(--ink-soft);background:color-mix(in srgb,var(--ink) 8%,transparent);border-radius:5px;padding:1px 6px;}
305
-
306
- /* the type declaration (task 1002772): five selectable pills + a description
307
- card themed per type via a component-scoped custom property (C1 — never a
308
- page-local root token). No dark rules of its own: every surface is a token
309
- or a color-mix over one, so both modes carry it (C2/C4). */
310
- .typeCards{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:14px;}
311
- .tpill{cursor:pointer;font-family:var(--font-body);font-weight:700;font-size:13.5px;color:var(--ink-soft);
312
- background:var(--bg-card);border:2px solid var(--line);border-radius:999px;padding:9px 16px;
313
- transition:all .12s ease;}
314
- .tpill:hover{border-color:var(--accent);color:var(--accent-deep);}
315
- .tpill[aria-pressed=true]{background:var(--accent);border-color:var(--accent);color:var(--accent-on);}
316
- .typeCard{border:2px solid color-mix(in srgb,var(--type-acc) 35%,var(--bg-card));border-radius:18px;
317
- padding:16px 18px;margin-bottom:6px;
318
- background:linear-gradient(180deg,color-mix(in srgb,var(--type-acc) 9%,var(--bg-card)) 0%,var(--bg-card) 100%);}
319
- .typeCard b{display:block;font-family:var(--font-display);font-size:17px;color:color-mix(in srgb,var(--type-acc) 40%,var(--ink));margin-bottom:4px;}
320
- .typeCard p{font-size:13.5px;font-weight:500;color:var(--ink-soft);line-height:1.55;}
298
+ .ghrow:hover{background:none;text-decoration:underline;text-underline-offset:3px;}
299
+ .ghrow[aria-current=true]{background:none;box-shadow:none;border-left:2px solid var(--accent);padding-left:10px;font-weight:500;}
300
+ .ghrow .priv{margin-left:auto;font-family:var(--label-face);font-size:var(--label-size);letter-spacing:var(--label-space);text-transform:uppercase;font-weight:400;color:var(--ink-soft);background:none;border-radius:0;padding:0;}
301
+
302
+ /* the type declaration (task 1002772) as hairline cells of one band (the
303
+ Projects band's grammar): the chosen cell carries the dot; its description
304
+ is a clause under the band, no tinted card. The team question wears the
305
+ same band. --type-acc stays a component-scoped custom property (C1). */
306
+ .typeCards{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:0;border-top:1px solid var(--rule);border-bottom:1px solid var(--rule);margin:0 0 14px;}
307
+ .tpill{display:flex;align-items:center;gap:10px;cursor:pointer;text-align:left;font-family:var(--font-body);font-weight:500;font-size:15px;color:var(--ink);
308
+ background:none;border:0;border-left:1px solid var(--rule-soft);border-radius:0;padding:16px 18px;min-height:56px;transition:color .12s ease;}
309
+ .tpill:first-child{border-left:0;padding-left:0;}
310
+ .tpill::before{content:"";width:7px;height:7px;border-radius:50%;border:1px solid var(--rule);background:var(--bg);flex:none;}
311
+ .tpill:hover{border-color:var(--rule-soft);color:var(--ink);}
312
+ .tpill:hover::before{border-color:var(--ink-faint);}
313
+ .tpill[aria-pressed=true]{background:none;border-color:var(--rule-soft);color:var(--ink);}
314
+ .tpill[aria-pressed=true]::before{background:var(--accent);border-color:var(--accent);outline:4px solid color-mix(in srgb,var(--accent) 22%,transparent);}
315
+ .typeCard{border:0;border-radius:0;padding:4px 0 0;margin-bottom:6px;background:none;}
316
+ .typeCard b{display:block;font-family:var(--font-body);font-size:15px;font-weight:500;color:var(--ink);margin-bottom:4px;}
317
+ .typeCard p{font-size:14px;font-weight:400;color:var(--ink-soft);line-height:1.5;max-width:62ch;}
321
318
 
322
319
  /* 840px matches cosmos's createSplit collapse, the breakpoint the old /create
323
- used (860) — the two-up grids and the bongo cell fold together */
324
- @media (max-width:840px){.row2,.choices{grid-template-columns:1fr;}}
320
+ used (860) — the bands stack their cells on hairlines, the ledger folds */
321
+ @media (max-width:840px){
322
+ .row2,.choices{grid-template-columns:1fr;}
323
+ .choice{border-left:0;padding-left:0;border-top:1px solid var(--rule-soft);}
324
+ .choice:first-child{border-top:0;}
325
+ .typeCards{grid-template-columns:1fr;}
326
+ .tpill{border-left:0;padding-left:0;border-top:1px solid var(--rule-soft);}
327
+ .tpill:first-child{border-top:0;}
328
+ .review{grid-template-columns:1fr;gap:0;}
329
+ .review .k{padding-bottom:0;}
330
+ .review .v{border-top:0;padding-top:6px;}
331
+ .review li:last-child .k{border-bottom:0;}
332
+ }
325
333
 
326
334
  </style>
327
335
  </head>
@@ -1005,9 +1013,9 @@ summary{min-height:24px;padding:3px 0;}
1005
1013
  <p class="lede">One tap files the request and the platform starts standing your project up — server, database, address. Here's the beat you're about to drop:</p>
1006
1014
  <ul class="review" id="reviewList"></ul>
1007
1015
  <div class="alert" id="createAlert" role="alert"></div>
1008
- <div class="nav" style="flex-direction:column;align-items:stretch;">
1016
+ <div class="nav">
1017
+ <button type="button" class="btn ghost" data-back="5">← Back</button>
1009
1018
  <button type="button" class="btn big" id="doCreate">Create my project</button>
1010
- <button type="button" class="btn ghost" data-back="5" style="align-self:flex-start;margin-top:10px;">← Back</button>
1011
1019
  </div>
1012
1020
  <p class="finePrint">This files the request; the control plane does the real standup and nothing touches servers from this page. You'll get the few steps only you can do right after.</p>
1013
1021
  </section>
@@ -1022,7 +1030,7 @@ summary{min-height:24px;padding:3px 0;}
1022
1030
  <!-- the STABLE live region: the strip inside is rebuilt every 5s tick,
1023
1031
  and a live region that is itself replaced never announces -->
1024
1032
  <div id="liveProgress" role="status" aria-live="polite"></div>
1025
- <h2 style="font-family:var(--font-display);font-size:19px;margin-top:22px;">Your steps — the parts only you can play</h2>
1033
+ <h2 class="stepsHead">Your steps — the parts only you can play</h2>
1026
1034
  <ol class="humanSteps" id="humanSteps"></ol>
1027
1035
  <p class="samePath">These are the same steps however a project is created — nothing here is special to this page.</p>
1028
1036
  </section>
@@ -131,6 +131,12 @@
131
131
  "expect": {"text":[["#mJoinMsg","Saved. The project restarts to apply it."],["#mName","demo"]],"checked":"input[name=\"mJoinPick\"][value=\"apply\"]","visible":["#mOrb .worldOrb","#mFacts .ledger .k"]} },
132
132
  { "name": "manage flows: the ender asks for the name typed back, queues the teardown, and the page re-reads the project as queued", "auth": true, "width": 1440, "url": "/projects?view=manage&id=105",
133
133
  "steps": [["wait",900],["click","[data-del-ask]"],["wait",200],["fill","#mDelName","mooring"],["wait",100],["click","[data-del-yes]"],["wait",900]],
134
- "expect": {"text":[["#mDel .addr","A teardown is queued for this project."],["#mName","mooring"]],"hidden":["#mDelName","[data-del-ask]"],"visible":["#mStrip .strip.flowDown"]} }
134
+ "expect": {"text":[["#mDel .addr","A teardown is queued for this project."],["#mName","mooring"]],"hidden":["#mDelName","[data-del-ask]"],"visible":["#mStrip .strip.flowDown"]} },
135
+ { "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",
136
+ "steps": [["wait",600],["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-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","#doCreate"],["wait",1500]],
137
+ "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"]]} },
138
+ { "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",
139
+ "steps": [["wait",600],["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-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]],
140
+ "expect": {"visible":["#panel-review","#reviewList li","#doCreate"],"hidden":["#panel-address"],"text":[["#rev-h","Ready to roll"]]} }
135
141
  ]
136
142
  }
@@ -4,7 +4,7 @@
4
4
  "surface": "public-landing",
5
5
  "modes": ["dark"],
6
6
  "modeQuery": false,
7
- "ignoreRequests": ["/api/(gds|bongos)/me$", "/my-projects", "/provisioning/instances/999", "/provisioning/instances/101$", "/api/gds/instance$"],
7
+ "ignoreRequests": ["/api/(gds|bongos)/me$", "/my-projects", "/provisioning/instances/999", "/provisioning/instances/101$", "/api/gds/instance$", "/github/repos$", "/provisioning/onboard-plan"],
8
8
  "ignoreConsole": ["/api/(gds|bongos)/me", "\\b401\\b", "\\b404\\b", "Unauthorized"],
9
9
  "ignoreControls": [".skip", ".vh"],
10
10
  "states": {
@@ -24,6 +24,12 @@
24
24
  "out-manage": { "auth": false, "url": "/projects?view=manage&id=101", "expect": { "visible": ["#mGate"], "hidden": ["#mMain", "#mMissing"] } },
25
25
  "in-new": { "auth": true, "url": "/projects?view=new", "expect": { "hidden": ["#qWrap"] } },
26
26
  "out-new": { "auth": false, "url": "/projects?view=new", "expect": { "hidden": ["#qWrap"] } },
27
+ "in-new-type": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400]], "expect": {"visible":["#panel-type"],"hidden":["#panel-name","#qWrap"]} },
28
+ "in-new-about": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["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"]} },
29
+ "in-new-home": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["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-home"],"hidden":["#panel-detail","#qWrap"]} },
30
+ "in-new-address": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["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-home button[type=submit]"],["wait",400]], "expect": {"visible":["#panel-address"],"hidden":["#panel-home","#qWrap"]} },
31
+ "in-new-review": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["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-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-review","#reviewList li"],"hidden":["#panel-address","#qWrap"]} },
32
+ "in-new-done": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["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-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","#doCreate"],["wait",1500]], "expect": {"visible":["#panel-done","#liveProgress .prog","#humanSteps li"],"hidden":["#panel-review","#qWrap"]} },
27
33
  "out-map-projects": { "auth": false, "actions": [["click", "#projTrig"], ["wait", 350]], "expect": { "expanded": true, "hidden": ["#menuProjects [data-nav=\"mine\"]"] } },
28
34
  "card": { "auth": true, "actions": [["dispatchClick", "#orbField a.worldOrb[data-origin=\"https://amazonprimea.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", "amazonprimea.com"], ["#cardFaces .facesMore", "+6"]], "count": [["#cardFaces img", 5]], "href": [["#cardHall", "https://builders.amazonprimea.com/"]] } },
29
35
  "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"]] } },