@nanocollective/roster 0.1.0-alpha.5 → 0.1.0-alpha.50
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 +70 -84
- package/dist/cli.js +4833 -2752
- package/docs/README.md +9 -6
- package/docs/agents.md +24 -20
- package/docs/architecture.md +13 -5
- package/docs/charters/analyst.md +65 -0
- package/docs/charters/cmo.md +69 -0
- package/docs/charters/community.md +63 -0
- package/docs/charters/cto.md +71 -0
- package/docs/charters/designer.md +65 -0
- package/docs/charters/devops.md +65 -0
- package/docs/charters/pm.md +70 -0
- package/docs/charters/qa.md +65 -0
- package/docs/charters/support.md +60 -0
- package/docs/charters/writer.md +63 -0
- package/docs/commands.md +93 -7
- package/docs/concepts.md +61 -14
- package/docs/cost.md +36 -1
- package/docs/developing.md +16 -21
- package/docs/doctor-codes.md +10 -2
- package/docs/export.md +2 -0
- package/docs/extending.md +2 -2
- package/docs/getting-started.md +128 -78
- package/docs/images/brain.jpg +0 -0
- package/docs/images/org.jpg +0 -0
- package/docs/images/prompt.jpg +0 -0
- package/docs/images/setup-org.jpg +0 -0
- package/docs/images/setup-plan.jpg +0 -0
- package/docs/images/staff.jpg +0 -0
- package/docs/manual-steps.md +94 -123
- package/docs/memory.md +21 -3
- package/docs/org-yaml.md +40 -2
- package/docs/portal.md +165 -48
- package/docs/prompts.md +31 -4
- package/docs/security.md +37 -5
- package/docs/session-workflow.md +63 -17
- package/docs/staff-yaml.md +30 -3
- package/docs/troubleshooting.md +8 -8
- package/docs/upgrading.md +9 -3
- package/docs/writing-a-charter.md +28 -0
- package/package.json +18 -20
- package/templates/brain/.github/workflows/%%STAFF%%-daily.yaml +26 -1
- package/templates/brain/.github/workflows/%%STAFF%%-mention.yaml +41 -7
- package/templates/brain/CHARTER.md +3 -3
- package/templates/brain/README.md +1 -0
- package/templates/brain/log/decisions.md +3 -0
- package/templates/brain/staff.yaml +4 -1
- package/templates/brain/strategy/ideas.md +7 -0
- package/templates/briefs/priorities.md +46 -0
- package/templates/ops/.github/workflows/session.yaml +236 -15
- package/templates/ops/agents.mjs +7 -3
- package/templates/ops/compose.mjs +31 -3
- package/templates/ops/inflight.mjs +157 -0
- package/templates/ops/org/operating.md +43 -4
- package/templates/ops/org/voice.md +9 -0
- package/templates/ops/prompts/_inflight.md +14 -0
- package/templates/ops/prompts/_paths.md +2 -1
- package/templates/ops/prompts/daily.md +37 -9
- package/templates/ops/prompts/mention.md +21 -0
- package/templates/ops/run-record.mjs +146 -0
- package/templates/portal/css/base.css +167 -73
- package/templates/portal/css/brain.css +23 -20
- package/templates/portal/css/diff.css +10 -9
- package/templates/portal/css/graph.css +12 -7
- package/templates/portal/css/health.css +13 -11
- package/templates/portal/css/home.css +93 -0
- package/templates/portal/css/inbox.css +45 -25
- package/templates/portal/css/layout.css +90 -46
- package/templates/portal/css/markdown.css +36 -14
- package/templates/portal/css/runs.css +13 -0
- package/templates/portal/css/setup.css +116 -34
- package/templates/portal/index.html +21 -9
- package/templates/portal/js/api.js +44 -4
- package/templates/portal/js/app.js +94 -9
- package/templates/portal/js/dialog.js +83 -0
- package/templates/portal/js/homesort.js +174 -0
- package/templates/portal/js/icons.js +37 -0
- package/templates/portal/js/inflight.js +18 -0
- package/templates/portal/js/md.js +5 -2
- package/templates/portal/js/mdedit.js +84 -0
- package/templates/portal/js/readiness.js +70 -0
- package/templates/portal/js/refresh.js +10 -2
- package/templates/portal/js/state.js +11 -5
- package/templates/portal/js/views/app.js +24 -7
- package/templates/portal/js/views/brain.js +1 -1
- package/templates/portal/js/views/checklist.js +10 -4
- package/templates/portal/js/views/credential.js +84 -0
- package/templates/portal/js/views/graph.js +1 -1
- package/templates/portal/js/views/health.js +17 -4
- package/templates/portal/js/views/hire.js +593 -0
- package/templates/portal/js/views/home.js +546 -0
- package/templates/portal/js/views/inbox.js +226 -70
- package/templates/portal/js/views/org.js +46 -106
- package/templates/portal/js/views/orgedit.js +234 -0
- package/templates/portal/js/views/paste.js +87 -21
- package/templates/portal/js/views/prompt.js +11 -4
- package/templates/portal/js/views/repos.js +20 -15
- package/templates/portal/js/views/runonce.js +94 -0
- package/templates/portal/js/views/runs.js +170 -0
- package/templates/portal/js/views/setup.js +261 -75
- package/templates/portal/js/views/staff.js +170 -243
- package/templates/portal/js/views/todo.js +62 -0
package/docs/manual-steps.md
CHANGED
|
@@ -1,186 +1,157 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: "Manual steps"
|
|
3
|
-
description: "
|
|
3
|
+
description: "What only a person can do, why, and what breaks if it is skipped."
|
|
4
4
|
sidebar_order: 2
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Manual steps
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
What roster cannot do for you, why, and what it looks like when one is skipped. The
|
|
10
|
+
[getting started](getting-started.md) path walks through each of these in order; this page is
|
|
11
|
+
what to read when one of them bites.
|
|
11
12
|
|
|
12
|
-
**
|
|
13
|
-
that
|
|
14
|
-
for items 5 and 6. This page is still the *why*: it is what to read when one of them bites, and
|
|
15
|
-
what to check when the page says something is not done.
|
|
16
|
-
|
|
17
|
-
The portal's **Health** screen checks most of these, per staff member and for the org, with
|
|
18
|
-
every finding carrying the sentence that fixes it. `roster doctor` prints the same from a
|
|
19
|
-
terminal. Look after each step.
|
|
13
|
+
**Health**, or `roster doctor`, checks each one it can, and every finding carries the sentence
|
|
14
|
+
that fixes it.
|
|
20
15
|
|
|
21
16
|
---
|
|
22
17
|
|
|
23
|
-
## 1.
|
|
24
|
-
|
|
25
|
-
**Do:** `<org>/roster-ops` -> Settings -> Actions -> General -> *Access* -> **Accessible from
|
|
26
|
-
repositories in the organisation**. The setup screen links straight to that page.
|
|
18
|
+
## 1. Create the organisation
|
|
27
19
|
|
|
28
|
-
**
|
|
29
|
-
needs admin rights that a token created for a different purpose should not have. roster reads
|
|
30
|
-
it and tells you, but setting it is one click and it is yours.
|
|
20
|
+
**Do:** make it on github.com, if you do not have one.
|
|
31
21
|
|
|
32
|
-
**
|
|
33
|
-
a path, or a missing file, or a bad branch reference. You will check all three. It is none of
|
|
34
|
-
them, it is this.
|
|
35
|
-
|
|
36
|
-
**Check:** Health, or `roster doctor`, reports `roster-ops is callable from the whole org`.
|
|
22
|
+
**Why not automated:** GitHub has no API for creating an organisation.
|
|
37
23
|
|
|
38
24
|
---
|
|
39
25
|
|
|
40
|
-
## 2.
|
|
26
|
+
## 2. Confirm the GitHub App
|
|
41
27
|
|
|
42
|
-
**Do:**
|
|
43
|
-
|
|
44
|
-
|
|
28
|
+
**Do:** press **GitHub App** on a staff card, or run `roster app <handle> --apply`. A tab
|
|
29
|
+
opens; confirm on GitHub. The App's id and private key go straight into the brain repo's
|
|
30
|
+
secrets.
|
|
45
31
|
|
|
46
|
-
**Why not
|
|
47
|
-
|
|
48
|
-
|
|
32
|
+
**Why not automated:** there is no API that creates a GitHub App. The only route is the App
|
|
33
|
+
Manifest flow, where a person confirms on a GitHub page. roster does everything either side of
|
|
34
|
+
that.
|
|
49
35
|
|
|
50
|
-
**If you skip it:** the run fails at the token-minting step
|
|
51
|
-
existing.
|
|
36
|
+
**If you skip it:** the run fails at the token-minting step, saying the App does not exist.
|
|
52
37
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
38
|
+
The private key is handed to `gh` on standard input. It is never written to a file, never on a
|
|
39
|
+
command line, and never in the process table. If the secret write fails after the App is
|
|
40
|
+
created, the key is gone: generate a new one from the App's settings page and set the secret by
|
|
41
|
+
hand. roster says so if it happens.
|
|
57
42
|
|
|
58
43
|
---
|
|
59
44
|
|
|
60
|
-
## 3.
|
|
61
|
-
|
|
62
|
-
**Do:** open the URL the portal shows, or that `roster app` prints. Choose repositories.
|
|
45
|
+
## 3. Confirm the App's install
|
|
63
46
|
|
|
64
|
-
**
|
|
65
|
-
|
|
47
|
+
**Do:** press **Install it** in the portal, or open the link `roster app` prints. The page opens
|
|
48
|
+
with the organisation and the repos this staff member needs already selected: its brain, the
|
|
49
|
+
ops repo (every run checks it out first), each peer's tracker, and the product repos. Check the
|
|
50
|
+
list and confirm. Choosing **All repositories** instead also works.
|
|
66
51
|
|
|
67
|
-
**
|
|
68
|
-
|
|
69
|
-
`roster app` say so.
|
|
52
|
+
**Why not automated:** installing is a grant of access to specific repositories, and GitHub asks
|
|
53
|
+
a person to confirm it. That is correct and should not be worked around.
|
|
70
54
|
|
|
71
|
-
|
|
72
|
-
|
|
55
|
+
The pre-selection uses `suggested_target_id` and `repository_ids[]` on the install page. GitHub's
|
|
56
|
+
own links use them, but they are not in GitHub's documentation. If the ids cannot be read, or
|
|
57
|
+
GitHub stops honouring them, the link is the plain install page and you tick the repos yourself;
|
|
58
|
+
the portal and `roster app` both list which.
|
|
73
59
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
So: **do not verify an installation by reading the API.** The only thing that proves the whole
|
|
80
|
-
chain (App created, installed, granted, secrets right, workflow reachable) is a run that
|
|
81
|
-
finished. `roster doctor` reads a window of recent runs for exactly this reason, and reports a
|
|
82
|
-
workflow that has never run as **unproven** rather than as fine.
|
|
83
|
-
|
|
84
|
-
**Check:** that staff member's Health screen, or `roster doctor <handle>`. Then trigger one run
|
|
85
|
-
and look again.
|
|
60
|
+
**If you under-grant it:** this is the trap that costs the most time, because the API reports an
|
|
61
|
+
App's **declaration** separately from an installation's **grant**. `GET /apps/<slug>` will say
|
|
62
|
+
the App exists and has `contents: write` without saying whether it is installed on the repo you
|
|
63
|
+
care about. So **do not verify an installation by reading the API**. Run it once (item 5).
|
|
86
64
|
|
|
87
65
|
---
|
|
88
66
|
|
|
89
|
-
## 4.
|
|
67
|
+
## 4. Get the agent's credential
|
|
90
68
|
|
|
91
|
-
**Do:**
|
|
92
|
-
|
|
93
|
-
|
|
69
|
+
**Do:** get a credential for your coding agent (`claude setup-token` for Claude Code; the others
|
|
70
|
+
are in [choosing a coding agent](agents.md#1-the-credential-exists-and-you-have-it)) and paste it
|
|
71
|
+
into **Agent credential**, or pipe it to `roster credential --apply`. It is stored once, as an
|
|
72
|
+
organisation secret shared with the brain repos, and each hire adds its repo to it.
|
|
94
73
|
|
|
95
74
|
**Why not automated:** it is your account's credential and roster has no way to obtain one.
|
|
96
75
|
|
|
76
|
+
Where an org secret would not arrive, it goes on each brain repo instead and says why. On GitHub
|
|
77
|
+
Free, org secrets do not reach private repos, and only an org owner can set one. Setting an org
|
|
78
|
+
secret also needs the `admin:org` scope on your `gh` token; if it is missing, the credential goes
|
|
79
|
+
on each repo and the output gives the command that adds the scope.
|
|
80
|
+
|
|
97
81
|
**If you skip it:** the run fails immediately with `the caller passed no agent credential`.
|
|
98
|
-
That check exists so it fails there rather than forty lines later inside the agent, after the
|
|
99
|
-
checkouts have already happened.
|
|
100
82
|
|
|
101
|
-
**Check:** Health, or `roster doctor`, lists the secrets each caller references and whether
|
|
102
|
-
|
|
83
|
+
**Check:** Health, or `roster doctor`, lists the secrets each caller references and whether they
|
|
84
|
+
exist, on the repo or shared from the org.
|
|
103
85
|
|
|
104
86
|
---
|
|
105
87
|
|
|
106
|
-
## 5.
|
|
88
|
+
## 5. Watch the first run
|
|
107
89
|
|
|
108
|
-
**Do:**
|
|
109
|
-
|
|
110
|
-
as an agent standing in the repo; the box beneath it takes the reply, shows you a diff, and
|
|
111
|
-
saves only when you press the button. `roster brief discover` prints the same brief for a
|
|
112
|
-
terminal, and you can always just answer the questions in the file by hand.
|
|
90
|
+
**Do:** **Run once now** on the staff card or on Health, or `roster run <handle> --apply`. It
|
|
91
|
+
starts the daily workflow, follows it, and reports how it ended, with the log.
|
|
113
92
|
|
|
114
|
-
|
|
93
|
+
**Why it is yours:** it is a real run. It does a day's work and costs what one does, so it is a
|
|
94
|
+
button you press rather than something setup does behind your back.
|
|
115
95
|
|
|
116
|
-
**Why
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
**If you skip it:** nothing errors. That is the problem. You get competent-looking output about
|
|
121
|
-
a business that does not exist.
|
|
96
|
+
**Why it matters:** the only thing that proves the whole chain (App created, installed, granted,
|
|
97
|
+
secrets right, ops repo callable) is a run that finished. `roster doctor` reports a workflow
|
|
98
|
+
that has never run as **unproven** rather than fine, and one finished run clears it.
|
|
122
99
|
|
|
123
100
|
---
|
|
124
101
|
|
|
125
|
-
## 6. Write
|
|
102
|
+
## 6. Write `org/business.md` and `org/priorities.md`
|
|
126
103
|
|
|
127
|
-
**Do:** **
|
|
128
|
-
paste
|
|
129
|
-
the
|
|
130
|
-
|
|
131
|
-
[writing a charter](writing-a-charter.md) has the shape if you would rather write it yourself.
|
|
104
|
+
**Do:** on the setup screen, **Copy the prompt** puts a brief on your clipboard with every file
|
|
105
|
+
it refers to inside it; paste the reply back and you get a diff and a save button. `roster brief
|
|
106
|
+
discover` prints the same brief. Then write `org/priorities.md`: a few ranked lines on what
|
|
107
|
+
matters this month.
|
|
132
108
|
|
|
133
|
-
|
|
134
|
-
different from the others.
|
|
109
|
+
Health reports `business.stub` and `priorities.stub` while either is still the stub.
|
|
135
110
|
|
|
136
|
-
**
|
|
137
|
-
|
|
138
|
-
whatever the shared layer implies.
|
|
111
|
+
**Why not automated:** an agent that does not know the business writes work that is plausible
|
|
112
|
+
and generic. That is worse than no work, because it takes longer to notice.
|
|
139
113
|
|
|
140
|
-
|
|
114
|
+
**If you skip it:** nothing errors. That is the problem.
|
|
141
115
|
|
|
142
|
-
|
|
116
|
+
---
|
|
143
117
|
|
|
144
|
-
|
|
145
|
-
upgrade`, which writes into repos on disk and leaves them for you. Review, commit, push.
|
|
118
|
+
## 7. Write each staff member's `CHARTER.md`
|
|
146
119
|
|
|
147
|
-
|
|
148
|
-
|
|
120
|
+
**Do:** **Write the charter** on that staff member's card, the same round trip as item 6. The
|
|
121
|
+
brief carries the org layer, `business.md`, the peers' charters, and where the role matches one,
|
|
122
|
+
a [worked example](writing-a-charter.md#worked-examples) to model the shape on. `roster brief
|
|
123
|
+
charter <handle>` prints the same brief.
|
|
149
124
|
|
|
150
|
-
**Why not automated:**
|
|
151
|
-
|
|
152
|
-
repository**, which is a GitHub restriction and not a configuration mistake. That is also why
|
|
153
|
-
agents can never update their own workflows, and why upgrades are human-run by design.
|
|
125
|
+
**Why not automated:** the charter is what makes a staff member different from the others, and
|
|
126
|
+
a generated one is the generic agent this arrangement exists to avoid.
|
|
154
127
|
|
|
155
|
-
**If you skip it:**
|
|
156
|
-
|
|
128
|
+
**If you skip it:** `charter.stub` says nobody has answered it, and the agent produces whatever
|
|
129
|
+
the shared layer implies.
|
|
157
130
|
|
|
158
131
|
---
|
|
159
132
|
|
|
160
|
-
##
|
|
133
|
+
## 8. Commit what `roster upgrade` wrote
|
|
134
|
+
|
|
135
|
+
**Do:** review, commit and push what `roster upgrade --apply` changed in the brain repos.
|
|
161
136
|
|
|
162
|
-
|
|
137
|
+
**Why not automated:** **App tokens cannot push a change under `.github/workflows/`**, in any
|
|
138
|
+
repository. That is a GitHub restriction, and it is why agents never update their own workflows
|
|
139
|
+
and upgrades are run by a person. Hiring commits its own changes as you, and lists them first.
|
|
163
140
|
|
|
164
|
-
|
|
141
|
+
**If you skip it:** the change exists locally and nowhere else, and `roster upgrade` reports it as
|
|
142
|
+
pending next time.
|
|
165
143
|
|
|
166
|
-
|
|
167
|
-
the setup screen 1 is deep-linked from it, and 5 is on it
|
|
168
|
-
Staff -> Hire someone then 7
|
|
169
|
-
GitHub App, on the new staff card 2, then 3
|
|
170
|
-
Write the charter, on the same card 6
|
|
171
|
-
4 is yours: a secret on the brain repo
|
|
172
|
-
Health until the ids are gone
|
|
173
|
-
```
|
|
144
|
+
---
|
|
174
145
|
|
|
175
|
-
|
|
146
|
+
## What roster does for you
|
|
176
147
|
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
roster hire <handle> --apply # then 7
|
|
180
|
-
roster app <handle> # 2, then 3
|
|
181
|
-
# 4, 5, 6
|
|
182
|
-
roster doctor <handle>
|
|
183
|
-
```
|
|
148
|
+
Each of these is a step of a command, listed in its plan before it happens, and each falls back
|
|
149
|
+
to telling you exactly what to click if GitHub refuses.
|
|
184
150
|
|
|
185
|
-
|
|
186
|
-
|
|
151
|
+
| | |
|
|
152
|
+
|---|---|
|
|
153
|
+
| The ops repo's Actions access | `roster init --apply`, or **Set it for me** on the setup screen. Needs admin on the ops repo. Skipped, every caller fails with "workflow not found". |
|
|
154
|
+
| Committing peer wiring | `roster hire --apply` commits and pushes each peer's `staff.yaml` and `org.yaml` as you. A push that fails is reported and left for you. |
|
|
155
|
+
| Giving each new brain the credential | `roster hire --apply` adds the repo to the org secret. |
|
|
156
|
+
| Choosing repos on the install page | pre-selected, as above. |
|
|
157
|
+
| The review gate on product repos | `roster hire --apply` adds it where there is none. See [security](security.md#the-review-gate). |
|
package/docs/memory.md
CHANGED
|
@@ -16,8 +16,8 @@ memory/INDEX.md one line per fact. Read in full at every boot.
|
|
|
16
16
|
memory/notes/*.md the argument behind a fact. Read only when that fact is in play.
|
|
17
17
|
```
|
|
18
18
|
|
|
19
|
-
That split is the whole design. Boot context here went from about 52,000 words to about
|
|
20
|
-
by making it, and the saving repeats on every run forever.
|
|
19
|
+
That split is the whole design. Boot context here went from about 52,000 words to about 10,000
|
|
20
|
+
today by making it, and the saving repeats on every run forever.
|
|
21
21
|
|
|
22
22
|
## The grammar
|
|
23
23
|
|
|
@@ -48,10 +48,27 @@ rumour.
|
|
|
48
48
|
Rule 5 is the one that gets skipped and the one that matters. Everything else degrades slowly;
|
|
49
49
|
this one degrades the boot cost of every future run.
|
|
50
50
|
|
|
51
|
+
## Budgets
|
|
52
|
+
|
|
53
|
+
Prose is advice, and an index nobody prunes grows past what a run can usefully read. So
|
|
54
|
+
`roster lint` warns past three budgets:
|
|
55
|
+
|
|
56
|
+
| Budget | Default | Rule |
|
|
57
|
+
|---|---|---|
|
|
58
|
+
| One fact's line | 400 characters | `too-long`, naming the fact |
|
|
59
|
+
| `memory/INDEX.md` | 24KB | `index-too-big`, naming the three longest facts |
|
|
60
|
+
| `log/decisions.md` | 24KB | `decisions-too-big`: roll older entries into `log/decisions/<YYYY-MM>.md` |
|
|
61
|
+
|
|
62
|
+
Change them under `memory:` in [org.yaml](org-yaml.md#memory), or per staff member in
|
|
63
|
+
[staff.yaml](staff-yaml.md#memory). The daily prompt tells a staff member to check its sizes at
|
|
64
|
+
hand-off and make pruning that run's job when it is over.
|
|
65
|
+
|
|
51
66
|
## What does not go in memory
|
|
52
67
|
|
|
53
68
|
- **Why something was decided.** That is `log/decisions.md`, and it is not boot context.
|
|
54
69
|
- **How a thing works.** That is a draft or a strategy document.
|
|
70
|
+
- **An idea not yet acted on.** That is one line in `strategy/ideas.md`, and it becomes an issue
|
|
71
|
+
only when it needs a ruling.
|
|
55
72
|
- **What is outstanding.** That is the pinned status issue.
|
|
56
73
|
|
|
57
74
|
Nothing is copied between them. Four places, four jobs, and a fact that appears in two of them
|
|
@@ -64,7 +81,8 @@ opens an issue in that staff member's own repository asking them to fix it, whic
|
|
|
64
81
|
right move: they wrote it, and an issue on their tracker is a thing that wakes them.
|
|
65
82
|
|
|
66
83
|
It catches: a missing `So:`, a duplicate slug, a note nothing links to, a link to a note that
|
|
67
|
-
does not exist, an over-long line, a `[measured]` fact with no `n`,
|
|
84
|
+
does not exist, an over-long line, a `[measured]` fact with no `n`, an "updated:" chain, and an
|
|
85
|
+
index or decision log over its budget.
|
|
68
86
|
|
|
69
87
|
The same checks, for a terminal or for CI:
|
|
70
88
|
|
package/docs/org-yaml.md
CHANGED
|
@@ -34,10 +34,13 @@ agent:
|
|
|
34
34
|
permissions: full
|
|
35
35
|
|
|
36
36
|
defaults:
|
|
37
|
-
model: claude-opus-5
|
|
37
|
+
model: claude-opus-5-5
|
|
38
38
|
timeout_minutes: 90
|
|
39
39
|
mention_timeout_minutes: 90
|
|
40
40
|
|
|
41
|
+
budget: 300
|
|
42
|
+
review_gate: true
|
|
43
|
+
|
|
41
44
|
staff:
|
|
42
45
|
- { handle: cto, dir: technology, name: Chief Technology Officer, schedule: "0 7 * * 1-5" }
|
|
43
46
|
- { handle: cmo, dir: marketing, name: Chief Marketing Officer, schedule: "40 7 * * 1-5" }
|
|
@@ -58,6 +61,8 @@ repos:
|
|
|
58
61
|
| `name` | yes | What the business is called, in prose. Appears in prompts. |
|
|
59
62
|
| `ops_dir` | no | Directory name of the ops repo in the runner checkout. Defaults to `roster-ops`. |
|
|
60
63
|
| `experiment_private` | no | Whether the fact that this org is agent-run is itself private. Read by the guardrails fragment. |
|
|
64
|
+
| `budget` | no | USD over any trailing 30 days, for the whole org. See [below](#budget). |
|
|
65
|
+
| `review_gate` | no | `true` to have GitHub require a reviewed pull request before anything merges into a product repo. Off by default, because private repos need a paid plan for it. See [security](security.md#the-review-gate). |
|
|
61
66
|
|
|
62
67
|
### `human` and `humans`
|
|
63
68
|
|
|
@@ -121,8 +126,23 @@ Fallbacks for staff members who do not set their own.
|
|
|
121
126
|
| `model` | Model id passed to the agent. |
|
|
122
127
|
| `timeout_minutes` | Ceiling on a daily session. `90` if unset. |
|
|
123
128
|
| `mention_timeout_minutes` | Ceiling on a mention run. Falls back to `timeout_minutes`, then `90`. |
|
|
129
|
+
| `max_runs_per_day` | What a new hire's `max_runs_per_day` starts at. `6` when unset. |
|
|
124
130
|
| `allowed_tools` | Claude's own spelling of a permission level, kept because it predates `agent.permissions` and still wins for the agents that take a tool list. Nothing translates it for the others: a list written for one agent is not a permission level for another. Prefer [`agent.permissions`](agents.md#permissions), which every agent understands. |
|
|
125
131
|
|
|
132
|
+
### `memory`
|
|
133
|
+
|
|
134
|
+
Budgets `roster lint` holds every staff member's memory to. All optional; a staff member's own
|
|
135
|
+
[`memory:`](staff-yaml.md#memory) overrides these.
|
|
136
|
+
|
|
137
|
+
```yaml
|
|
138
|
+
memory:
|
|
139
|
+
max_fact_chars: 400 # one fact's line in memory/INDEX.md
|
|
140
|
+
max_index_kb: 24 # the whole index, read in full at every boot
|
|
141
|
+
max_decisions_kb: 24 # log/decisions.md
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
Over budget is a warning naming what to cut, never an error. See [memory](memory.md#budgets).
|
|
145
|
+
|
|
126
146
|
### `staff`
|
|
127
147
|
|
|
128
148
|
The registry. One inline map per staff member. **This is the org's view of them**; the rest
|
|
@@ -134,10 +154,26 @@ lives in their own `staff.yaml`.
|
|
|
134
154
|
| `dir` | no | Directory and repo name. Defaults to the handle. |
|
|
135
155
|
| `name` | no | Role name in prose. |
|
|
136
156
|
| `schedule` | no | Cron. Informational here; the caller workflow is what actually schedules. |
|
|
157
|
+
| `budget` | no | USD over any trailing 30 days, for this staff member alone. |
|
|
137
158
|
|
|
138
159
|
`roster hire` appends to this list. An empty list (`staff: []`) is valid and is what a fresh
|
|
139
160
|
org has.
|
|
140
161
|
|
|
162
|
+
### `budget`
|
|
163
|
+
|
|
164
|
+
A number of dollars, on the org, on a staff entry, or both:
|
|
165
|
+
|
|
166
|
+
```yaml
|
|
167
|
+
budget: 300
|
|
168
|
+
staff:
|
|
169
|
+
- { handle: cto, dir: technology, name: Chief Technology Officer, budget: 200 }
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
Spend over the trailing 30 days is added up from each run's record. Past a budget, `roster
|
|
173
|
+
doctor` warns and the portal's Runs screen marks the total. **Nothing stops a run.** A cap that
|
|
174
|
+
ends a session fails it after the work is done and committed, which is a false red rather than a
|
|
175
|
+
saved penny; `timeout_minutes` is the real bound. See [cost](cost.md#budgets).
|
|
176
|
+
|
|
141
177
|
### `repos`
|
|
142
178
|
|
|
143
179
|
Every repository the org owns, and what it is for.
|
|
@@ -159,7 +195,9 @@ Every repository the org owns, and what it is for.
|
|
|
159
195
|
| `runner-plan.mjs` | `org`, `staff`, and each manifest's `works_in` and `peers` |
|
|
160
196
|
| `agents.mjs` | `agent`, `staff` |
|
|
161
197
|
| `roster hire` | all of it, plus every existing manifest |
|
|
162
|
-
| `roster doctor` | all of it |
|
|
198
|
+
| `roster doctor` | all of it, including `budget` |
|
|
199
|
+
| `roster lint` | `staff`, `memory` |
|
|
200
|
+
| `roster portal` | all of it; the Runs screen reads `budget` |
|
|
163
201
|
|
|
164
202
|
## Editing it
|
|
165
203
|
|