minutework 0.1.56 → 0.1.58

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.
@@ -1,14 +1,24 @@
1
1
  ---
2
2
  name: vuilder-mode-b-hosted-and-spawn
3
- description: "Mode B Vuilder: run a hosted broker/demo on your operator runtime, let customers join via /_mw, and offer opt-in 'spawn my own runtime' later (configurable trigger). Use when customers try a hosted product before getting their own server."
3
+ description: "Mode B Vuilder: run your own real product on your host runtime where your team and outside members work with full platform capability; a member can opt to 'create my own server' (mint), or a /_mw customer upgrades to their own runtime (promote)."
4
4
  ---
5
5
 
6
- # Vuilder Mode B: Hosted Broker/Demo + Opt-In Spawn
6
+ # Vuilder Mode B: The Vuilder's Own Runtime + Opt-In "Create My Own Server"
7
7
 
8
- Use this skill when a generated Vuilder workspace runs a **hosted product** on
9
- its own operator runtime that customers consume first, and only **later** do
10
- those customers provision their **own** runtime. Read
11
- `vuilder-workspace-architecture/SKILL.md` first; this skill specializes it.
8
+ Use this skill when a generated Vuilder workspace runs a **real product on the
9
+ Vuilder's own runtime** the Vuilder is a full MinuteWork tenant using the whole
10
+ platform: their **own host runtime**, their **team collaborating there with the
11
+ runtime's AI, agents, and threads over real records**, and outside users joining
12
+ as **members** of that runtime with full platform capability. Later, a member (or
13
+ a product-consumer customer) can opt to **create their own server** — a separate
14
+ runtime of their own. Read `vuilder-workspace-architecture/SKILL.md` first; this
15
+ skill specializes it.
16
+
17
+ Mode B is **not whitelabeling and not a throwaway demo.** The Vuilder runs their
18
+ own real tenant business; "hosted broker", "shared demo", and "shared workspace"
19
+ are only *shapes* that business can take, never the definition. The point is that
20
+ the Vuilder and their members work together on the platform with full capability
21
+ (AI, agents, threads, records), and a member can graduate to their own server.
12
22
 
13
23
  This skill is vertical-neutral. FleetRun and Ostronaut appear only as clearly
14
24
  marked illustrative examples — never as platform behavior to hardcode.
@@ -16,150 +26,199 @@ marked illustrative examples — never as platform behavior to hardcode.
16
26
  ## Mode A vs Mode B — decide which you are
17
27
 
18
28
  - **Mode A (signup = auto-spawn).** A customer signs up on the Vuilder public
19
- site and the platform immediately provisions a fresh customer tenant runtime
20
- and installs the app pack. This is the default flow in
21
- `vuilder-workspace-architecture` (`customer_vertical_signup`). Pick Mode A
22
- when every customer needs their own isolated runtime from day one.
23
- - **Mode B (hosted broker/demo, then opt-in spawn).** The Vuilder runs a shared
24
- hosted product on its **operator runtime**. Customers **join the host
25
- runtime** via `/_mw` customer auth and use the product there (a broker, a
26
- demo, a shared workspace). Each customer provisions their **own** runtime
27
- **later**, as an explicit opt-in step keeping their identity and history.
28
- Pick Mode B when customers should try value before committing to their own
29
- server, or when their own runtime should appear only once a condition holds.
29
+ site and the platform immediately provisions them a fresh runtime and installs
30
+ the app pack (`customer_vertical_signup`). Pick Mode A when every customer needs
31
+ their own isolated runtime from day one.
32
+ - **Mode B (the Vuilder's own runtime first, then opt-in "create my own
33
+ server").** The Vuilder runs their **own real product** on their **host
34
+ runtime**. Their team and outside **members** work there with full platform
35
+ capability; some users may instead join only as **product-consumer customers**.
36
+ Later, a member or customer opts to **create their own server** — the platform
37
+ provisions a separate runtime for them and installs the Vuilder's published
38
+ pack, while they keep their place on the host runtime. Pick Mode B when people
39
+ should work on (or consume) the Vuilder's runtime before or instead of
40
+ standing up their own.
30
41
 
31
42
  > Illustrative only:
32
- > - *FleetRun* (insurance brokering): carriers sign up as customers of the
33
- > host runtime and opt to spawn their own runtime when they are ready.
34
- > - *Ostronaut* (retail conversation intelligence): stores try a hosted demo
35
- > and spawn their own runtime when real store data starts flowing.
43
+ > - *FleetRun* (insurance brokering): carriers join the Vuilder's runtime and
44
+ > later create their own server when they are ready.
45
+ > - *Ostronaut* (retail conversation intelligence): stores use the hosted product
46
+ > and create their own server when real store data starts flowing.
36
47
  >
37
48
  > Both are instances of the same vertical-neutral shape; do not copy their
38
49
  > vocabulary into schemas, manifests, or services.
39
50
 
40
- If signup must always provision a runtime, you want Mode A — stop here and use
41
- `vuilder-workspace-architecture`.
51
+ If people must always get their own runtime at signup, you want Mode A — stop
52
+ here and use `vuilder-workspace-architecture`.
53
+
54
+ ## Two join planes — member vs customer (decide which, or both)
55
+
56
+ Mode B has **two distinct ways** an outside user joins the host runtime. They are
57
+ different auth planes with different capability, and a Mode B product may use one
58
+ or both. The member plane is the richer, collaboration-first shape.
59
+
60
+ - **Member-plane join (full capability — the collaboration shape).** Outside
61
+ users are **invited as members** of the Vuilder's tenant: a platform
62
+ `Membership` reached through **SSO + the branded shell** (`vuilder-shell`,
63
+ `/w/[workspace_slug]`). Members get full platform capability — threads, agents,
64
+ AI, records — and work alongside the Vuilder's own team on the host runtime.
65
+ This is the "the Vuilder and outside members build/operate together with the
66
+ platform's AI" shape. See `shell-architecture/SKILL.md` and the identity
67
+ substrate below.
68
+ - **Customer-plane join (product-consumer).** Users authenticate as
69
+ `tenant_customer` through same-origin **`/_mw`** on a `tenant-app` and consume a
70
+ bounded **hosted product surface** under `/app` (read/act through
71
+ `webCustomerExposed` query/action manifests). This is the "consume a hosted
72
+ product" shape, not full shell/member capability.
73
+
74
+ Do not collapse Mode B into "`/_mw` only." Name which plane(s) your product uses;
75
+ the member plane is the default for collaboration-first verticals.
42
76
 
43
77
  ## Surface shape (follow the Starter Choice Matrix; shell-first)
44
78
 
45
- - **`tenant-app`** hosts marketing, native `/_mw` customer signup/login, and the
46
- hosted product under `/app`. Browser customer auth uses `@minutework/web-auth`
47
- against same-origin `/_mw/auth/*`; the principal is `tenant_customer`. `/_mw`
48
- only resolves on a **live, canonical** customer-web host go live with
49
- `minutework deploy --live`. See `tenant-app-customer-auth-deploy/SKILL.md`.
50
- - **The hosted broker/demo runs on the Vuilder's operator runtime**, not in the
51
- browser. `/app` consumes it through `mw.query` / `mw.action` against
52
- `webCustomerExposed` query/action manifests (see `app-pack-authoring/SKILL.md`
53
- and `generated-workspace-architecture/SKILL.md`). Browser intake is untrusted:
54
- it never chooses package refs, runtime providers, tenant ids, or install
79
+ - **`vuilder-shell`** is the primary **member-plane** surface the branded
80
+ member/operator shell (`/w/[workspace_slug]`) for the Vuilder's own team, for
81
+ invited members, and later for anyone who has their own server. Its `/login` is
82
+ an SSO handoff (see the `vuilder-workspace-architecture` hard boundary); the
83
+ shell never owns identity, provisioning, or app-pack install authority. See
84
+ `shell-architecture/SKILL.md`.
85
+ - **`tenant-app`** is the **customer-plane** surface: marketing, native `/_mw`
86
+ customer signup/login, and the hosted product under `/app`. Browser customer
87
+ auth uses `@minutework/web-auth` against same-origin `/_mw/auth/*`; the
88
+ principal is `tenant_customer`. `/_mw` only resolves on a **live, canonical**
89
+ customer-web host — go live with `minutework deploy --live`. See
90
+ `tenant-app-customer-auth-deploy/SKILL.md`.
91
+ - **The hosted product runs on the Vuilder's host runtime**, not in the browser.
92
+ `/app` consumes it through `mw.query` / `mw.action` against `webCustomerExposed`
93
+ manifests (see `app-pack-authoring/SKILL.md`,
94
+ `generated-workspace-architecture/SKILL.md`). Browser intake is untrusted: it
95
+ never chooses package refs, runtime providers, tenant ids, or install
55
96
  coordinates.
56
- - **`vuilder-shell`** remains the branded member/operator surface
57
- (`/w/[workspace_slug]`) for the Vuilder's own operators and for customers once
58
- they have their own runtime. See `shell-architecture/SKILL.md`. The hard
59
- boundary still holds: the shell never owns identity, provisioning, or app-pack
60
- install authority.
61
97
 
62
- ## Shadow tenant + claim continuity
98
+ ## Identity before a member/customer has their own server
63
99
 
64
- A Mode B customer exists as identity **before** they have their own runtime:
100
+ Members and customers exist as identity on the host runtime **before** they have
101
+ their own server, and that identity carries over when they create one:
65
102
 
66
- - When a visitor/customer first appears, Core resolves a **shadow tenant** and a
67
- **shadow person** for their external identity (e.g. email). The shadow person
68
- is a stable participation anchor, owned by the shadow tenant. See
103
+ - Core resolves a **shadow tenant** and **shadow person** for an external identity
104
+ (e.g. email) a stable participation anchor. See
69
105
  `shadow-participation-and-guest-threads/SKILL.md`.
70
- - Joining the host runtime via `/_mw` creates a customer membership on the
71
- **host** tenant. Claim refs tie that membership back to the customer's shadow
72
- identity, so history is preserved across the later spawn.
73
- - The spawn is an **explicit claim/upgrade**, modeled as a real provisioning
74
- step never a silent mutation. The platform **promotes the customer's
75
- existing tenant in place** rather than minting a fresh one, so there is no
76
- duplicate identity and no orphaned history.
77
-
78
- Do not invent a parallel guest-account or per-customer identity model; reuse the
106
+ - **Member-plane**: an invite creates a `Membership` on the host runtime, anchored
107
+ to the member's person; the member works through the shell with full capability.
108
+ - **Customer-plane**: `/_mw` creates a `tenant_customer` membership on the host
109
+ runtime, anchored to the customer's shadow tenant.
110
+ - In both planes, **claim refs tie the host membership back to the person's shadow
111
+ identity**, so identity and history are preserved when they later create their
112
+ own server. Creating a server is an **explicit claim/upgrade**, modeled as a
113
+ real provisioning step — never a silent mutation.
114
+
115
+ Do not invent a parallel guest-account or per-user identity model; reuse the
79
116
  external-identity → shadow tenant → shadow person → claim substrate.
80
117
 
81
- ## The opt-in spawn action + configurable trigger
118
+ ## Opt-in "create my own server" (spawn)
82
119
 
83
- Spawn is **product-driven, not hardcoded**. There are two ways to fire it; both
84
- target the same platform substrate (a `customer_runtime_spawn` onboarding intent
85
- that promotes the customer's tenant in place and installs the Vuilder's
86
- published app pack).
120
+ "Create my own server" is **product-driven, not hardcoded.** ("Spawn" is the
121
+ internal/platform term; the user-facing CTA is "create my own server / runtime.")
122
+ There are two ways to *fire* it; both go through the platform's member/customer
123
+ spawn substrate, which provisions a runtime and installs the Vuilder's published,
124
+ attested pack.
87
125
 
88
- ### 1. Explicit opt-in action (available now)
126
+ ### 1. Explicit "create my own server" action (available now)
89
127
 
90
- Wire a "create my own runtime" affordance in `/app` to the platform's customer
91
- spawn endpoint:
128
+ Wire a "create my own server" affordance to the platform spawn endpoint:
92
129
 
93
- - The authenticated customer (`tenant_customer` session) POSTs to
130
+ - A member fires it from the shell, or a `/_mw` customer POSTs to
94
131
  `/_mw/runtime/spawn` on the live host.
95
- - The platform gates on an **active, email-verified** customer membership,
96
- resolves identity continuity, promotes the customer's tenant, and installs the
97
- Vuilder's **published, attested** app pack. It is idempotent.
132
+ - The platform gates on an **active, email-verified** membership, resolves
133
+ identity continuity, provisions the runtime, and installs the Vuilder's
134
+ **published, attested** app pack. It is idempotent.
98
135
  - The browser only signals intent. It never picks the package, runtime provider,
99
- or tenant — the platform derives those from the host Vuilder + the customer's
100
- verified identity.
101
-
102
- This is the FleetRun-style "customer opts in" trigger *(illustrative)*.
136
+ or tenant — the platform derives those from the host Vuilder + the verified
137
+ identity.
103
138
 
104
139
  ### 2. App-pack-declared condition (configurable trigger)
105
140
 
106
- To make spawn fire when a **product condition** holds rather than on a button
107
- press, declare the condition in the app pack instead of hardcoding it. Use the
108
- local event bus declaration surface (`event-bus/SKILL.md`): emit a
109
- product-defined event when the condition occurs, then declare an
110
- `eventSubscription` (with `filters`) whose target flow requests the spawn. Keep
111
- event types and field names vertical-neutral (they must pass `mw.E002`/`mw.E010`
112
- — no vertical role/identifier words).
113
-
114
- This is the Ostronaut-style "real data starts flowing" trigger *(illustrative)*:
115
- emit a generic "data received" event, filter for the threshold that means the
116
- customer is now operating for real, and let the subscription drive the spawn.
141
+ To fire on a **product condition** instead of a button press, declare the
142
+ condition in the app pack (do not hardcode it). Use the local event bus
143
+ (`event-bus/SKILL.md`): emit a product-defined event, then declare an
144
+ `eventSubscription` (with `filters`) whose target flow requests the server. Keep
145
+ event types and field names vertical-neutral (`mw.E002`/`mw.E010` no vertical
146
+ role/identifier words).
117
147
 
118
148
  > Honesty note: the **declaration surface** (events, subscriptions, filters)
119
- > ships today, and the **explicit opt-in action** above is fully executable. The
120
- > automatic condition→spawn leg is delivered by platform substrate that is still
121
- > being rolled out (a generic emit site, the flow→spawn dispatch, and the
122
- > local-event dispatch flag). Until that lands in the target runtime, fall back
123
- > to the explicit opt-in action and keep the declared condition as the
124
- > product's source of truth. Do not assume auto-fire works without confirming it
125
- > in `runtime-capability-inventory`.
149
+ > ships today, and the **explicit action** above is fully executable. The
150
+ > automatic condition→spawn leg is platform substrate still being rolled out (a
151
+ > generic emit site, the flow→spawn dispatch, and the local-event dispatch flag).
152
+ > Until it lands, use the explicit action and keep the declared condition as the
153
+ > product's source of truth. Confirm in `runtime-capability-inventory` before
154
+ > assuming auto-fire works.
155
+
156
+ ## Mint-new vs promote-in-place — the two spawn semantics
157
+
158
+ "Create my own server" has **two distinct tenant semantics, coupled to the join
159
+ plane.** They are not interchangeable.
160
+
161
+ - **Mint-new (member-plane — the primary path for this model; NOT built yet).** A
162
+ **member** of the Vuilder's host runtime clicks "create my own server" → the
163
+ platform **mints a fresh, separate tenant + runtime** for them and installs the
164
+ Vuilder's published pack. The member becomes the **owner** of their own server.
165
+ Their identity (shadow person / claim) carries over — they do not become a
166
+ different person — and they keep their **membership on the host runtime**
167
+ (multi-membership; see the server-switcher below). This is the "org admin stands
168
+ up their organization's own server" path.
169
+ - **Promote-in-place (customer-plane — built today).** A `/_mw` customer who
170
+ already has a shadow (customer) tenant continues *as themselves* → the platform
171
+ **promotes their existing tenant in place** into a runtime-bearing tenant. This
172
+ is the "product-consumer upgrades to their own runtime" path. It **requires an
173
+ existing customer tenant and does not mint.**
174
+
175
+ **Today only promote-in-place is executable:** `customer_runtime_spawn` requires
176
+ an existing customer tenant and promotes it (it refuses to mint), and
177
+ `customer_vertical_signup` (which does mint a fresh tenant) fires only from the
178
+ **public signup site**, not the member plane. So the **member-plane → mint-new
179
+ shape — the primary "member creates their own server" flow — is the open
180
+ substrate gap to land**, not a secondary "maybe later." A proposed substrate
181
+ change (a `spawn_mode: mint | promote` selector reachable from the member plane)
182
+ is drafted for platform-team review.
183
+
184
+ Until it lands, do not assume a member "create my own server" CTA mints a fresh
185
+ separate tenant. Wire it to the promote-in-place path where that fits, or report
186
+ the member-plane → mint-new need as a capability gap
187
+ (`capability-gap-reporting/SKILL.md`). Confirm what shipped in
188
+ `runtime-capability-inventory` before building against mint-new.
126
189
 
127
190
  ## Cross-runtime data continuity (scope honestly)
128
191
 
129
- After a customer spawns their own runtime, what carries over?
192
+ After a member/customer creates their own server, what carries over?
130
193
 
131
194
  - **Identity and shared references re-anchor via ontology Core URNs.** Promote
132
- local facts to shared `core_urn`s and re-anchor them on the spawned runtime
133
- via the reviewable promotion loop. See `ontology-authoring/SKILL.md` and
134
- `runtime_ontology_contract.md`. This is the supported continuity primitive.
135
- - **The spawn does not zero-copy the customer's host-runtime records into the
136
- new runtime.** Ad-hoc record-level cross-runtime references (pointer + grant,
137
- read at resolve time) are **not executable today**: `runtime_federation`
138
- implements dataset publication + change-signal pub/sub only, and the
139
- `bridge_protocol.md` hydrate path is design/spec, not built. So **a spawned
140
- runtime cannot reference a specific record on the host runtime yet.** See
141
- `federation_model.md` and `bridge_protocol.md`.
142
- - **Therefore scope the product to: spawn starts fresh; shared identity
195
+ local facts to shared `core_urn`s and re-anchor them on the spawned runtime via
196
+ the reviewable promotion loop (`ontology-authoring/SKILL.md`,
197
+ `runtime_ontology_contract.md`). This is the supported continuity primitive.
198
+ - **Creating a server does not zero-copy host-runtime records into the new
199
+ runtime.** Ad-hoc record-level cross-runtime references (pointer + grant, read
200
+ at resolve time) are **not executable today**: `runtime_federation` implements
201
+ dataset publication + change-signal pub/sub only, and the `bridge_protocol.md`
202
+ hydrate path is design/spec, not built. So **a spawned runtime cannot reference
203
+ a specific record on the host runtime yet** (`federation_model.md`,
204
+ `bridge_protocol.md`).
205
+ - **Therefore scope the product to: the new server starts fresh; shared identity
143
206
  re-anchors via ontology URNs; deep history reference is a follow-on once the
144
207
  federation record-reference primitive exists.** Do not promise zero-copy
145
- history in product copy or design. If a Mode B product genuinely needs
146
- record-level cross-runtime reads, report it as a capability gap
147
- (`capability-gap-reporting/SKILL.md`) instead of inventing a copy-based
148
- workaround.
208
+ history. If a Mode B product genuinely needs record-level cross-runtime reads,
209
+ report it as a capability gap rather than inventing a copy-based workaround.
149
210
 
150
211
  ## Server-switcher across host + spawned runtime
151
212
 
152
- After spawn, the customer holds **two memberships**: the customer membership on
153
- the Vuilder's host runtime and the owner membership on their own spawned
154
- runtime. Give them a way to switch between the hosted product and their own
155
- runtime:
213
+ After creating their own server, the person holds **two memberships**: their place
214
+ on the Vuilder's **host runtime** and the owner membership on their **spawned
215
+ runtime**. Give them a way to switch:
156
216
 
157
217
  - Model this as multi-membership switching in the branded shell
158
218
  (`shell-architecture/SKILL.md`) — each membership opens its own
159
219
  `/w/[workspace_slug]` context; the shell never mixes their sessions.
160
- - The host membership stays valid after spawn (it is the continuity ledger), so
161
- the customer can keep using the shared hosted product and their own runtime
162
- side by side.
220
+ - The host membership stays valid (it is the continuity ledger), so they can keep
221
+ using the Vuilder's host runtime and their own server side by side.
163
222
  - Identity stays single across both via the shared shadow/claim anchor; do not
164
223
  create a second identity for the spawned runtime.
165
224
 
@@ -167,18 +226,19 @@ runtime:
167
226
 
168
227
  - `vuilder-workspace-architecture` — the base Vuilder shape and the Mode A
169
228
  signup=auto-spawn flow this skill contrasts with.
170
- - `tenant-app-customer-auth-deploy` — make `/_mw` customer auth resolve on a
171
- live canonical host.
229
+ - `shell-architecture` — the member-plane branded shell, member work surfaces, and
230
+ multi-membership server switching.
231
+ - `tenant-app-customer-auth-deploy` — make `/_mw` customer auth resolve on a live
232
+ canonical host (customer plane).
172
233
  - `shadow-participation-and-guest-threads` — shadow tenant/person + claim
173
- continuity for pre-runtime customers.
234
+ continuity for pre-server members and customers.
174
235
  - `app-pack-authoring` and `generated-workspace-architecture` — `webCustomerExposed`
175
- query/action manifests consumed by `/app` via `mw.query` / `mw.action`.
236
+ query/action manifests consumed by `/app`.
176
237
  - `event-bus` (and `dataset-subscriber-flow`) — declarative event/subscription
177
- surface for the configurable spawn trigger.
178
- - `ontology-authoring` and `runtime_ontology_contract.md` — Core URN promotion
179
- for cross-runtime identity continuity.
180
- - `shell-architecture` branded shell + multi-membership server switching.
181
- - `federation_model.md` and `bridge_protocol.md` what cross-runtime
182
- federation does and does not support today (record-reference is a gap).
183
- - `capability-gap-reporting` — report record-level cross-runtime read needs
184
- rather than working around them.
238
+ surface for the configurable "create server" trigger.
239
+ - `ontology-authoring` and `runtime_ontology_contract.md` — Core URN promotion for
240
+ cross-runtime identity continuity.
241
+ - `federation_model.md` and `bridge_protocol.md` what cross-runtime federation
242
+ does and does not support today (record-reference is a gap).
243
+ - `capability-gap-reporting` report the member-plane mint-new gap and
244
+ record-level cross-runtime read needs rather than working around them.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: vuilder-workspace-architecture
3
- description: "First skill for generated Vuilder workspaces: vuilder-app public site, vuilder-shell branded customer shell, app-pack source, and the Mode A signup=auto-spawn flow. For hosted-demo-then-opt-in-spawn, see vuilder-mode-b-hosted-and-spawn."
3
+ description: "First skill for generated Vuilder workspaces: vuilder-app public site, vuilder-shell branded shell, app-pack source, and the Mode A signup=auto-spawn flow. For the Vuilder's-own-runtime-first opt-in-spawn flow, see vuilder-mode-b-hosted-and-spawn."
4
4
  ---
5
5
 
6
6
  # Vuilder Workspace Architecture
@@ -17,13 +17,16 @@ acquisition flow:
17
17
  - **Mode A (signup = auto-spawn).** Signing up on the public site immediately
18
18
  provisions the customer their own tenant runtime and installs the app pack.
19
19
  This is the default this skill describes (see the Flow section below).
20
- - **Mode B (hosted broker/demo, then opt-in spawn).** The Vuilder runs a shared
21
- hosted product on its own operator runtime; customers join it via `/_mw` and
22
- use it there, then provision their OWN runtime later as an opt-in step (with a
23
- configurable trigger). If customers should try a hosted product before getting
24
- their own server, it is Mode B **read
25
- `vuilder-mode-b-hosted-and-spawn/SKILL.md`** and follow it instead of the Mode
26
- A flow below.
20
+ - **Mode B (the Vuilder's own runtime first, then opt-in "create my own
21
+ server").** The Vuilder runs their own real product on their **host runtime**
22
+ their own tenant business. Outside users join either as **members** (full
23
+ capability threads, agents, AI, records via SSO + `vuilder-shell`) or as
24
+ **`/_mw` product-consumer customers**, work there, and later opt to **create
25
+ their own server** (the platform provisions them a separate runtime and installs
26
+ the Vuilder's pack). The hosted product can be a broker, shared workspace, or
27
+ demo — the shape does not change the lane; the member plane is the
28
+ collaboration-first default. **Read `vuilder-mode-b-hosted-and-spawn/SKILL.md`**
29
+ and follow it instead of the Mode A flow below.
27
30
 
28
31
  ## Default Workspace Shape
29
32
 
@@ -93,6 +96,7 @@ billing policy, or install coordinates.
93
96
  marketplace publish output.
94
97
  - Use `generated-workspace-architecture` for general local workspace trust
95
98
  boundaries.
96
- - Use `vuilder-mode-b-hosted-and-spawn` when the Vuilder runs a hosted
97
- broker/demo customers join first and lets them spawn their own runtime later
98
- (Mode B), instead of the Mode A signup=auto-spawn flow above.
99
+ - Use `vuilder-mode-b-hosted-and-spawn` when the Vuilder runs their own real
100
+ product on their host runtime that outside users join as members (or `/_mw`
101
+ customers), and later lets them create their own server (Mode B), instead of
102
+ the Mode A signup=auto-spawn flow above.
@@ -23,6 +23,12 @@ does not match the current MinuteWork CLI export.
23
23
  - `mcp/claude-desktop.sample.json`
24
24
  - It does not regenerate tenant code, sidecar code, schema files, or arbitrary
25
25
  user-owned files outside the managed export set.
26
+ - It never touches the authored overlays `CLAUDE.workspace.md`,
27
+ `AGENTS.workspace.md`, or `skills.workspace/**`. Those files sit alongside the
28
+ managed guidance but are intentionally outside the managed manifest, so
29
+ workspace-specific customizations survive every sync (including `--force`) with
30
+ no conflicts. Put workspace-specific guidance and authored skills there rather
31
+ than editing the managed `CLAUDE.md` / `AGENTS.md` / `skills/`.
26
32
  - If the workspace uses an older exported skill set, prefer refreshing assets
27
33
  before concluding that a Builder capability or instruction is missing.
28
34
  - If the workspace lacks sandbox/tier guidance for `minutework sandbox create`,
@@ -53,6 +53,38 @@ a {
53
53
  max-width: 760px;
54
54
  }
55
55
 
56
+ .hero-with-media {
57
+ grid-template-columns: minmax(0, 0.95fr) minmax(280px, 0.85fr);
58
+ max-width: none;
59
+ align-items: center;
60
+ }
61
+
62
+ .hero-copy {
63
+ display: grid;
64
+ gap: 24px;
65
+ }
66
+
67
+ .hero-media,
68
+ .section-image,
69
+ .feature-image {
70
+ overflow: hidden;
71
+ border: 1px solid var(--line);
72
+ background: var(--surface);
73
+ }
74
+
75
+ .hero-media {
76
+ aspect-ratio: 4 / 3;
77
+ }
78
+
79
+ .hero-media img,
80
+ .section-image img,
81
+ .feature-image img {
82
+ display: block;
83
+ width: 100%;
84
+ height: 100%;
85
+ object-fit: cover;
86
+ }
87
+
56
88
  .eyebrow {
57
89
  margin: 0;
58
90
  color: var(--accent);
@@ -96,8 +128,71 @@ p {
96
128
  padding: 24px;
97
129
  }
98
130
 
131
+ .content-section,
132
+ .cta-banner {
133
+ display: grid;
134
+ grid-template-columns: minmax(0, 0.9fr) minmax(240px, 0.7fr);
135
+ gap: 32px;
136
+ align-items: center;
137
+ margin-top: 56px;
138
+ padding-top: 56px;
139
+ border-top: 1px solid var(--line);
140
+ }
141
+
142
+ .content-section h2,
143
+ .cta-banner h2 {
144
+ margin: 0;
145
+ font-size: clamp(2rem, 5vw, 4rem);
146
+ line-height: 1;
147
+ }
148
+
149
+ .section-image {
150
+ aspect-ratio: 4 / 3;
151
+ }
152
+
153
+ .feature-grid {
154
+ display: grid;
155
+ grid-template-columns: repeat(auto-fit, minmax(190px, 1fr));
156
+ gap: 16px;
157
+ margin-top: 28px;
158
+ }
159
+
160
+ .feature-item {
161
+ border: 1px solid var(--line);
162
+ background: var(--surface);
163
+ padding: 18px;
164
+ }
165
+
166
+ .feature-item h3 {
167
+ margin: 14px 0 0;
168
+ font-size: 1rem;
169
+ }
170
+
171
+ .feature-item p {
172
+ margin-bottom: 0;
173
+ font-size: 0.95rem;
174
+ }
175
+
176
+ .feature-image {
177
+ aspect-ratio: 16 / 10;
178
+ }
179
+
99
180
  .site-footer {
100
181
  padding: 32px 0;
101
182
  border-top: 1px solid var(--line);
102
183
  color: var(--muted);
103
184
  }
185
+
186
+ @media (max-width: 760px) {
187
+ .site-header {
188
+ align-items: flex-start;
189
+ gap: 16px;
190
+ flex-direction: column;
191
+ }
192
+
193
+ .hero-with-media,
194
+ .content-section,
195
+ .cta-banner {
196
+ grid-template-columns: 1fr;
197
+ }
198
+ }