@nanocollective/roster 0.1.0-alpha.6 → 0.1.0-alpha.7
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 +65 -84
- package/dist/cli.js +4153 -2708
- package/docs/README.md +9 -6
- package/docs/agents.md +24 -20
- package/docs/architecture.md +13 -5
- package/docs/charters/cmo.md +69 -0
- package/docs/charters/cto.md +71 -0
- package/docs/charters/support.md +60 -0
- package/docs/commands.md +81 -5
- package/docs/concepts.md +48 -14
- package/docs/cost.md +36 -1
- package/docs/developing.md +16 -21
- package/docs/doctor-codes.md +8 -2
- package/docs/extending.md +2 -2
- package/docs/getting-started.md +100 -77
- package/docs/manual-steps.md +93 -123
- package/docs/memory.md +21 -3
- package/docs/org-yaml.md +37 -2
- package/docs/portal.md +59 -33
- package/docs/prompts.md +25 -4
- package/docs/security.md +29 -5
- package/docs/session-workflow.md +49 -17
- package/docs/staff-yaml.md +13 -2
- package/docs/troubleshooting.md +8 -8
- package/docs/upgrading.md +6 -0
- package/docs/writing-a-charter.md +15 -0
- package/package.json +1 -1
- package/templates/brain/.github/workflows/%%STAFF%%-daily.yaml +6 -0
- package/templates/brain/.github/workflows/%%STAFF%%-mention.yaml +6 -0
- 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/strategy/ideas.md +7 -0
- package/templates/ops/.github/workflows/session.yaml +108 -14
- package/templates/ops/agents.mjs +7 -3
- package/templates/ops/compose.mjs +16 -3
- package/templates/ops/inflight.mjs +157 -0
- package/templates/ops/org/operating.md +21 -1
- 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 +16 -7
- package/templates/ops/prompts/mention.md +2 -0
- package/templates/ops/run-record.mjs +144 -0
- package/templates/portal/css/runs.css +13 -0
- package/templates/portal/index.html +4 -0
- package/templates/portal/js/api.js +29 -3
- package/templates/portal/js/app.js +4 -1
- package/templates/portal/js/state.js +3 -1
- package/templates/portal/js/views/app.js +23 -5
- package/templates/portal/js/views/credential.js +93 -0
- package/templates/portal/js/views/health.js +15 -3
- package/templates/portal/js/views/org.js +2 -0
- package/templates/portal/js/views/paste.js +29 -0
- package/templates/portal/js/views/runonce.js +88 -0
- package/templates/portal/js/views/runs.js +165 -0
- package/templates/portal/js/views/setup.js +67 -26
- package/templates/portal/js/views/staff.js +47 -10
package/docs/concepts.md
CHANGED
|
@@ -6,24 +6,64 @@ sidebar_order: 3
|
|
|
6
6
|
|
|
7
7
|
# Concepts
|
|
8
8
|
|
|
9
|
+
## The six things you need to know
|
|
10
|
+
|
|
11
|
+
Enough to set up an org and read what it does. Everything after this section is detail you
|
|
12
|
+
can learn when you need it.
|
|
13
|
+
|
|
14
|
+
1. **The org layer.** One private repo, `<org>/roster-ops`, holds what every staff member
|
|
15
|
+
shares: what the business is (`org/business.md`), what matters this month
|
|
16
|
+
(`org/priorities.md`), the house voice and the guardrails. Change it once and every staff
|
|
17
|
+
member has it on their next run. [More](#the-ops-repo).
|
|
18
|
+
2. **A staff member is a repo.** Each one has a private repo, its *brain*: what it knows, what
|
|
19
|
+
it is working on, and what it has decided. There is no database and no server; the portal
|
|
20
|
+
reads the repos. [More](#the-brain).
|
|
21
|
+
3. **The charter.** `CHARTER.md` in the brain says who this staff member is and what it
|
|
22
|
+
decides alone. You write it, with a brief that interviews you; roster never generates one,
|
|
23
|
+
because a generated charter makes a generic agent. [More](#charter-and-manifest).
|
|
24
|
+
4. **Memory.** `memory/INDEX.md` is one line per fact, read at the start of every run. The
|
|
25
|
+
agent writes it and deletes from it; you can read and correct it in the portal. That is how
|
|
26
|
+
a staff member remembers yesterday. [More](memory.md).
|
|
27
|
+
5. **The daily run.** A scheduled GitHub Actions workflow in each brain wakes the staff member,
|
|
28
|
+
hands it a prompt built from the org layer plus its charter and memory, and it does one piece
|
|
29
|
+
of work and writes down what happened. [More](#kinds-of-run).
|
|
30
|
+
6. **Mentions.** Write `@handle` in an issue or comment on a staff member's own tracker and it
|
|
31
|
+
runs to answer that, between daily runs. Nothing on a product repo wakes anybody; you ask
|
|
32
|
+
them on their tracker. [More](#kinds-of-run).
|
|
33
|
+
|
|
34
|
+
Everything below, and the rest of the docs, is detail: identities, peers, surfaces, the
|
|
35
|
+
prompt's layers, upgrading. None of it is needed to get a first run.
|
|
36
|
+
|
|
9
37
|
## The ops repo
|
|
10
38
|
|
|
11
39
|
`<org>/roster-ops` holds two different kinds of thing, and the split matters.
|
|
12
40
|
|
|
13
|
-
**`org/` is yours.** `business.md`, `
|
|
14
|
-
business truth and the shared half of every staff member's
|
|
41
|
+
**`org/` is yours.** `business.md`, `priorities.md`, `voice.md`, `guardrails.md`,
|
|
42
|
+
`operating.md`. This is the business truth and the shared half of every staff member's
|
|
43
|
+
instructions. Edit it freely: the
|
|
15
44
|
[Org screen](portal.md#org) lists every one of these off disk with an Edit button, and saving
|
|
16
45
|
commits and pushes. A change here reaches everybody on their next run, which is the point: a
|
|
17
|
-
|
|
46
|
+
rule every staff member should follow is one edit, not one per repo.
|
|
18
47
|
|
|
19
48
|
**Everything else is machinery** and belongs to the framework: `compose.mjs`, `agents.mjs`,
|
|
20
|
-
`runner-plan.mjs`, `.github/workflows/session.yaml`. Editing these works right up until the
|
|
49
|
+
`runner-plan.mjs`, `inflight.mjs`, `run-record.mjs`, `.github/workflows/session.yaml`. Editing these works right up until the
|
|
21
50
|
framework changes the same file, at which point your change is a conflict at best and silently
|
|
22
51
|
reverted at worst. Fix machinery in the framework, then `roster upgrade`.
|
|
23
52
|
|
|
24
53
|
`roster upgrade` enforces this distinction. It reports an edit to a framework-owned file even
|
|
25
54
|
when nothing has collided yet, because "not broken yet" is the state a lost fix sits in.
|
|
26
55
|
|
|
56
|
+
## Priorities
|
|
57
|
+
|
|
58
|
+
`org/priorities.md` is the one direction every staff member shares: what matters this month,
|
|
59
|
+
ranked, and what is out of scope. It is composed into every daily run, a run picks work that
|
|
60
|
+
serves it, and a PR names the priority it serves. Keep it to three priorities or fewer, and
|
|
61
|
+
rewrite it when the month turns.
|
|
62
|
+
|
|
63
|
+
Without it each staff member picks its own work from its own charter, and they drift. `roster
|
|
64
|
+
init` writes a stub; `roster doctor` warns while it is missing or still the stub. An org that
|
|
65
|
+
predates it just adds the file.
|
|
66
|
+
|
|
27
67
|
## The brain
|
|
28
68
|
|
|
29
69
|
A staff member's repository *is* their memory. There is no database.
|
|
@@ -65,7 +105,7 @@ exports declares `gallery` and `table`; nothing in the portal knows what a CMO i
|
|
|
65
105
|
|
|
66
106
|
```
|
|
67
107
|
org/operating.md + org/guardrails.md + org/voice.md + org/business.md
|
|
68
|
-
+ <staff>/CHARTER.md + prompts/<kind>.md
|
|
108
|
+
+ org/priorities.md + <staff>/CHARTER.md + prompts/<kind>.md
|
|
69
109
|
```
|
|
70
110
|
|
|
71
111
|
Built at run time by `compose.mjs` in the tenant's own repo. See it for yourself on the
|
|
@@ -90,21 +130,15 @@ control.
|
|
|
90
130
|
A `mention` prompt refuses to compose without trigger context, because it is written for the
|
|
91
131
|
comment that woke it. That is correct behaviour, not a bug.
|
|
92
132
|
|
|
93
|
-
|
|
94
|
-
into the brain by a workflow in that repo. It was removed. Two repos, a dispatch, a forwarder
|
|
95
|
-
with its own author gate and a second reaction path bought one thing: asking for a change
|
|
96
|
-
without leaving the diff. It cost more than that was worth, in explaining and in debugging.
|
|
97
|
-
|
|
98
|
-
What replaced it is the reply box. A pull request is on the product repo, and **nothing in a
|
|
99
|
-
product repo wakes anybody**: a staff member's caller workflow is in their own brain repo and
|
|
133
|
+
**Nothing in a product repo wakes anybody.** A pull request is on the product repo, and a staff member's caller workflow is in their own brain repo and
|
|
100
134
|
gates on their `@handle` appearing *there*. So naming somebody in a reply where a comment will
|
|
101
135
|
not reach them offers, under the box, to open the request on their tracker as well. One press
|
|
102
136
|
posts your words on the thread and sends them the pull request, the branch, the hunk you were
|
|
103
137
|
looking at if you started from a file, and an instruction to answer on the pull request rather
|
|
104
138
|
than in the tracker it arrived in.
|
|
105
139
|
|
|
106
|
-
It is two `gh` calls as you, rather than a workflow
|
|
107
|
-
|
|
140
|
+
It is two `gh` calls as you, rather than a workflow in the product repo with its own gate and
|
|
141
|
+
its own credential. See [the portal](portal.md#asking-for-a-change).
|
|
108
142
|
|
|
109
143
|
## Identities
|
|
110
144
|
|
package/docs/cost.md
CHANGED
|
@@ -12,19 +12,54 @@ Three separate bills, and they behave differently.
|
|
|
12
12
|
|
|
13
13
|
The largest by far, and the one that scales with how much work you ask for.
|
|
14
14
|
|
|
15
|
+
On a Claude subscription, through a Claude Code OAuth token, it is a flat subscription rather
|
|
16
|
+
than spend per token, and what grows with a session is how much of its usage you take. That is
|
|
17
|
+
how Pip's staff run.
|
|
18
|
+
|
|
15
19
|
A session's cost is roughly its length. Ours run 11 to 55 minutes of wall clock, and a longer
|
|
16
20
|
session is a bigger bill as well as a slower one. The lever that matters is not the model
|
|
17
21
|
setting, it is how much you ask a staff member to do each morning and how much context it has
|
|
18
22
|
to read to start.
|
|
19
23
|
|
|
20
24
|
That is why the memory system is shaped the way it is. Boot context here went from about 52,000
|
|
21
|
-
words to about
|
|
25
|
+
words to about 10,000 today by moving from a narrative status file to one line per fact. That is a
|
|
22
26
|
direct, repeated saving on every run of every staff member.
|
|
23
27
|
|
|
24
28
|
**Watch for sessions growing into their ceiling.** A run that gets killed at
|
|
25
29
|
`timeout_minutes` has been paid for and produced nothing. Health, and `roster doctor`, report
|
|
26
30
|
the ratio.
|
|
27
31
|
|
|
32
|
+
## What each run cost
|
|
33
|
+
|
|
34
|
+
Every session writes down what it was, after the agent finishes or fails: staff, kind, outcome,
|
|
35
|
+
duration, and turns, cost and tokens where the agent reports them. It goes in the job summary,
|
|
36
|
+
and into an artifact called `roster-run` holding one `run.json`.
|
|
37
|
+
|
|
38
|
+
Which agents report what:
|
|
39
|
+
|
|
40
|
+
| Agent | Turns, cost, tokens |
|
|
41
|
+
|---|---|
|
|
42
|
+
| `claude-code-action` | yes, from the Action's execution file |
|
|
43
|
+
| `claude` | yes, from `--output-format json` |
|
|
44
|
+
| anything else | only if its `run` writes the agent's result JSON to `$AGENT_RESULT_FILE` |
|
|
45
|
+
|
|
46
|
+
What is not reported is recorded as unknown, never as zero. A total built from guesses is worse
|
|
47
|
+
than none, so every total says how many runs it could price. The cost is the agent's own figure:
|
|
48
|
+
on a subscription it is what the tokens would have cost, not what you were billed.
|
|
49
|
+
|
|
50
|
+
The portal's [Runs](portal.md#runs) screen lists them per staff member, with a link to each log
|
|
51
|
+
and a 30-day total.
|
|
52
|
+
|
|
53
|
+
## Budgets
|
|
54
|
+
|
|
55
|
+
An optional [`budget`](org-yaml.md#budget) in `org.yaml`, in dollars over any trailing 30 days,
|
|
56
|
+
for the org or for one staff member. Past it, `roster doctor` warns (`budget`) and the Runs
|
|
57
|
+
screen marks the total.
|
|
58
|
+
|
|
59
|
+
It is a warning and never a cap. Stopping a session mid-run fails it after the work is done and
|
|
60
|
+
committed, which is also why there is no `--max-turns`. Use the warning to go and
|
|
61
|
+
look at which runs cost most and why; the levers are below.
|
|
62
|
+
|
|
28
63
|
## GitHub Actions minutes
|
|
29
64
|
|
|
30
65
|
Real on private repositories, and easy to forget because it is metered per minute of runner
|
package/docs/developing.md
CHANGED
|
@@ -34,10 +34,8 @@ test/ one file per area
|
|
|
34
34
|
module per screen under `js/views/`. `roster portal` serves them from `/assets`, reading each
|
|
35
35
|
file per request. Editing a stylesheet and reloading the page is the whole edit loop.
|
|
36
36
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
the module graph itself, and a bundler would have been a build step in a tool whose selling
|
|
40
|
-
point is that it does not have one.
|
|
37
|
+
No bundler, because the browser resolves the module graph itself, and a bundler would be a
|
|
38
|
+
build step in a tool whose selling point is that it does not have one.
|
|
41
39
|
|
|
42
40
|
```
|
|
43
41
|
templates/portal/
|
|
@@ -64,13 +62,12 @@ registers into at boot.
|
|
|
64
62
|
|
|
65
63
|
## The rule that matters
|
|
66
64
|
|
|
67
|
-
**Never fix a generated file in a tenant.** `compose.mjs`, `agents.mjs`, `runner-plan.mjs
|
|
68
|
-
`session.yaml` live in `templates/ops/`. Fix them there and run `roster upgrade`.
|
|
65
|
+
**Never fix a generated file in a tenant.** `compose.mjs`, `agents.mjs`, `runner-plan.mjs`,
|
|
66
|
+
`inflight.mjs`, `run-record.mjs` and `session.yaml` live in `templates/ops/`. Fix them there and run `roster upgrade`.
|
|
69
67
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
collided, and `roster upgrade --check` fails on it.
|
|
68
|
+
A fix made in the tenant's copy goes unnoticed until the framework next touches that file, and
|
|
69
|
+
then it is a conflict. So `roster upgrade` reports an edit to a framework-owned file whether or
|
|
70
|
+
not anything has collided, and `roster upgrade --check` fails on it.
|
|
74
71
|
|
|
75
72
|
## Template classes
|
|
76
73
|
|
|
@@ -101,21 +98,19 @@ marker, or the leftover line is stranded.
|
|
|
101
98
|
|
|
102
99
|
## How the tests are meant to work
|
|
103
100
|
|
|
104
|
-
Three habits, each of which
|
|
101
|
+
Three habits, each of which guards against a test that passes without testing anything.
|
|
105
102
|
|
|
106
|
-
**Test the harness, not just the code.** The portal
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
real modules under a DOM shim and there is nothing to get wrong.
|
|
103
|
+
**Test the harness, not just the code.** The portal's state is an exported object, so the tests
|
|
104
|
+
import the real modules under a DOM shim and drive the same state the page does. A test that
|
|
105
|
+
sets a property on something the code never reads cannot fail.
|
|
110
106
|
|
|
111
|
-
**Run it against reality.** The
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
107
|
+
**Run it against reality when you can.** The suite builds a temporary tenant by default, so it
|
|
108
|
+
runs for anybody who clones the repo. Set `ROSTER_TEST_WORKSPACE=<dir>` to run the portal and
|
|
109
|
+
doctor tests against a real workspace instead, which is how you catch real data growing a shape
|
|
110
|
+
the code cannot handle: templated filenames, for instance, that a comparison forgot to render.
|
|
115
111
|
|
|
116
112
|
**Mutation-test the invariants.** For anything asserting "this behaviour must not regress",
|
|
117
|
-
break it deliberately and check the test fails.
|
|
118
|
-
way, one mutation each.
|
|
113
|
+
break it deliberately and check the test fails. If it does not, the assertion is decoration.
|
|
119
114
|
|
|
120
115
|
## Adding a command
|
|
121
116
|
|
package/docs/doctor-codes.md
CHANGED
|
@@ -33,7 +33,13 @@ ran at all.
|
|
|
33
33
|
| `agent.config` | **fail.** The agent needs a config file of its own and it is missing, or still has a `FILL IN` in it. Nanocoder is the one preset that does: it is a client rather than a model, so without a provider it starts, finds nothing to call, and exits. |
|
|
34
34
|
| `business` | **fail** if `org/business.md` is missing. Every prompt is composed on top of it. |
|
|
35
35
|
| `business.stub` | `org/business.md` is still the questions it shipped with. Nothing errors; the agents just write competent work about a business that does not exist. |
|
|
36
|
-
| `
|
|
36
|
+
| `priorities` | No `org/priorities.md`. Nothing breaks; each staff member just picks its own direction. See [concepts](concepts.md#priorities). |
|
|
37
|
+
| `priorities.stub` | `org/priorities.md` is still the stub `roster init` wrote. |
|
|
38
|
+
| `actions-access` | **fail** unless the ops repo is callable from the whole organisation. This is the "workflow not found" trap. See [manual steps](manual-steps.md#what-roster-does-for-you). |
|
|
39
|
+
| `workflows` | No workflow in the repo is failing run after run. Reported for the ops repo here, and for each brain repo under its staff member. |
|
|
40
|
+
| `workflows.failing` | **fail.** A workflow that is not one of roster's callers has failed at least its last two runs, with the date it started. Skipped and cancelled runs are stepped over. This is the canary that goes red and stays red, because whatever would have said so broke with it. |
|
|
41
|
+
| `budget` | Trailing 30-day spend against a `budget` in `org.yaml`, for the org here and for a staff member under their name. A warning when it is past, never a failure, and only read when a budget is set. Cost comes from each run's record, so it says how many runs it could price. See [cost](cost.md#budgets). |
|
|
42
|
+
| `review-gate` | One per product repo. **fail** when nothing requires a pull request on its default branch, or a staff App can bypass the rule; a warning when a PR is required with no approving review, or the settings cannot be read. See [security](security.md#the-review-gate). |
|
|
37
43
|
| `upgrade` | The tenant is in sync with the framework. |
|
|
38
44
|
| `upgrade.stale` | Generated files are behind. `roster upgrade --apply`. |
|
|
39
45
|
| `upgrade.owned` | **fail.** A framework-owned file was edited in the tenant. Move the change upstream or the next upgrade reverts it. |
|
|
@@ -55,7 +61,7 @@ ran at all.
|
|
|
55
61
|
| `callers.uses` | **fail.** A caller references no reusable workflow, or one in a different organisation. A private reusable workflow is only callable inside its own org. |
|
|
56
62
|
| `callers.target` | **fail.** A caller points at a workflow file that is not in the ops repo. Fails at run time as "workflow not found". |
|
|
57
63
|
| `surfaces` | A surface declared in `staff.yaml` is not on disk. The portal renders nothing for it. |
|
|
58
|
-
| `secrets` | Every secret the callers reference exists on the brain repo. Derived from the callers themselves, not a fixed list. |
|
|
64
|
+
| `secrets` | Every secret the callers reference exists on the brain repo, or is an organisation secret shared with it. Derived from the callers themselves, not a fixed list. |
|
|
59
65
|
| `labels` | Every label declared in `staff.yaml` exists. An agent applying a label that does not exist gets an API error mid-run. |
|
|
60
66
|
| `peer-labels` | The `from-<handle>` label exists on the *peer's* tracker, which is where this staff member's asks land. |
|
|
61
67
|
| `status-issue` | The declared status issue is actually pinned. If not, the place you look is not the place the agent maintains. |
|
package/docs/extending.md
CHANGED
|
@@ -24,8 +24,8 @@ there too.
|
|
|
24
24
|
| `guardrails.md` | non-negotiables. What nobody may do, regardless of charter. |
|
|
25
25
|
| `operating.md` | the autonomy contract: the boot ritual, the hand-off, decision rights. |
|
|
26
26
|
|
|
27
|
-
This is the seam that pays. A
|
|
28
|
-
|
|
27
|
+
This is the seam that pays. A rule written here is one file, and the next morning everybody
|
|
28
|
+
has it.
|
|
29
29
|
|
|
30
30
|
Keep the split honest. If a rule would be true of every staff member you will ever hire, it
|
|
31
31
|
belongs here. If it is about one role, it belongs in that role's charter.
|
package/docs/getting-started.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: "Getting started"
|
|
3
|
-
description: "
|
|
3
|
+
description: "From nothing to a first staff member's first finished run, in the portal."
|
|
4
4
|
sidebar_order: 1
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -10,113 +10,115 @@ sidebar_order: 1
|
|
|
10
10
|
npx @nanocollective/roster
|
|
11
11
|
```
|
|
12
12
|
|
|
13
|
-
Run that in an empty directory.
|
|
14
|
-
|
|
13
|
+
Run that in an empty directory. The page that opens is the setup screen, and it is the whole of
|
|
14
|
+
setup. Every step below is also a command, listed at the end; they do the same work on the same
|
|
15
|
+
files.
|
|
15
16
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
17
|
+
**How long it takes:** about an hour and a half to two hours to a first staff member's first
|
|
18
|
+
finished run. Most of that is writing: what the business is, and the staff member's charter,
|
|
19
|
+
each a conversation of twenty to thirty minutes with your own AI. The rest is about a dozen
|
|
20
|
+
clicks and waiting for the run. Those two files are what make the staff worth running, so that
|
|
21
|
+
hour is the part not to rush.
|
|
20
22
|
|
|
21
|
-
|
|
22
|
-
reference](commands.md). They do the same work on the same files. This page is the portal
|
|
23
|
-
because that is the shorter road, not because the terminal is second class.
|
|
23
|
+
## Before you start
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
- **`gh`, [signed in](https://cli.github.com)**, as someone who owns the organisation. roster
|
|
26
|
+
does everything through your own `gh` and holds no token of its own.
|
|
27
|
+
- **A GitHub organisation.** GitHub has no API for creating one, so if you need one, make it on
|
|
28
|
+
github.com first. Brains are private repos; on GitHub Free that works, with one difference in
|
|
29
|
+
step 5.
|
|
30
|
+
- **A credential for your [coding agent](agents.md).** For Claude Code, run
|
|
31
|
+
`claude setup-token` and keep the token it prints for step 5.
|
|
26
32
|
|
|
27
|
-
|
|
33
|
+
You only need [the six things in Concepts](concepts.md#the-six-things-you-need-to-know) to follow
|
|
34
|
+
this. Everything else can wait.
|
|
28
35
|
|
|
29
|
-
|
|
30
|
-
that does not run roster yet gets one stood up. One that already does gets *checked out* here
|
|
31
|
-
instead, ops repo and every staff repo side by side, which is the shape the CI runner uses.
|
|
32
|
-
That second case is how somebody joins an org a colleague set up, and offering both is how an
|
|
33
|
-
org ends up with two `roster-ops` repos.
|
|
36
|
+
## 1. Say which organisation, then read the plan
|
|
34
37
|
|
|
35
|
-
The
|
|
36
|
-
agents answer to, and which coding agent runs a session. The agent is the one that is awkward
|
|
37
|
-
to change later, because it decides which credential the repos need.
|
|
38
|
+

|
|
38
39
|
|
|
39
|
-
|
|
40
|
+
Pick the organisation, say what the business is called and which coding agent runs a session.
|
|
41
|
+
If the organisation already runs roster, the page offers to check it out here instead, which is
|
|
42
|
+
how a second person joins.
|
|
40
43
|
|
|
41
44
|

|
|
42
45
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
first, then the apply, and the same `initFiles` behind both the browser and the terminal so
|
|
46
|
-
they cannot disagree about what a new tenant contains.
|
|
46
|
+
**Show me the plan** lists every file and repo it would make; *Create it* is a separate button.
|
|
47
|
+
That is the pattern everywhere in roster: the plan first, then the apply.
|
|
47
48
|
|
|
48
|
-
|
|
49
|
-
|
|
49
|
+
Creating it makes `<org>/roster-ops` and **sets its Actions access** so every repo in the org
|
|
50
|
+
can call its workflow. Without that every run fails with "workflow not found". If GitHub refuses
|
|
51
|
+
(it needs admin on the repo), the page says why and links to the setting to click instead.
|
|
50
52
|
|
|
51
|
-
##
|
|
53
|
+
## 2. Say what the business is
|
|
52
54
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
+
`org/business.md` ships as questions, and it is composed into the top of every prompt. An agent
|
|
56
|
+
that cannot answer them writes plausible work about a business that does not exist.
|
|
55
57
|
|
|
56
|
-
**
|
|
57
|
-
|
|
58
|
-
|
|
58
|
+
**Copy the prompt** puts a brief on your clipboard with every file it refers to inside it. Paste
|
|
59
|
+
it into Claude, ChatGPT or anything else; it interviews you and hands back the file. Paste the
|
|
60
|
+
reply into the box and you get a diff and a save button. See
|
|
61
|
+
[the portal](portal.md#copy-a-prompt-paste-the-answer-back).
|
|
59
62
|
|
|
60
|
-
|
|
61
|
-
|
|
63
|
+
Then `org/priorities.md`: what matters this month, ranked, and what is out of scope. A few
|
|
64
|
+
lines, only you can write it. See [concepts](concepts.md#priorities).
|
|
62
65
|
|
|
63
|
-
##
|
|
66
|
+
## 3. Hire someone
|
|
64
67
|
|
|
65
|
-
|
|
66
|
-
that cannot answer them writes plausible work about a business that does not exist, so this
|
|
67
|
-
comes before hiring anybody.
|
|
68
|
+

|
|
68
69
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
rather than a silent save. See [the portal](portal.md#copy-a-prompt-paste-the-answer-back).
|
|
70
|
+
**Staff → Hire someone.** Only the handle is required. The plan shows the repo it creates, the
|
|
71
|
+
schedule it chose, and the commits it will make **as you** in repos that already exist: each
|
|
72
|
+
peer's `staff.yaml`, and `org.yaml`. Nothing is left uncommitted on disk.
|
|
73
73
|
|
|
74
|
-
|
|
74
|
+
For the first hire there is nobody to copy an App name from, so it asks.
|
|
75
75
|
|
|
76
|
-
|
|
76
|
+
## 4. Create the App, and confirm the install
|
|
77
|
+
|
|
78
|
+
**GitHub App**, on the new card. GitHub has no API that creates an App, so a tab opens and you
|
|
79
|
+
confirm. The App's id and private key go straight into the repo's secrets and never touch disk.
|
|
77
80
|
|
|
78
|
-
**
|
|
79
|
-
|
|
80
|
-
|
|
81
|
+
Then **Install it**. The install page opens with the organisation and every repo this staff
|
|
82
|
+
member needs already ticked: its brain, the trackers of its peers, and the product repos. Check
|
|
83
|
+
the list and confirm. That confirmation is yours by design: installing grants access, and GitHub
|
|
84
|
+
asks a person.
|
|
81
85
|
|
|
82
|
-
|
|
83
|
-
asked for rather than guessed at. Later hires infer both.
|
|
86
|
+
## 5. Store the agent credential, once
|
|
84
87
|
|
|
85
|
-
|
|
88
|
+
**Agent credential**, on the card or on the setup screen. Paste the token from `claude
|
|
89
|
+
setup-token` (or your agent's key; the box says where to get one). It is stored as one
|
|
90
|
+
organisation secret, shared with the brain repos, and each later hire is added to it. It is not
|
|
91
|
+
asked for again.
|
|
86
92
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
one-time code. The private key is held in memory and written straight to a repository secret
|
|
90
|
-
without ever touching disk.
|
|
93
|
+
On GitHub Free an org secret does not reach private repos, so there it goes on each brain repo
|
|
94
|
+
instead, and the page says so. It is still one paste now; a later hire needs it once more.
|
|
91
95
|
|
|
92
|
-
|
|
93
|
-
and GitHub asks a human to choose them, which is correct. Grant it every tracker the staff
|
|
94
|
-
member writes to, not only their own. This is the step that most often looks done and is not.
|
|
96
|
+
## 6. Write the charter
|
|
95
97
|
|
|
96
|
-
|
|
97
|
-
`CHARTER.md
|
|
98
|
-
|
|
99
|
-
|
|
98
|
+
**Write the charter**, on the card. The same copy-a-prompt loop as step 2, aimed at
|
|
99
|
+
`CHARTER.md`, carrying the org layer, the peers' charters and, where the role matches one, a
|
|
100
|
+
[worked example](writing-a-charter.md#worked-examples) to model the shape on. The brief
|
|
101
|
+
interviews you; the charter is yours. roster never generates one, because a generated charter
|
|
102
|
+
makes exactly the generic agent this whole arrangement exists to avoid.
|
|
100
103
|
|
|
101
|
-
## 7.
|
|
104
|
+
## 7. Run it once
|
|
102
105
|
|
|
103
|
-
**
|
|
104
|
-
|
|
105
|
-
gone.
|
|
106
|
+
**Run once now**, on the card or on **Health**. It starts the daily workflow, follows it, and
|
|
107
|
+
tells you how it ended, with the log.
|
|
106
108
|
|
|
107
|
-
|
|
109
|
+
**A workflow that has never run has proved nothing**: not that the App is installed on the right
|
|
110
|
+
repos, not that the secrets are right. Doctor reports it as `unproven` until one run has
|
|
111
|
+
finished, and this is that run. If it fails, the result names the step, and
|
|
112
|
+
[troubleshooting](troubleshooting.md) has what each failure usually means.
|
|
108
113
|
|
|
109
|
-
|
|
110
|
-
the grant took, not that the secrets are right. `doctor` says `unproven` rather than `fine` for
|
|
111
|
-
exactly this reason.
|
|
114
|
+
Health is `roster doctor` on the page. Every finding carries the sentence that fixes it.
|
|
112
115
|
|
|
113
116
|
## 8. Now look at what you built
|
|
114
117
|
|
|
115
118
|

|
|
116
119
|
|
|
117
|
-
**Brain** is that staff member's memory and files together
|
|
118
|
-
|
|
119
|
-
every layer it was made of and which repo each came from.
|
|
120
|
+
**Brain** is that staff member's memory and files together. **Prompt** is the text they are
|
|
121
|
+
actually sent, with every layer it was made of and which repo each came from.
|
|
120
122
|
|
|
121
123
|

|
|
122
124
|
|
|
@@ -126,14 +128,35 @@ that*. The answer is always in one of those files.
|
|
|
126
128
|

|
|
127
129
|
|
|
128
130
|
**Org** is the layer everybody inherits. Change `org/voice.md` once and it reaches every staff
|
|
129
|
-
member on their next run
|
|
131
|
+
member on their next run.
|
|
132
|
+
|
|
133
|
+
## From a terminal
|
|
134
|
+
|
|
135
|
+
The same road, command by command. Each prints its plan and changes nothing without `--apply`.
|
|
136
|
+
|
|
137
|
+
```bash
|
|
138
|
+
roster init --org acme --apply # the ops repo, and its Actions access
|
|
139
|
+
roster brief discover # a brief for org/business.md; write priorities.md too
|
|
140
|
+
roster hire cto --apply # the brain, the wiring, the commits as you
|
|
141
|
+
roster app cto --apply # the App, its secrets, and a pre-ticked install link
|
|
142
|
+
roster credential --apply # the agent credential, once for the org
|
|
143
|
+
roster brief charter cto # the charter brief, with the CTO example
|
|
144
|
+
roster run cto --apply # one run, followed to the end
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
## What is still yours to do
|
|
148
|
+
|
|
149
|
+
Five things, each because GitHub or the job itself needs a person: creating the organisation,
|
|
150
|
+
confirming the App, confirming its install, getting the agent credential, and writing
|
|
151
|
+
`business.md`, `priorities.md` and each charter. [Manual steps](manual-steps.md) has why for
|
|
152
|
+
each.
|
|
130
153
|
|
|
131
154
|
## Where things go from here
|
|
132
155
|
|
|
133
|
-
- **A second staff member**: Staff → Hire someone, then
|
|
156
|
+
- **A second staff member**: Staff → Hire someone, then GitHub App, the charter and one run. The
|
|
157
|
+
credential is already there.
|
|
134
158
|
- **Answering your agents**: [the Inbox](portal.md#inbox) is everything open across the org, and
|
|
135
|
-
the reply goes out as you. Work they finished sits in [Pending work](portal.md#pending-work)
|
|
136
|
-
asking for a change to it is [one button](portal.md#asking-for-a-change).
|
|
159
|
+
the reply goes out as you. Work they finished sits in [Pending work](portal.md#pending-work).
|
|
137
160
|
- **A framework update**: `roster upgrade`, or the same from the portal. See
|
|
138
161
|
[upgrading](upgrading.md).
|
|
139
162
|
- **The whole portal**, screen by screen: [the portal](portal.md).
|