@nanocollective/roster 0.1.0-alpha.5 → 0.1.0-alpha.51

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 (103) hide show
  1. package/README.md +70 -84
  2. package/dist/cli.js +5161 -3012
  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 +177 -58
  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 +59 -13
  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/amend.md +4 -3
  50. package/templates/briefs/priorities.md +46 -0
  51. package/templates/ops/.github/workflows/session.yaml +236 -15
  52. package/templates/ops/agents.mjs +7 -3
  53. package/templates/ops/compose.mjs +31 -3
  54. package/templates/ops/inflight.mjs +157 -0
  55. package/templates/ops/org/operating.md +43 -4
  56. package/templates/ops/org/voice.md +9 -0
  57. package/templates/ops/prompts/_inflight.md +14 -0
  58. package/templates/ops/prompts/_paths.md +2 -1
  59. package/templates/ops/prompts/daily.md +37 -9
  60. package/templates/ops/prompts/mention.md +21 -0
  61. package/templates/ops/run-record.mjs +146 -0
  62. package/templates/portal/css/base.css +167 -73
  63. package/templates/portal/css/brain.css +23 -20
  64. package/templates/portal/css/diff.css +10 -9
  65. package/templates/portal/css/graph.css +12 -7
  66. package/templates/portal/css/health.css +26 -11
  67. package/templates/portal/css/home.css +95 -0
  68. package/templates/portal/css/inbox.css +45 -25
  69. package/templates/portal/css/layout.css +90 -46
  70. package/templates/portal/css/markdown.css +36 -14
  71. package/templates/portal/css/runs.css +13 -0
  72. package/templates/portal/css/setup.css +117 -34
  73. package/templates/portal/index.html +21 -9
  74. package/templates/portal/js/api.js +44 -4
  75. package/templates/portal/js/app.js +94 -9
  76. package/templates/portal/js/dialog.js +83 -0
  77. package/templates/portal/js/homesort.js +174 -0
  78. package/templates/portal/js/icons.js +37 -0
  79. package/templates/portal/js/inflight.js +18 -0
  80. package/templates/portal/js/md.js +5 -2
  81. package/templates/portal/js/mdedit.js +84 -0
  82. package/templates/portal/js/readiness.js +70 -0
  83. package/templates/portal/js/refresh.js +10 -2
  84. package/templates/portal/js/state.js +11 -5
  85. package/templates/portal/js/views/app.js +24 -7
  86. package/templates/portal/js/views/brain.js +1 -1
  87. package/templates/portal/js/views/checklist.js +10 -4
  88. package/templates/portal/js/views/credential.js +84 -0
  89. package/templates/portal/js/views/graph.js +1 -1
  90. package/templates/portal/js/views/health.js +27 -9
  91. package/templates/portal/js/views/hire.js +593 -0
  92. package/templates/portal/js/views/home.js +546 -0
  93. package/templates/portal/js/views/inbox.js +226 -70
  94. package/templates/portal/js/views/org.js +46 -106
  95. package/templates/portal/js/views/orgedit.js +234 -0
  96. package/templates/portal/js/views/paste.js +137 -63
  97. package/templates/portal/js/views/prompt.js +100 -42
  98. package/templates/portal/js/views/repos.js +20 -15
  99. package/templates/portal/js/views/runonce.js +94 -0
  100. package/templates/portal/js/views/runs.js +170 -0
  101. package/templates/portal/js/views/setup.js +261 -75
  102. package/templates/portal/js/views/staff.js +170 -243
  103. package/templates/portal/js/views/todo.js +62 -0
@@ -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
- It was one 2,100-line HTML file until the CSS and the seven screens grew past the point where
38
- any of them could be found in it. Splitting it needed no bundler, because the browser resolves
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` and
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
- This has gone wrong once already. A fix went into `roster-ops/.github/workflows/session.yaml`
71
- instead of the template and nothing noticed, because the framework had not touched that file
72
- yet. `roster upgrade` now reports an edit to a framework-owned file whether or not anything has
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 came from a test that was passing vacuously.
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 tests set a property on a dead object for
107
- several rounds, because the state they were driving was a top-level `let` in a classic script
108
- and not reachable as a global. The state is now an exported object, so the tests import the
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 portal and doctor tests build from the live workspace rather
112
- than a fixture, so they break when real data grows a shape the code cannot handle. That is how
113
- the brain-comparison bug was found: every live workflow reported as absent, because filenames
114
- are templated and the comparison did not render them.
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. The workflow-template tests were verified this
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
 
@@ -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
- | `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#1-allow-the-ops-repos-workflow-to-be-called). |
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` | Off unless `review_gate: true` is in `org.yaml`, and then a note that it is off. When on, 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, when the repo is private on GitHub Free (which can't enforce the rule), or when 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,8 +61,10 @@ 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. |
66
+ | `owned-labels` | Roster's own labels exist on the tracker: `decision`, `review`, `chore` and `keep-open`. Checked whatever `staff.yaml` declares, since the prompts apply them. The fix is the `gh label create` lines. |
67
+ | `ask-kind` | An open issue assigned to a human has no ask kind, or more than one. Home sorts what needs you by kind, so an ask without one lands nowhere. |
60
68
  | `peer-labels` | The `from-<handle>` label exists on the *peer's* tracker, which is where this staff member's asks land. |
61
69
  | `status-issue` | The declared status issue is actually pinned. If not, the place you look is not the place the agent maintains. |
62
70
  | `runs` | A window of recent runs. See below. |
package/docs/export.md CHANGED
@@ -35,6 +35,7 @@ that reads it gets the same view without reimplementing the memory grammar.
35
35
  | `statusIssue` | pinned issue number |
36
36
  | `schedule` | cron |
37
37
  | `mention` | what wakes them |
38
+ | `icon` | the icon set by `icon:` in staff.yaml, if any |
38
39
  | `bots[]` | every App login, `[bot]` suffix stripped |
39
40
  | `soloBots[]` | identities unique to this staff member |
40
41
  | `sharedBots[]` | identities shared with others |
@@ -99,6 +100,7 @@ Only surfaces that exist on disk appear. A declared surface that is missing show
99
100
  |---|---|
100
101
  | `workflows[]` | filenames under `.github/workflows/` |
101
102
  | `hasCharter`, `hasManifest` | |
103
+ | `charterStub` | `CHARTER.md` is absent or still the scaffold, the same test as doctor's `charter.stub` |
102
104
  | `missingSurfaces[]` | declared, not on disk |
103
105
  | `memoryBytes` | size of `INDEX.md` |
104
106
  | `notesBytes` | total size of `memory/notes/` |
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 concision rule here used to mean editing twelve files across two
28
- repositories; now it is one file, and the next morning everybody has it.
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.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: "Getting started"
3
- description: "Stand up an org and a first staff member, from the portal."
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,138 @@ sidebar_order: 1
10
10
  npx @nanocollective/roster
11
11
  ```
12
12
 
13
- Run that in an empty directory. There is nothing else to install and nothing to configure
14
- first: the page that opens is the setup screen, and it is the whole of setup.
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
- You need two things before you start. `gh` [authenticated](https://cli.github.com), and a
17
- credential for whichever [coding agent](agents.md) you want to run. A GitHub organisation too,
18
- if you do not already have one: GitHub has no API for creating one, so that part happens on
19
- github.com.
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
- Everything below is also a command, and the commands are in [the CLI
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
- ## 1. Say which organisation
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
- ![The setup screen, asking which organisation and who runs it](images/setup-org.jpg)
33
+ You only need [the three things in Concepts](concepts.md#the-three-things-you-need-to-know) to follow
34
+ this. Everything else can wait.
28
35
 
29
- **It works out which of two things this is, and you do not have to know.** An organisation
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 rest of the card is three answers: what the business is called, which GitHub login 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
+ ![The setup screen, asking which organisation and who runs it](images/setup-org.jpg)
38
39
 
39
- ## 2. Read the plan before anything exists
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
  ![The plan: sixteen files and one private repo, listed before anything is written](images/setup-plan.jpg)
42
45
 
43
- Nothing has been created yet. **Show me the plan** lists every file and every repo it would
44
- make, and *Create it* is a separate button. This is the pattern everywhere in roster: the plan
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
- After it applies you have `acme/roster-ops`: the org layer, the runner machinery, and a
49
- recorded merge base so later [upgrades](upgrading.md) are merges rather than copies.
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
- ## 3. The Actions setting
53
+ The rest of the steps stay on the same page. Reload it and the portal opens on **Getting
54
+ started**, which keeps them in the sidebar until they are done, with hiring first. The sidebar
55
+ counts them: three for the org, five for each staff member.
52
56
 
53
- The page asks for this next and deep-links to the exact settings page, because it is the one
54
- step whose failure is unrecognisable.
57
+ ## 2. Say what the business is
55
58
 
56
- **Settings → Actions → General on `roster-ops`, set access to "accessible from repositories in
57
- the organisation".** Skip it and every workflow later fails with "workflow not found", which
58
- reads like a typo and is not one.
59
+ `org/business.md` ships as questions, and it is composed into the top of every prompt. An agent
60
+ that cannot answer them writes plausible work about a business that does not exist.
59
61
 
60
- It is on [manual steps](manual-steps.md) with the others roster cannot do for you, and
61
- [Health](#7-health-then-one-run-by-hand) keeps asking until it is done.
62
+ **Copy the prompt** puts a brief on your clipboard with every file it refers to inside it. Paste
63
+ it into Claude, ChatGPT or anything else; it interviews you and hands back the file. Paste the
64
+ reply into the box and you get a diff and a save button. See
65
+ [the portal](portal.md#copy-a-prompt-paste-the-answer-back).
62
66
 
63
- ## 4. Say what the business is
67
+ Then `org/priorities.md`: what matters this month, ranked, and what is out of scope. A few
68
+ lines, only you can write it, so it opens in place on the setup screen and saves the same way.
69
+ See [concepts](concepts.md#priorities).
64
70
 
65
- `org/business.md` ships as questions, and it is composed into the top of every prompt. An agent
66
- that cannot answer them writes plausible work about a business that does not exist, so this
67
- comes before hiring anybody.
71
+ ## 3. Hire someone
72
+
73
+ ![The Staff screen, with a card per staff member and Hire someone underneath](images/staff.jpg)
68
74
 
69
- roster holds no model credential and cannot write it for you. What the portal does instead is
70
- both halves of the round trip: **Copy the prompt** puts a self-contained brief on your
71
- clipboard, and **paste the answer back** turns the reply into a file, with a diff and a button
72
- rather than a silent save. See [the portal](portal.md#copy-a-prompt-paste-the-answer-back).
75
+ **Staff**, then pick a role: CTO, CMO, Support, or **Something else** with a name and a sentence
76
+ about what they do. With nobody hired yet the Staff screen opens on the picker. The role fills
77
+ in the handle, name and repo; they are under **Advanced** if you want to change them.
73
78
 
74
- ## 5. Hire someone
79
+ The role opens a numbered list: hire, create their GitHub App, write their charter, add your
80
+ agent credential, run once now. The steps after the hire say *Hire first* until it is done.
75
81
 
76
- ![The Staff screen, with a card per staff member and Hire someone underneath](images/staff.jpg)
82
+ Step 1 says in one sentence what the hire creates and when they run. **Show details** has the
83
+ full plan: the repo, the schedule and why, and the commits it will make **as you** in repos that
84
+ already exist: each peer's `staff.yaml`, and `org.yaml`. Nothing is left uncommitted on disk.
85
+
86
+ For the first hire there is nobody to copy an App name from, so **Advanced** also has two:
87
+ this staff member's App, and the shared public App, filled in as `<org>-<handle>` and
88
+ `<org>-robot`. Names are unique across GitHub, so keep the org prefix. The public one only
89
+ matters if a product repo is public.
90
+
91
+ Product repos come from `org.yaml`. Mark one on the setup screen, or later with **Org → Add a
92
+ product repo**.
93
+
94
+ After **Hire** the list stays on the same staff member, now on step 2. Leave and come back later
95
+ with **Finish setting up** on their card.
77
96
 
78
- **Staff → Hire someone.** Only the handle is required; everything else is copied from whoever
79
- is already here. You get the plan first: every file, every label, the schedule it chose and
80
- why, the peer wiring in both directions, and the steps it cannot do for you.
97
+ ## 4. Create the App, and confirm the install
81
98
 
82
- For the first hire in a new org there is nobody to copy an identity from, so the App names are
83
- asked for rather than guessed at. Later hires infer both.
99
+ **Create the App**, in step 2. GitHub has no API that creates an App, so a tab opens and you
100
+ confirm. The App's id and private key go straight into the repo's secrets and never touch disk.
101
+ The public App is offered too when a product repo is public.
84
102
 
85
- ## 6. Give them an identity, and install it
103
+ Then **Install it**. The install page opens with the organisation and every repo this staff
104
+ member needs already ticked: its brain, the trackers of its peers, and the product repos. Check
105
+ the list and confirm. That confirmation is yours by design: installing grants access, and GitHub
106
+ asks a person.
86
107
 
87
- **GitHub App**, on the same card. There is no API that creates a GitHub App, so this runs the
88
- manifest flow: a manifest is posted to a settings page, you confirm, and GitHub hands back a
89
- one-time code. The private key is held in memory and written straight to a repository secret
90
- without ever touching disk.
108
+ ## 5. Write the charter
91
109
 
92
- **What it cannot do is install the App.** That is a grant of access to specific repositories
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.
110
+ Step 3. **Let an AI interview you** is the same copy-a-prompt loop as step 2 of this guide, aimed
111
+ at `CHARTER.md`, carrying the org layer, the peers' charters and, where the role matches one, a
112
+ [worked example](writing-a-charter.md#worked-examples) to model the shape on. **Start from the
113
+ template** opens that example in an editor with your business's name in it; edit it so it fits
114
+ before saving. **Edit the file** is the file as it is. roster never generates a charter, because
115
+ a generated one makes exactly the generic agent this whole arrangement exists to avoid.
95
116
 
96
- Then **Write the charter**, which is the same copy-a-prompt loop as `business.md`, aimed at
97
- `CHARTER.md`. `hire` deliberately does not generate one: a generated charter produces exactly
98
- the generic agent this whole arrangement exists to avoid. It is the file that decides
99
- everything else, so it is worth the time. [Writing a charter](writing-a-charter.md).
117
+ ## 6. Store the agent credential, once
100
118
 
101
- ## 7. Health, then one run by hand
119
+ Step 4, shown only while no credential is stored. It is also on the card and on the setup
120
+ screen. Paste the token from `claude setup-token` (or your agent's key; the box says where to
121
+ get one). It is stored as one organisation secret, shared with the brain repos, and each later
122
+ hire is added to it. It is not asked for again.
102
123
 
103
- **Health** is `roster doctor` on the page, every finding carrying the sentence that fixes it,
104
- split into what an agent can do and what only a person can. Work through it until the ids are
105
- gone.
124
+ On GitHub Free an org secret does not reach private repos, so there it goes on each brain repo
125
+ instead, and the page says so. It is still one paste now; a later hire needs it once more.
106
126
 
107
- Then trigger the daily workflow once from the Actions tab and read the log.
127
+ ## 7. Run it once
108
128
 
109
- **A workflow that has never run has proved nothing.** Not that the App is installed, not that
110
- the grant took, not that the secrets are right. `doctor` says `unproven` rather than `fine` for
111
- exactly this reason.
129
+ **Run once now**, step 5, also on the card and on **Health**. It starts the daily workflow, follows it, and
130
+ tells you how it ended, with the log.
131
+
132
+ **A workflow that has never run has proved nothing**: not that the App is installed on the right
133
+ repos, not that the secrets are right. Doctor reports it as `unproven` until one run has
134
+ finished, and this is that run. If it fails, the result names the step, and
135
+ [troubleshooting](troubleshooting.md) has what each failure usually means.
136
+
137
+ Health is `roster doctor` on the page. Every finding carries the sentence that fixes it.
112
138
 
113
139
  ## 8. Now look at what you built
114
140
 
115
141
  ![A staff member's brain: memory sections, the facts in them, and the files](images/brain.jpg)
116
142
 
117
- **Brain** is that staff member's memory and files together, because they were always the same
118
- thing. **Prompt** is the text they are actually sent, composed by your own `compose.mjs`, with
119
- every layer it was made of and which repo each came from.
143
+ **Brain** is that staff member's memory and files together. **Prompt** is the text they are
144
+ actually sent, with every layer it was made of and which repo each came from.
120
145
 
121
146
  ![The Prompt screen: the composed text, and the layers behind it](images/prompt.jpg)
122
147
 
@@ -126,14 +151,39 @@ that*. The answer is always in one of those files.
126
151
  ![The Org screen, with org.yaml and every layer every staff member inherits](images/org.jpg)
127
152
 
128
153
  **Org** is the layer everybody inherits. Change `org/voice.md` once and it reaches every staff
129
- member on their next run, without regenerating anything.
154
+ member on their next run.
155
+
156
+ ## From a terminal
157
+
158
+ The same road, command by command. Each prints its plan and changes nothing without `--apply`.
159
+
160
+ `roster` below means `npx @nanocollective/roster@latest`, unless you have installed it with
161
+ `npm install -g @nanocollective/roster`.
162
+
163
+ ```bash
164
+ roster init --org acme --apply # the ops repo, and its Actions access
165
+ roster brief discover # a brief for org/business.md
166
+ roster brief priorities # a brief for org/priorities.md
167
+ roster hire cto --apply # the brain, the wiring, the commits as you
168
+ roster app cto --apply # the App, its secrets, and a pre-ticked install link
169
+ roster credential --apply # the agent credential, once for the org
170
+ roster brief charter cto # the charter brief, with the CTO example
171
+ roster run cto --apply # one run, followed to the end
172
+ ```
173
+
174
+ ## What is still yours to do
175
+
176
+ Five things, each because GitHub or the job itself needs a person: creating the organisation,
177
+ confirming the App, confirming its install, getting the agent credential, and writing
178
+ `business.md`, `priorities.md` and each charter. [Manual steps](manual-steps.md) has why for
179
+ each.
130
180
 
131
181
  ## Where things go from here
132
182
 
133
- - **A second staff member**: Staff → Hire someone, then the App. Peer wiring happens both ways.
134
- - **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).
183
+ - **A second staff member**: Staff → Hire someone, then GitHub App, the charter and one run. The
184
+ credential is already there.
185
+ - **Answering your agents**: [Home](portal.md#home) is what needs you, who is working and
186
+ what you asked for. Replies and merges go out as you.
137
187
  - **A framework update**: `roster upgrade`, or the same from the portal. See
138
188
  [upgrading](upgrading.md).
139
189
  - **The whole portal**, screen by screen: [the portal](portal.md).
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file