@rizom/ops 0.2.0-alpha.243 → 0.2.0-alpha.245
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -1
- package/dist/brains-ops.js +290 -142
- package/dist/deploy.js +59 -59
- package/dist/images.d.ts +3 -3
- package/dist/index.d.ts +1 -0
- package/dist/index.js +316 -168
- package/dist/legacy-pilot-migration.d.ts +11 -0
- package/dist/load-registry.d.ts +7 -5
- package/dist/reconcile-dry-run.d.ts +9 -0
- package/dist/schema.d.ts +39 -33
- package/dist/secrets-encrypt.d.ts +2 -0
- package/dist/stage-legacy-crossover.d.ts +20 -0
- package/dist/verify-user.d.ts +1 -1
- package/package.json +3 -2
- package/templates/rover-pilot/.env.schema +7 -0
- package/templates/rover-pilot/.github/workflows/reconcile.yml +5 -5
- package/templates/rover-pilot/README.md +8 -3
- package/templates/rover-pilot/deploy/scripts/decrypt-user-secrets.ts +2 -0
- package/templates/rover-pilot/deploy/scripts/validate-secrets.ts +11 -0
- package/templates/rover-pilot/docs/canonical-crossover-record.md +104 -0
- package/templates/rover-pilot/docs/onboarding-checklist.md +8 -12
- package/templates/rover-pilot/docs/operator-playbook.md +69 -50
- package/templates/rover-pilot/docs/user-onboarding.md +39 -68
- package/templates/rover-pilot/pilot.yaml +2 -3
|
@@ -30,14 +30,42 @@ When `pilot.yaml.brainVersion` changes and you push:
|
|
|
30
30
|
3. deploy runs for handles whose generated config changed
|
|
31
31
|
4. generated file commits happen once in a final aggregation step after the deploy matrix finishes
|
|
32
32
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
33
|
+
Every external site and theme package has its own exact version pin. A cohort or
|
|
34
|
+
pilot brain-version bump never changes those package versions implicitly; update each
|
|
35
|
+
pin deliberately from reviewed package and image evidence.
|
|
36
36
|
|
|
37
37
|
When a push changes only deploy contract files and no generated `users/<handle>/.env` or `users/<handle>/brain.yaml` files, the deploy workflow exits through its explicit no-op path and prints `No affected user configs; skipping deploy.`
|
|
38
38
|
|
|
39
39
|
They are scaffolded from `@rizom/ops`, then versioned in this repo like any other deploy contract.
|
|
40
40
|
|
|
41
|
+
## Canonical contract crossover maintenance window
|
|
42
|
+
|
|
43
|
+
Do not run this procedure without explicit operator approval. The canonical desired state, canonical `@rizom/ops`, and unified runtime image form one contract and must move or roll back together. Complete `docs/canonical-crossover-record.md` as the approval evidence without adding secret values.
|
|
44
|
+
|
|
45
|
+
Before the window, record and review:
|
|
46
|
+
|
|
47
|
+
- the prior pilot commit and exact `@rizom/ops` version;
|
|
48
|
+
- every prior runtime image tag and immutable digest;
|
|
49
|
+
- the reviewed canonical pilot commit;
|
|
50
|
+
- the exact unified `@rizom/brain` and `@rizom/ops` versions;
|
|
51
|
+
- every unified image tag and immutable digest;
|
|
52
|
+
- canary-first rollout order, followed by the remaining cohorts;
|
|
53
|
+
- expected `/health` version, unauthenticated MCP response, site marker, and content repository identity for each posture.
|
|
54
|
+
|
|
55
|
+
Run `bunx brains-ops reconcile-all <canonical-review-copy> --dry-run` against the isolated review copy. The command blocks external content-repository access, leaves the review copy untouched, lists both passes' changed files, and must report second-pass zero drift. Reconciliation owns generated per-user config; only `render` owns the observational `views/users.md` projection.
|
|
56
|
+
|
|
57
|
+
During the approved window:
|
|
58
|
+
|
|
59
|
+
1. Freeze unrelated merges and releases. Wait for active Build, Reconcile, and Deploy runs to finish, then disable all three pilot workflows with `gh workflow disable build.yml`, `gh workflow disable reconcile.yml`, and `gh workflow disable deploy.yml`.
|
|
60
|
+
2. Publish and verify the reviewed unified runtime and matching ops artifacts. Do not update pilot desired state until the exact versions are installable and the expected images can be built.
|
|
61
|
+
3. Apply the reviewed canonical pilot revision while automation remains disabled. Confirm repository names, server/domain identity, content repositories, secret selectors, image names, and tag identity against the review diff.
|
|
62
|
+
4. Enable only Build, run it for the canonical desired-state revision, and record every resulting image digest. Stop if the observed digest set differs from the cutover record.
|
|
63
|
+
5. Enable only Reconcile, run it once, and review its generated per-user config commit. It must not rewrite `views/users.md`, and no generated file may combine canonical config with a retired image version.
|
|
64
|
+
6. Enable Deploy and deploy one handle at a time in the approved order. After each deploy, run `bunx brains-ops verify-user . <handle>`, render observed fleet status, and complete the manual identity, content-sync, and app-managed site checks.
|
|
65
|
+
7. Run Reconcile a second time. Require no reconciler-owned generated diff and no deploy work before re-enabling normal automation and lifting the merge/release freeze. Observed status rendering remains separate from this convergence gate.
|
|
66
|
+
|
|
67
|
+
If any gate fails, disable all three workflows again. Restore the prior pilot desired-state and dependency revision, reconcile with the prior ops version, and redeploy the prior image tag/digest as one rollback pair. Verify the prior `/health` version and identity/content/site checks before re-enabling automation. Never restore only config or only an image.
|
|
68
|
+
|
|
41
69
|
## Stale deploy lock recovery
|
|
42
70
|
|
|
43
71
|
Kamal intentionally leaves its remote deploy lock in place when a deployment is cancelled or interrupted. Confirm that no deployment for the user is still active before releasing the lock, then use the deploy workflow's explicit recovery input:
|
|
@@ -77,7 +105,7 @@ When `@rizom/ops` changes the scaffolded deploy contract:
|
|
|
77
105
|
3. review the resulting changes to `.env.schema`, `deploy/scripts/`, and workflows in git
|
|
78
106
|
4. commit the updated deploy artifacts together
|
|
79
107
|
|
|
80
|
-
##
|
|
108
|
+
## Canonical verification notes
|
|
81
109
|
|
|
82
110
|
Use the verification script after deploy:
|
|
83
111
|
|
|
@@ -85,35 +113,31 @@ Use the verification script after deploy:
|
|
|
85
113
|
bunx brains-ops verify-user . <handle>
|
|
86
114
|
```
|
|
87
115
|
|
|
88
|
-
|
|
116
|
+
For every bundle posture it checks:
|
|
89
117
|
|
|
90
|
-
- `https://<handle>.rizom.ai/health`
|
|
91
|
-
- unauthenticated `POST https://<handle>.rizom.ai/mcp`
|
|
92
|
-
- background jobs
|
|
118
|
+
- `https://<handle>.rizom.ai/health` returns `200`;
|
|
119
|
+
- unauthenticated `POST https://<handle>.rizom.ai/mcp` returns the expected auth failure;
|
|
120
|
+
- background jobs are not repeatedly failing, except for missing optional integrations.
|
|
93
121
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
- Rover core is MCP-only; a bare `GET /` may return `401`, which does not indicate a bad deploy.
|
|
97
|
-
|
|
98
|
-
For `preset: default`, the script also checks:
|
|
99
|
-
|
|
100
|
-
- `https://<handle>.rizom.ai/` loads the browser/site surface
|
|
101
|
-
- `https://<handle>.rizom.ai/cms` loads the CMS/login surface
|
|
122
|
+
A `core`-only instance is MCP-only; a bare `GET /` may return `401` without indicating a bad deploy. When `site` is selected, verification also checks the browser and CMS/login surfaces.
|
|
102
123
|
|
|
103
124
|
Manual checks that remain:
|
|
104
125
|
|
|
105
|
-
- initial site
|
|
106
|
-
- content
|
|
107
|
-
- passkey setup/handoff is completed from the setup email
|
|
126
|
+
- initial app-managed site output is correct for the expected content/theme;
|
|
127
|
+
- content repository identity and runtime sync are healthy;
|
|
128
|
+
- passkey setup/handoff is completed from the setup email.
|
|
108
129
|
|
|
109
|
-
## One-user
|
|
130
|
+
## One-user canonical site canary
|
|
110
131
|
|
|
111
132
|
Run this before adding custom site/theme packages or rolling a larger browser/CMS-first cohort.
|
|
112
133
|
|
|
113
|
-
1. Create or choose a canary cohort with
|
|
134
|
+
1. Create or choose a canary cohort with explicit bundles:
|
|
114
135
|
|
|
115
136
|
```yaml
|
|
116
|
-
|
|
137
|
+
bundles:
|
|
138
|
+
- core
|
|
139
|
+
- site
|
|
140
|
+
- publishing
|
|
117
141
|
```
|
|
118
142
|
|
|
119
143
|
2. Add exactly one canary user to that cohort.
|
|
@@ -131,11 +155,7 @@ Run this before adding custom site/theme packages or rolling a larger browser/CM
|
|
|
131
155
|
7. Ask the user to complete passkey setup from the setup email.
|
|
132
156
|
8. Continue to visual customization only after the canary is healthy.
|
|
133
157
|
|
|
134
|
-
Rollback
|
|
135
|
-
|
|
136
|
-
- move the canary back to a core cohort, or remove `presetOverride: default` from the cohort
|
|
137
|
-
- reconcile generated outputs
|
|
138
|
-
- rebuild/redeploy the affected user
|
|
158
|
+
Rollback must restore the prior desired-state revision and prior runtime image together. Never pair canonical config with the retired image, or retired config with the canonical image.
|
|
139
159
|
|
|
140
160
|
## Hosted site and theme package contract
|
|
141
161
|
|
|
@@ -144,7 +164,7 @@ Start with the public [site mockup migration guide](https://github.com/rizom-ai/
|
|
|
144
164
|
- A site package must default-export a valid `SitePackage` and use documented public APIs such as `@rizom/brain/site`.
|
|
145
165
|
- A theme package must default-export its CSS as a string. Hosted custom themes currently use the `@rizom/*` scope so the fleet image installs them with the site package; `@brains/*` themes are bundled with `@rizom/brain`.
|
|
146
166
|
- Site and custom theme packages must be public npm packages that install without registry credentials.
|
|
147
|
-
- Site and
|
|
167
|
+
- Site, theme, and brain packages publish independently. Hosted configuration requires exact site and external-theme version pins and never derives one package version from another.
|
|
148
168
|
- Keep site structure and theme CSS in separate packages. Do not put private content or secrets in either package.
|
|
149
169
|
|
|
150
170
|
Configure a user in `users/<handle>.yaml`:
|
|
@@ -152,22 +172,20 @@ Configure a user in `users/<handle>.yaml`:
|
|
|
152
172
|
```yaml
|
|
153
173
|
siteOverride:
|
|
154
174
|
package: "@rizom/site-example"
|
|
175
|
+
version: <exact-site-version>
|
|
155
176
|
theme: "@rizom/theme-example"
|
|
156
|
-
themeVersion: <exact-theme-version>
|
|
157
|
-
# version: <exact-site-version> # optional deliberate pin
|
|
177
|
+
themeVersion: <exact-theme-version>
|
|
158
178
|
```
|
|
159
179
|
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
produces an isolated per-instance image; it never changes the fleet's shared
|
|
165
|
-
default image.
|
|
180
|
+
Missing external package versions fail desired-state validation. A site override
|
|
181
|
+
produces an isolated per-instance image; it never changes the fleet's shared default
|
|
182
|
+
image. Bundled `@brains/*` themes omit `themeVersion` because they are not installed as
|
|
183
|
+
separate packages.
|
|
166
184
|
|
|
167
185
|
### Custom-package canary and rollback
|
|
168
186
|
|
|
169
187
|
1. Confirm the exact site/theme versions are public-installable without npm credentials.
|
|
170
|
-
2. Apply the package names to one healthy
|
|
188
|
+
2. Apply the exact package names and versions to one healthy canonical site canary.
|
|
171
189
|
3. Reconcile the canary, push the generated output, and let build/deploy create its site image.
|
|
172
190
|
4. Run `bunx brains-ops verify-user . <handle>`.
|
|
173
191
|
5. Manually verify the site, theme, CMS, content sync, and passkey sign-in before adding more users.
|
|
@@ -246,31 +264,32 @@ Notes:
|
|
|
246
264
|
- The ATProto app password is secret and belongs only in the encrypted per-user secret payload.
|
|
247
265
|
- For smoke deployments, pin only the smoke cohort/user to the released brain version that contains ATProto support.
|
|
248
266
|
|
|
249
|
-
## Discord
|
|
267
|
+
## Discord application credential checklist
|
|
250
268
|
|
|
251
269
|
Use this when enabling Discord for a pilot user.
|
|
252
270
|
|
|
253
271
|
1. Pick the user handle (for example `smoke`).
|
|
254
272
|
2. Open the Discord Developer Portal.
|
|
255
|
-
3. Create a **new application** for that user's
|
|
273
|
+
3. Create a **new application** for that user's brain.
|
|
256
274
|
4. Add a **Bot** to the application.
|
|
257
|
-
5. Copy the bot token.
|
|
258
|
-
6. Put
|
|
275
|
+
5. Copy the bot token, application public key, and application ID.
|
|
276
|
+
6. Put those values in `.env` or `.env.local` while onboarding that user:
|
|
277
|
+
- `DISCORD_BOT_TOKEN=...`
|
|
278
|
+
- `DISCORD_PUBLIC_KEY=...`
|
|
279
|
+
- `DISCORD_APPLICATION_ID=...`
|
|
259
280
|
7. Keep `discord.enabled: true` in `users/<handle>.yaml` unless you explicitly want to disable the primary pilot interface.
|
|
260
|
-
8. Encrypt the current per-user
|
|
281
|
+
8. Encrypt the current per-user credential payload:
|
|
261
282
|
- `bunx brains-ops secrets:encrypt . <handle>`
|
|
262
283
|
9. Reconcile/deploy the user or cohort:
|
|
263
|
-
|
|
264
|
-
- `bunx brains-ops
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
11. In the Discord Developer Portal, generate an install URL and invite the bot to the right server.
|
|
268
|
-
12. Send a test message in Discord and confirm the rover responds.
|
|
284
|
+
- `bunx brains-ops onboard . <handle>`
|
|
285
|
+
- or `bunx brains-ops reconcile-cohort . <cohort>`
|
|
286
|
+
10. In the Discord Developer Portal, generate an install URL and invite the bot to the right server.
|
|
287
|
+
11. Send a test message in Discord and confirm the brain responds.
|
|
269
288
|
|
|
270
289
|
Notes:
|
|
271
290
|
|
|
272
|
-
- Use **one
|
|
273
|
-
- Do not reuse the same Discord
|
|
291
|
+
- Use **one Discord application credential set per user/brain**.
|
|
292
|
+
- Do not reuse the same Discord application across multiple pilot users.
|
|
274
293
|
- Discord is the default pilot interface moving forward.
|
|
275
294
|
- The encrypted `users/<handle>.secrets.yaml.age` file is the durable checked-in deploy input; your local env is only the operator staging source.
|
|
276
295
|
- Direct MCP client access should use OAuth/passkey-capable clients where possible.
|
|
@@ -1,119 +1,90 @@
|
|
|
1
|
-
# Welcome to
|
|
1
|
+
# Welcome to your brain
|
|
2
2
|
|
|
3
3
|
---
|
|
4
4
|
|
|
5
5
|
Most of us have more thinking happening than we can hold onto. Ideas show up in the wrong moment, notes land in five different places, and half of what you've figured out is effectively invisible by the time you need it again.
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
Your brain is a private space where that thinking accumulates — notes, links, fragments, and half-formed ideas — plus an AI that can work with all of it. It can find things you saved months ago, connect topics, or help turn a rough note into a draft. The more useful material you add, the more useful it becomes.
|
|
8
8
|
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
-
## What
|
|
11
|
+
## What it is
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
Your brain is a private knowledge companion. It holds your notes, links, and ideas and helps you think with them, not just store them.
|
|
14
14
|
|
|
15
|
-
Ask
|
|
16
|
-
|
|
17
|
-
---
|
|
15
|
+
Ask a question and it searches what you've saved. Give it a fragment of thinking and it can help develop it.
|
|
18
16
|
|
|
19
17
|
## Getting in
|
|
20
18
|
|
|
21
|
-
We'll send you a personal URL
|
|
22
|
-
|
|
23
|
-
When you open it for the first time, you'll be asked to set a passkey. Do that once and you're in. No passwords to remember.
|
|
19
|
+
We'll send you a personal URL such as `https://<handle>.rizom.ai/`.
|
|
24
20
|
|
|
25
|
-
|
|
21
|
+
The first time you open it, you will be asked to set a passkey. No password is required after that.
|
|
26
22
|
|
|
27
|
-
|
|
28
|
-
- **Dashboard** (`/`) — an overview of your Rover
|
|
29
|
-
- **CMS** (`/cms`) — a browser editor for your content
|
|
23
|
+
Your main interfaces are:
|
|
30
24
|
|
|
31
|
-
|
|
25
|
+
- **Chat** (`/chat`) — talk to your brain;
|
|
26
|
+
- **Dashboard/site** (`/`) — the configured browser surface;
|
|
27
|
+
- **CMS** (`/cms`) — edit durable content in a browser.
|
|
32
28
|
|
|
33
|
-
|
|
29
|
+
Start with Chat.
|
|
34
30
|
|
|
35
31
|
## Your first five minutes
|
|
36
32
|
|
|
37
|
-
1. Open
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
3. Ask Rover about it. See what comes back.
|
|
41
|
-
|
|
42
|
-
That loop — save, ask, get something useful back — is the core of how Rover works.
|
|
43
|
-
|
|
44
|
-
---
|
|
45
|
-
|
|
46
|
-
## The Chat and the CMS: when to use which
|
|
47
|
-
|
|
48
|
-
**Chat** is for thinking out loud, asking questions, saving things quickly, and using Rover as a day-to-day thinking partner.
|
|
33
|
+
1. Open Chat and say: _Help me save my first note._
|
|
34
|
+
2. Save a thought, link, or idea. It does not need to be polished.
|
|
35
|
+
3. Ask about it and inspect what comes back.
|
|
49
36
|
|
|
50
|
-
|
|
37
|
+
That save–ask–use loop is the core workflow.
|
|
51
38
|
|
|
52
|
-
|
|
39
|
+
## Chat or CMS?
|
|
53
40
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
## Other ways to chat with Rover
|
|
41
|
+
**Chat** is for thinking aloud, asking questions, saving things quickly, and day-to-day work.
|
|
57
42
|
|
|
58
|
-
|
|
43
|
+
**CMS** is for deliberate browsing and editing. It becomes more useful as your content grows.
|
|
59
44
|
|
|
60
|
-
|
|
45
|
+
## Other interfaces and peer brains
|
|
61
46
|
|
|
62
|
-
|
|
47
|
+
Chat is primary. Your configured posture may also enable Discord, Slack, MCP clients, or agent-to-agent calls. We will send setup steps for integrations enabled for your instance.
|
|
63
48
|
|
|
64
|
-
|
|
65
|
-
- To call: _Call jane.rizom.ai and ask [your question]._
|
|
66
|
-
You'll need their address — in the format `name.rizom.ai` — which they can share with you directly.
|
|
49
|
+
With permission, you can save another participant's brain as a contact and call it by its shared address:
|
|
67
50
|
|
|
68
|
-
|
|
51
|
+
- _Add jane.rizom.ai to my contacts._
|
|
52
|
+
- _Call jane.rizom.ai and ask [your question]._
|
|
69
53
|
|
|
70
|
-
## Connecting
|
|
54
|
+
## Connecting other tools
|
|
71
55
|
|
|
72
|
-
|
|
56
|
+
MCP is a standard protocol that lets compatible AI clients use your brain's tools and lets configured integrations connect to external services. If MCP is part of your setup, we will send specific instructions alongside your URL.
|
|
73
57
|
|
|
74
|
-
|
|
58
|
+
## Common questions
|
|
75
59
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
---
|
|
60
|
+
**How do I access my data?**
|
|
79
61
|
|
|
80
|
-
|
|
62
|
+
Use the CMS. If your cohort includes GitHub access, the same durable markdown also lives in a private repository.
|
|
81
63
|
|
|
82
|
-
**
|
|
83
|
-
Your primary interface is the CMS (`/cms`), where you can browse and edit everything you've saved. If you're set up with GitHub access, your content also lives in a private repository you can access directly.
|
|
64
|
+
**Does it search the public internet?**
|
|
84
65
|
|
|
85
|
-
|
|
86
|
-
No — and that's intentional. Rover works with what you've put into it, not with whatever the internet currently says. That means its answers are grounded in your actual knowledge base, not in generic search results.
|
|
66
|
+
Not by default. Answers are grounded in your own knowledge unless an explicitly configured integration provides another source.
|
|
87
67
|
|
|
88
68
|
**What does this cost?**
|
|
89
|
-
Nothing during the pilot. We cover hosting costs while you're part of the programme.
|
|
90
69
|
|
|
91
|
-
|
|
70
|
+
Nothing during the pilot; hosting is covered by the programme.
|
|
92
71
|
|
|
93
72
|
## This is a pilot
|
|
94
73
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
You'll hit rough edges. Some things you try won't work. Some things you expect to be there won't be yet. That's normal — and it's actually why you're here.
|
|
74
|
+
The product works, but it is not finished. You will encounter rough edges and missing behavior. If something breaks or falls short, tell us what you tried, what you expected, and what happened.
|
|
98
75
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
Rover has a built-in wishlist. If you ask it to do something it can't do yet, it should tell you clearly and log the request — that goes back to us as a signal for where the product needs to go next.
|
|
102
|
-
|
|
103
|
-
When something breaks or falls short, tell us: what you were trying to do, what you expected, and what happened instead.
|
|
104
|
-
|
|
105
|
-
---
|
|
76
|
+
A built-in wishlist can record unsupported requests as product feedback.
|
|
106
77
|
|
|
107
78
|
## Your access details
|
|
108
79
|
|
|
109
|
-
|
|
80
|
+
We will send details in this shape:
|
|
110
81
|
|
|
111
|
-
```
|
|
82
|
+
```text
|
|
112
83
|
Chat URL: https://<handle>.rizom.ai/chat
|
|
113
84
|
Dashboard URL: https://<handle>.rizom.ai/
|
|
114
85
|
CMS URL: https://<handle>.rizom.ai/cms
|
|
115
|
-
Discord: yes/no — setup steps
|
|
116
|
-
MCP: enabled/not enabled — details
|
|
86
|
+
Discord: yes/no — setup steps if enabled
|
|
87
|
+
MCP: enabled/not enabled — setup details if enabled
|
|
117
88
|
```
|
|
118
89
|
|
|
119
|
-
If anything is unclear, reply with what you
|
|
90
|
+
If anything is unclear, reply with what you see and we will help.
|
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
schemaVersion: 1
|
|
2
1
|
brainVersion: 0.1.1-alpha.14
|
|
3
|
-
model: rover
|
|
4
2
|
githubOrg: <github-org>
|
|
5
3
|
contentRepoPrefix: rover-
|
|
6
4
|
domainSuffix: .rizom.ai
|
|
7
|
-
|
|
5
|
+
bundles:
|
|
6
|
+
- core
|
|
8
7
|
aiApiKey: AI_API_KEY
|
|
9
8
|
gitSyncToken: GIT_SYNC_TOKEN
|
|
10
9
|
contentRepoAdminToken: CONTENT_REPO_ADMIN_TOKEN
|