@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.
Files changed (102) hide show
  1. package/README.md +70 -84
  2. package/dist/cli.js +4833 -2752
  3. package/docs/README.md +9 -6
  4. package/docs/agents.md +24 -20
  5. package/docs/architecture.md +13 -5
  6. package/docs/charters/analyst.md +65 -0
  7. package/docs/charters/cmo.md +69 -0
  8. package/docs/charters/community.md +63 -0
  9. package/docs/charters/cto.md +71 -0
  10. package/docs/charters/designer.md +65 -0
  11. package/docs/charters/devops.md +65 -0
  12. package/docs/charters/pm.md +70 -0
  13. package/docs/charters/qa.md +65 -0
  14. package/docs/charters/support.md +60 -0
  15. package/docs/charters/writer.md +63 -0
  16. package/docs/commands.md +93 -7
  17. package/docs/concepts.md +61 -14
  18. package/docs/cost.md +36 -1
  19. package/docs/developing.md +16 -21
  20. package/docs/doctor-codes.md +10 -2
  21. package/docs/export.md +2 -0
  22. package/docs/extending.md +2 -2
  23. package/docs/getting-started.md +128 -78
  24. package/docs/images/brain.jpg +0 -0
  25. package/docs/images/org.jpg +0 -0
  26. package/docs/images/prompt.jpg +0 -0
  27. package/docs/images/setup-org.jpg +0 -0
  28. package/docs/images/setup-plan.jpg +0 -0
  29. package/docs/images/staff.jpg +0 -0
  30. package/docs/manual-steps.md +94 -123
  31. package/docs/memory.md +21 -3
  32. package/docs/org-yaml.md +40 -2
  33. package/docs/portal.md +165 -48
  34. package/docs/prompts.md +31 -4
  35. package/docs/security.md +37 -5
  36. package/docs/session-workflow.md +63 -17
  37. package/docs/staff-yaml.md +30 -3
  38. package/docs/troubleshooting.md +8 -8
  39. package/docs/upgrading.md +9 -3
  40. package/docs/writing-a-charter.md +28 -0
  41. package/package.json +18 -20
  42. package/templates/brain/.github/workflows/%%STAFF%%-daily.yaml +26 -1
  43. package/templates/brain/.github/workflows/%%STAFF%%-mention.yaml +41 -7
  44. package/templates/brain/CHARTER.md +3 -3
  45. package/templates/brain/README.md +1 -0
  46. package/templates/brain/log/decisions.md +3 -0
  47. package/templates/brain/staff.yaml +4 -1
  48. package/templates/brain/strategy/ideas.md +7 -0
  49. package/templates/briefs/priorities.md +46 -0
  50. package/templates/ops/.github/workflows/session.yaml +236 -15
  51. package/templates/ops/agents.mjs +7 -3
  52. package/templates/ops/compose.mjs +31 -3
  53. package/templates/ops/inflight.mjs +157 -0
  54. package/templates/ops/org/operating.md +43 -4
  55. package/templates/ops/org/voice.md +9 -0
  56. package/templates/ops/prompts/_inflight.md +14 -0
  57. package/templates/ops/prompts/_paths.md +2 -1
  58. package/templates/ops/prompts/daily.md +37 -9
  59. package/templates/ops/prompts/mention.md +21 -0
  60. package/templates/ops/run-record.mjs +146 -0
  61. package/templates/portal/css/base.css +167 -73
  62. package/templates/portal/css/brain.css +23 -20
  63. package/templates/portal/css/diff.css +10 -9
  64. package/templates/portal/css/graph.css +12 -7
  65. package/templates/portal/css/health.css +13 -11
  66. package/templates/portal/css/home.css +93 -0
  67. package/templates/portal/css/inbox.css +45 -25
  68. package/templates/portal/css/layout.css +90 -46
  69. package/templates/portal/css/markdown.css +36 -14
  70. package/templates/portal/css/runs.css +13 -0
  71. package/templates/portal/css/setup.css +116 -34
  72. package/templates/portal/index.html +21 -9
  73. package/templates/portal/js/api.js +44 -4
  74. package/templates/portal/js/app.js +94 -9
  75. package/templates/portal/js/dialog.js +83 -0
  76. package/templates/portal/js/homesort.js +174 -0
  77. package/templates/portal/js/icons.js +37 -0
  78. package/templates/portal/js/inflight.js +18 -0
  79. package/templates/portal/js/md.js +5 -2
  80. package/templates/portal/js/mdedit.js +84 -0
  81. package/templates/portal/js/readiness.js +70 -0
  82. package/templates/portal/js/refresh.js +10 -2
  83. package/templates/portal/js/state.js +11 -5
  84. package/templates/portal/js/views/app.js +24 -7
  85. package/templates/portal/js/views/brain.js +1 -1
  86. package/templates/portal/js/views/checklist.js +10 -4
  87. package/templates/portal/js/views/credential.js +84 -0
  88. package/templates/portal/js/views/graph.js +1 -1
  89. package/templates/portal/js/views/health.js +17 -4
  90. package/templates/portal/js/views/hire.js +593 -0
  91. package/templates/portal/js/views/home.js +546 -0
  92. package/templates/portal/js/views/inbox.js +226 -70
  93. package/templates/portal/js/views/org.js +46 -106
  94. package/templates/portal/js/views/orgedit.js +234 -0
  95. package/templates/portal/js/views/paste.js +87 -21
  96. package/templates/portal/js/views/prompt.js +11 -4
  97. package/templates/portal/js/views/repos.js +20 -15
  98. package/templates/portal/js/views/runonce.js +94 -0
  99. package/templates/portal/js/views/runs.js +170 -0
  100. package/templates/portal/js/views/setup.js +261 -75
  101. package/templates/portal/js/views/staff.js +170 -243
  102. package/templates/portal/js/views/todo.js +62 -0
@@ -1,186 +1,157 @@
1
1
  ---
2
2
  title: "Manual steps"
3
- description: "Every human action, why it cannot be automated, and what breaks if you skip it."
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
- Everything a human has to do, why it cannot be automated, and what it looks like when you skip
10
- it. This page exists because every item on it has cost somebody real time.
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
- **The portal walks you through most of this now.** `roster` with no arguments opens a setup screen
13
- that deep-links item 1, runs items 2 and 3 for you as far as GitHub allows, and hands you a prompt
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. Allow the ops repo's workflow to be called
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
- **Why not automated:** it is an organisation permission on a repository, and the API for it
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
- **If you skip it:** every caller fails with **"workflow not found"**. That reads like a typo in
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. Create the GitHub App
26
+ ## 2. Confirm the GitHub App
41
27
 
42
- **Do:** the **GitHub App** button on a staff card in the portal, or `roster app <handle>` in a
43
- terminal. Either opens a browser, GitHub asks you to confirm, and you come back. Credentials go
44
- straight into the repository's secrets.
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 fully automated:** there is no API that creates a GitHub App. The only route is the
47
- App Manifest flow: POST a manifest to a settings page, a human confirms, GitHub returns a
48
- one-time code. roster does everything either side of that confirmation.
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 with a message about the app not
51
- existing.
36
+ **If you skip it:** the run fails at the token-minting step, saying the App does not exist.
52
37
 
53
- **Note:** the private key is handed to `gh` on standard input. It is never written to a file,
54
- never passed on a command line, and never appears in the process table. If the secret write
55
- fails after the App is created, the key is gone: generate a new one from the App's settings
56
- page and set the secret by hand. roster tells you this if it happens.
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. Install the App, and grant it the right repositories
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
- **Why not automated:** installing is a grant of access to specific repositories, and GitHub
65
- requires a human to choose them. This is the correct behaviour and should not be worked around.
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
- **Grant it on every tracker the staff member writes to**, not just their own. The token is
68
- minted organisation-wide, and a peer's board is where a brief lands. Both the portal and
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
- **If you skip it, or under-grant it:** this is the trap that costs the most time, because of
72
- how it fails.
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
- > The API reports an App's **declaration** separately from an installation's **grant**.
75
- > `GET /apps/<slug>` will happily tell you the App exists and has `contents: write`. That says
76
- > nothing about whether it has been installed on the repository you care about. Two of our
77
- > Apps declare permissions they were never granted.
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. Set the agent's credential
67
+ ## 4. Get the agent's credential
90
68
 
91
- **Do:** put the coding agent's credential on each brain repo as a secret. The name follows the
92
- credential: `CLAUDE_CODE_OAUTH_TOKEN`, `CODEX_API_KEY`, and so on. See
93
- [choosing a coding agent](agents.md).
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
- they exist.
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. Write `org/business.md`
88
+ ## 5. Watch the first run
107
89
 
108
- **Do:** the setup screen does both halves of this. **Copy the prompt** puts a brief on your
109
- clipboard with every file it refers to inlined, so a chat window with no filesystem is as useful
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
- Health reports `business.stub` while it is still the questions.
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 not automated:** an agent that does not know the business writes work that is plausible
117
- and generic. That is worse than no work, because it takes longer to notice. This file is
118
- composed into the top of every prompt, every run.
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 each staff member's `CHARTER.md`
102
+ ## 6. Write `org/business.md` and `org/priorities.md`
126
103
 
127
- **Do:** **Write the charter** on that staff member's card, which is the same copy-a-prompt,
128
- paste-the-answer-back round trip as item 5, aimed at `CHARTER.md`. The brief it copies carries
129
- the org layer, `business.md` and **the peers' charters**, because without those the model writes
130
- a second copy of whoever it was shown. `roster brief charter <handle>` prints the same brief, and
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
- **Why not automated:** same reason, one level down. The charter is what makes a staff member
134
- different from the others.
109
+ Health reports `business.stub` and `priorities.stub` while either is still the stub.
135
110
 
136
- **If you skip it:** `charter` reports it as present, because the stub is a file. `charter.stub`
137
- is the finding that says nobody has answered it. The agent has no personality and produces
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
- ## 7. Commit and push what roster wrote into other repos
116
+ ---
143
117
 
144
- **Do:** hiring writes a whole brain repo and pushes it, so this is mostly about `roster
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
- Hiring from the Staff screen still edits the *other* staff members' manifests on disk to wire the
148
- peers both ways, and those are yours to commit.
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:** roster does not commit on your behalf into repositories it did not
151
- create in that command. And **App tokens cannot push a change under `.github/workflows/` in any
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:** the change exists locally and nowhere else. `roster upgrade` will report it
156
- as still pending next time, which is the intended behaviour.
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
- ## Order
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
- For a new organisation:
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
- In the portal it is the screen you are looking at, in this order:
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
- From a terminal:
146
+ ## What roster does for you
176
147
 
177
- ```
178
- roster init --org <org> --apply # 1 applies here
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
- Then trigger one run by hand before trusting the schedule. A workflow that has never run has
186
- proved nothing.
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 6,000
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`, and an "updated:" chain.
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