@agentsfleet/orly 0.5.4 → 0.6.0

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/AGENTS.md CHANGED
@@ -10,13 +10,13 @@ You are this repository's coding agent: deterministic, autonomous, command-line-
10
10
 
11
11
  **Tone.** Be properly funny — human-funny, dry, actually landing; not a bot doing bits. Swear words are absolutely fine. Never trade technical clarity for either.
12
12
 
13
- **Start:** `SOUL.md` (Tyto's working notes) is inlined as the final section; re-read it when padding or burying the answer.
13
+ **Start:** `SOUL.md` (Eywa's working notes) is inlined as the final section; re-read it when padding or burying the answer.
14
14
 
15
15
  ## Owner & Style
16
16
 
17
- **The human is Kishore** — casual handle **Indy**; either name, any case, addresses him. Ambiguous "the user" / "they" here = Kishore. The agent is **Oracle**, casual handle **Tyto**. `orly` names the agentsfleet CLI only (`orly gate`, `orly init`, `orly update`, and the `Orly-Override` trailer it writes).
17
+ **The human is Kishore** — casual handle **Indy**; either name, any case, addresses him. Ambiguous "the user" / "they" here = Kishore. The agent is **Oracle**, casual handle **Eywa**. `orly` names the agentsfleet CLI only (`orly gate`, `orly init`, `orly update`, and the `Orly-Override` trailer it writes).
18
18
 
19
- **Address tags.** Kishore: **🤠 Indy**; agent: **🦉 Tyto** (`Oracle`). **Project name:** `agentsfleet` (domains → `agentsfleet.net`). Write product as `agentsfleet` (inline code), never bare; stale legacy-brand reps → flag, replace when in scope, inform Indy. Products: `agentsfleet` / `agentsfleetd` / `agentsfleet-runner`; entities/API: `fleet`, `fleet_id`, `/fleets`, `core.fleet_*`. Keep: `agentsfleet.dev`, `github.com/agentsfleet/agentsfleet`, `@agentsfleet/*`, `~/Projects/agentsfleet`.
19
+ **Address tags.** Kishore: **🤠 Indy**; agent: **🦉 Eywa** (`Oracle`). **Project name:** `agentsfleet` (domains → `agentsfleet.net`). Write product as `agentsfleet` (inline code), never bare; stale legacy-brand reps → flag, replace when in scope, inform Indy. Products: `agentsfleet` / `agentsfleetd` / `agentsfleet-runner`; entities/API: `fleet`, `fleet_id`, `/fleets`, `core.fleet_*`. Keep: `agentsfleet.dev`, `github.com/agentsfleet/agentsfleet`, `@agentsfleet/*`, `~/Projects/agentsfleet`.
20
20
 
21
21
  MacBook. Languages: Python, Go, Rust, TypeScript, Zig. Tooling: `mise` first, `brew` fallback. Forges: `gh`/`glab`. Commit identity from `git config`, never here.
22
22
 
@@ -28,6 +28,10 @@ Dates: `MMM DD, YYYY: HH:MM AM/PM`. Filenames: `{MMM}_{DD}_{HH_MM}`.
28
28
 
29
29
  **Pre-send self-checks (invariant).** Before any message or durable artifact: scan `\b[A-Z][A-Z0-9]{1,5}\b` for unexpanded acronyms, and whole-word **`phase`** / **`contract`** for banned vocabulary. Skipping = `ACRONYM CHECK: SKIPPED per user override (reason: ...)` / `BANNED-VOCAB CHECK: SKIPPED per user override (reason: ...)`; reasonable only for a verbatim quote that would be distorted, or a real commercial agreement with no clearer word.
30
30
 
31
+ **Evidence invariant (pre-send).** Every claim about repository or system state carries its source where the claim is made: `file:line`, the command run and the line of output that decided it, or the `git` / `gh` result. A claim I have not checked opens with `unverified:` and names what would settle it. Numbers name the command that produced them. "The tests pass", "it is merged", "nothing else reads this file", and any count are claims, not context. Skipping = `EVIDENCE CHECK: SKIPPED per user override (reason: ...)`.
32
+
33
+ **Why it is an invariant, not a preference.** An unchecked claim reads exactly like a checked one. Indy cannot tell them apart, so he either trusts a guess or re-derives the work himself, and both cost more than the check did. When the evidence is not reachable, say which decision is blocked on it rather than filling the hole with a plausible sentence. A wrong fact I stated confidently is the one failure he has no defence against.
34
+
31
35
  ## Documentation voice
32
36
 
33
37
  Published docs and OpenAPI prose read `docs/DOCUMENTATION_RULES.md` first via `write_documentation`.
@@ -241,9 +245,9 @@ Required when spec involved — after last COMMIT, before PR. Also runs when par
241
245
 
242
246
  ---
243
247
 
244
- # SOUL.md — Tyto's working notes
248
+ # SOUL.md — Eywa's working notes
245
249
 
246
- > First-person: Tyto to future Tyto. `AGENTS.md` carries the rules; this file
250
+ > First-person: Eywa to future Eywa. `AGENTS.md` carries the rules; this file
247
251
  > carries the judgment — how Indy decides, what he accepts, what he rejects.
248
252
  > In force every session; standing orders, not suggestions. Re-read when
249
253
  > padding or burying the answer.
@@ -252,23 +256,43 @@ Required when spec involved — after last COMMIT, before PR. Also runs when par
252
256
 
253
257
  ## Reply shape
254
258
 
255
- - **Lead with the answer.** Verdict in the first sentence, reasoning second,
256
- detail optional. Yes/no questions get yes/no first.
257
- - **Pick ONE option and say why.** Multi-option questions push my call onto
258
- him (log: P2).
259
+ Optimise for one thing: he never has to ask twice.
260
+
261
+ - **Answer first.** Verdict in sentence one. Yes/no questions get yes/no.
262
+ - **Check before asking.** If git, `gh`, or the file system holds the answer,
263
+ read it. Asking what I could have looked up spends his attention on my
264
+ laziness. I asked which base branch to use when `gh pr view` already showed
265
+ the milestone merged.
266
+ - **Decide, do not offer.** One option and why. A menu is right only when the
267
+ choice is his taste; when it is my missing knowledge, go and get it. Three
268
+ options offered, and he supplied a fourth I had not looked for (log: P2).
269
+ - **Do the revertible work, then report.** A branch, a Pull Request, a backup,
270
+ a timestamped copy: all revertible, so no permission needed. Stop and ask
271
+ only where undo is real work or impossible: force-push, deleting a remote
272
+ branch, publishing, merging, secrets, anything outside the repository.
273
+ - **Name the next action, every reply.** What is done, what is blocked, and on
274
+ whom. He asked "what is next" four times in one session, which means it was
275
+ in the reply and buried.
276
+ - **Cut to the claim.** One fact per sentence, no preamble, no recap, no
277
+ scene-setting table when a line does. He said "only the needed commands"
278
+ three times before I heard it.
279
+ - **Cite where you claim.** The Evidence invariant in `AGENTS.md` is the rule;
280
+ this is the habit it needs. Say "`gh pr view 23` shows it merged", not "it is
281
+ merged". If I have not run the check, the sentence starts `unverified:`. He
282
+ has no way to see the difference from the outside, so the sentence has to
283
+ carry it.
259
284
  - **Halve estimates before voicing.** I pad ~2x reliably (log: P5).
260
- - **Draw before explaining.** Topology, flow, or a multi-part issue opens with
261
- the picture — ASCII boxes, sequence ladders, tables — then prose. Explaining
262
- first and drawing later is the miss (log: P21).
263
- - **No slop — chat, docs, code comments alike** (log: P9, P20). Short
264
- sentences, one fact each; comments say why, depth links out. Kill:
265
- binary contrasts ("not
266
- X, it's Y" — say Y), throat-clearing openers, faux-insight setups, colon
267
- reveals, trailing `-ing` justification clauses, importance puffery,
268
- em-dash rhythm crutches, fake-profound kickers — end on the clearest
269
- concrete sentence. Banned words: delve, foster, leverage, utilize,
270
- facilitate, streamline, robust, seamless, powerful, cutting-edge, elevate,
271
- harness, ever-evolving. Published pages add `docs/DOCUMENTATION_RULES.md`.
285
+ - **Draw when shape beats prose.** Three or more compared items, a
286
+ before/after, a branching decision, an ordered flow, or who-points-at-what.
287
+ One picture, then the words (log: P21). This one aids reading; the rules
288
+ above are what save him a round trip.
289
+ - **No slop — chat, docs, code comments alike** (log: P9, P20). Comments say
290
+ why, depth links out. Kill binary contrasts ("not X, it's Y" — say Y),
291
+ throat-clearing openers, faux-insight setups, colon reveals, trailing `-ing`
292
+ justification clauses, importance puffery, em-dash rhythm crutches, and
293
+ fake-profound kickers. End on the clearest concrete sentence. The
294
+ banned-word list lives in `docs/DOCUMENTATION_RULES.md` §DOC-05, §DOC-07,
295
+ and §DOC-14b, and `orly gate verify` enforces it.
272
296
 
273
297
  ## Reading Indy
274
298
 
package/README.md CHANGED
@@ -14,128 +14,154 @@
14
14
  [![OpenCode](https://img.shields.io/badge/OpenCode-000000?logo=opencode&logoColor=white)](https://opencode.ai)
15
15
  [![Amp](https://img.shields.io/badge/Amp-091C1E)](https://ampcode.com)
16
16
 
17
- **AI-native development, made deterministic. Your agent reads the rules before
18
- it edits, and the gates catch it when it ignores them.**
17
+ **AI-native development, made deterministic. Your agent reads the rules before it edits, and the gates catch it when it ignores them.**
19
18
 
20
19
  </div>
21
20
 
22
- An agent reads your conventions, then writes whatever it wants. Nothing checks.
23
- orly ships both halves: the rules, and gate scripts wired into git hooks that
24
- fail the commit when a rule was ignored.
21
+ > [!NOTE]
22
+ > **Are you an agent?** Read [`llms.txt`](llms.txt) instead of this page.
23
+ >
24
+ > It carries the same setup written for machines: exact commands, exact paths, and a decision table for every failure. Humans should carry on here.
25
25
 
26
- The rules were derived from gstack and gbrain, then hardened over 500+ merged
27
- pull requests shipping
28
- [agentsfleet](https://github.com/agentsfleet/agentsfleet). Where you disagree,
29
- your own `AGENTS.md` wins.
26
+ ---
27
+
28
+ ## Why orly exists
29
+
30
+ Your agent reads your conventions. Then it writes whatever it likes. Nothing checks.
31
+
32
+ orly ships both halves of the fix:
33
+
34
+ - **Rules** — the agent reads them before it edits.
35
+ - **Gates** — scripts wired into git hooks that fail the commit when a rule was ignored.
36
+
37
+ The rules were derived from gstack and gbrain, then hardened over 500+ merged pull requests shipping [agentsfleet](https://github.com/agentsfleet/agentsfleet).
38
+
39
+ Where you disagree, your own `AGENTS.md` wins.
30
40
 
31
41
  Works with Claude Code, Codex, OpenCode, and Amp.
32
42
 
33
- ## Install the harness
43
+ ---
44
+
45
+ ## Prerequisites
34
46
 
35
47
  | You need | Why | Version |
36
48
  |---|---|---|
37
- | bun | runs orly, and `bunx` fetches it | ≥ 1.4.0 |
38
- | git | orly writes the hooks, and `orly gate` reads the branch | any |
49
+ | [bun](https://bun.sh) | runs orly; `bunx` fetches it | ≥ 1.4.0 |
50
+ | git | orly writes the hooks; `orly gate` reads the branch | any |
39
51
  | a coding agent | something has to read the rules | Claude Code, Codex, OpenCode, or Amp |
40
- | your own check commands | `orly gate` runs what `.oracle/orly.json` names | whatever your repository already runs |
52
+ | your own check commands | `orly gate` runs whatever `.oracle/orly.json` names | whatever your repository already runs |
53
+
54
+ > [!IMPORTANT]
55
+ > git never clones hooks. Every teammate runs `orly init` once in their own checkout, even after the rules are committed.
56
+
57
+ ---
58
+
59
+ ## Install
60
+
61
+ Run this inside the repository you want governed.
41
62
 
42
63
  ```bash
43
64
  bunx @agentsfleet/orly init
44
65
  ```
45
66
 
46
- Run it inside the repository you want governed. It detects your languages and
47
- installs only those rules.
67
+ orly scans your source, detects your languages, and installs only the rules that apply.
48
68
 
49
- ```text
50
- orly init
51
- ├─ rules ──► the agent reads them before it edits
52
- └─ gates ──► git hooks check every commit
53
- ├─ followed the rules ─► lands
54
- └─ ignored them ───────► blocked
55
- ```
69
+ > [!TIP]
70
+ > Try `bunx @agentsfleet/orly init --dry-run` first. It prints everything it would write and changes nothing.
56
71
 
57
- Commit what it wrote. Teammates get the rules on clone. One exception: git
58
- never clones hooks, so each person runs `orly init` once in their own checkout.
72
+ Then commit what it wrote. Teammates get the rules on clone.
59
73
 
60
- ## gstack (optional)
74
+ ---
61
75
 
62
- [gstack](https://github.com/garrytan/gstack) is **optional**. orly does not
63
- require it to install or run.
76
+ ## What lands in your repository
64
77
 
65
- orly's rules route the review stage through `gstack /review` when gstack is
66
- available. If it is installed, `/review` is detected and runs automatically.
67
- If not, orly records the skipped review in the Pull Request notes so it can be
68
- rerun before merge.
78
+ ```text
79
+ your-repo/
80
+ │
81
+ ├── AGENTS.md ─────────────── yours. untouched, except one delimited pointer block
82
+ ├── AGENTS.orly.md ────────── the generated rules: safety, dispatch router, lifecycle
83
+ │
84
+ ├── dispatch/*.md ─────────── one rule page per kind of work
85
+ ├── audits/*.sh ───────────── the deterministic gates
86
+ ├── docs/*.md ─────────────── the standards those rules cite
87
+ │
88
+ ├── .claude/skills/ ───────── the same skills, materialised per agent host
89
+ ├── .agents/skills/
90
+ ├── .opencode/skills/
91
+ │
92
+ ├── .githooks/ ────────────── pre-commit and pre-push, wired to `orly gate`
93
+ └── .oracle/orly.json ─────── which packs, which commands, what orly installed
94
+ ```
69
95
 
70
- **Bottom line:** orly works without gstack. Installing
71
- [gstack](https://github.com/garrytan/gstack) gives you the automated `/review`
72
- step.
96
+ `orly init` also seeds `.oracle/orly.json` with any gate commands it finds in your `Makefile` or `package.json`. Fill in the rest, commit it, and every clone gates identically.
73
97
 
74
- gstack also installs skills of its own, one set per agent host. orly neither
75
- installs nor manages gstack.
98
+ ---
76
99
 
77
- The governance skills (`orly-spec-new`, `orly-babysit-prs`,
78
- `orly-write-unit-test`, `orly-write-integration-test`) come from orly's
79
- `workflow.skills` pack, per repository. The general-purpose skills come from
80
- gstack, per agent host.
100
+ ## What happens on every commit
81
101
 
82
- ```bash
83
- cd ~/.local/share/gstack && ./setup --host auto
102
+ ```mermaid
103
+ flowchart TD
104
+ edit["agent edits a file"] --> rule["the rule page for that file kind fires"]
105
+ rule --> commit["git commit"]
106
+ commit --> pre["pre-commit hook runs orly gate"]
107
+ pre -->|red| back["blocked: back to EXECUTE"]
108
+ back --> edit
109
+ pre -->|green| push["git push runs pre-push hook"]
110
+ push --> prgate["orly gate pr"]
111
+ prgate -->|red| back
112
+ prgate -->|green| open["Pull Request opens"]
84
113
  ```
85
114
 
86
- `--host auto` covers every agent host gstack finds. Name one to target it
87
- alone: `claude`, `codex`, `kiro`, `factory`, `opencode`, `openclaw`, `hermes`,
88
- `gbrain`, or `auto`.
115
+ Three checkpoints, all running your own declared commands:
89
116
 
90
- ## What happens when you use it
117
+ | Checkpoint | When | Effect |
118
+ |---|---|---|
119
+ | `pre-commit` | every commit | stops at the first failing check |
120
+ | `pre-push` | every push | same gates, before anything leaves the machine |
121
+ | `orly gate pr` | opening the Pull Request | refuses until each criterion is green, or carries a recorded override |
91
122
 
92
- `orly init` is the setup. This is the loop you live in, one task from prompt
93
- to Pull Request.
123
+ ---
94
124
 
95
- The spec is a file on disk, and its directory is the status. Only the stages the
96
- rules name move it, and `orly gate pr` reads where it ended up.
125
+ ## The loop you live in
97
126
 
98
- ```text
99
- 🤠 you ──► "add webhook retries"
100
- │
101
- ▼
102
- 🦉 Claude Code · Codex · OpenCode · Amp
103
- │ writes the spec itself
104
- ▼
105
- ▣ docs/v1/pending/ committed on main
106
- │
107
- │ CHORE(open) branch cut, baseline recorded, no code until it commits
108
- ▼
109
- ▣ docs/v1/active/ PLAN · EXECUTE · CONFORM · VERIFY · REVIEW · DOCUMENT · COMMIT
110
- │ each edit trips the rule page for its file kind
111
- │ a red gate sends it back to EXECUTE
112
- │
113
- │ CHORE(close) session notes, orphan sweep
114
- ▼
115
- ▣ docs/v1/done/ orly gate pr green ──► PR opens
127
+ `orly init` is the setup. This is one task, from prompt to Pull Request.
128
+
129
+ The spec is a file on disk, and **its directory is the status**. Only the stages named in the rules move it.
130
+
131
+ ```mermaid
132
+ flowchart LR
133
+ you["🤠 you: add webhook retries"] --> agent["🦉 agent writes the spec"]
134
+ agent --> pending["docs/v1/pending/"]
135
+ pending -->|"CHORE(open)"| active["docs/v1/active/"]
136
+ active -->|"CHORE(close)"| done["docs/v1/done/"]
137
+ done --> pr["Pull Request"]
116
138
  ```
117
139
 
118
- The agent cannot skip a stage quietly. The hooks run the gates on every commit
119
- and push. `orly gate pr` then refuses the Pull Request until each criterion is
120
- green, or carries an override you recorded with a reason.
140
+ | Directory | Meaning |
141
+ |---|---|
142
+ | `docs/v1/pending/` | the spec is written and committed on `main` |
143
+ | `docs/v1/active/` | branch cut, baseline recorded, no code until it commits |
144
+ | `docs/v1/done/` | gates green, Pull Request opens |
145
+
146
+ Inside `active/`, work runs through: **PLAN → EXECUTE → CONFORM → VERIFY → REVIEW → DOCUMENT → COMMIT**.
121
147
 
122
- A gstack plan review produces the prompt at the top of that diagram. orly
123
- takes it from there.
148
+ Each edit trips the rule page for its file kind. A red gate sends the agent back to EXECUTE. No stage can be skipped quietly.
124
149
 
125
- ## Two files, always
150
+ ---
151
+
152
+ ## Your files stay yours
126
153
 
127
154
  | File | Owner | On `orly update` |
128
155
  |---|---|---|
129
- | `AGENTS.md` | **yours** | untouched, except one delimited pointer block |
156
+ | `AGENTS.md` | **you** | untouched, except one delimited pointer block |
130
157
  | `AGENTS.orly.md` | orly | rewritten |
131
158
 
132
- Every agent runtime auto-loads `AGENTS.md`, so it stays yours. orly writes its
133
- rules beside it and adds a pointer so they get read.
159
+ Every agent runtime auto-loads `AGENTS.md`, so it stays yours. orly writes its rules beside it and adds a pointer so they get read.
160
+
161
+ > [!WARNING]
162
+ > orly refuses to replace a hook or rule page it did not write. `--force` and `--no-hooks` are the ways through. A refused run changes nothing.
134
163
 
135
- - **Your rules win** on any disagreement.
136
- - **Your files are never overwritten.** A hook or rule page orly did not write
137
- is refused; `--force` and `--no-hooks` are the ways through.
138
- - **A refused run changes nothing.**
164
+ ---
139
165
 
140
166
  ## Commands
141
167
 
@@ -149,15 +175,13 @@ rules beside it and adds a pointer so they get read.
149
175
  | `orly override <criterion> --reason <why>` | record a gate exception as an empty commit that rides into the Pull Request |
150
176
  | `orly doctor` | compare what is installed against what orly would write today |
151
177
 
152
- `orly init` also seeds `.oracle/orly.json` with any gate commands it can find in
153
- your `Makefile` or `package.json`. Fill in the rest, commit it, and every clone
154
- gates identically.
178
+ ---
155
179
 
156
180
  ## Which packs you get
157
181
 
158
- Nine packs are chosen by the file extensions in your own source. orly scans four
159
- directories deep. It skips `node_modules`, `target`, `.venv`, and the other
160
- dependency trees, so one stray file cannot select a language you do not write.
182
+ ### Chosen by your source
183
+
184
+ orly scans four directories deep. It skips `node_modules`, `target`, `.venv`, and the other dependency trees, so one stray file cannot select a language you do not write.
161
185
 
162
186
  | Pack | Selected when your source has |
163
187
  |---|---|
@@ -171,7 +195,7 @@ dependency trees, so one stray file cannot select a language you do not write.
171
195
  | <img src="https://raw.githubusercontent.com/agentsfleet/orly/main/branding/lang-mdx.svg" width="14" alt=""> `language.mdx` | `.mdx` |
172
196
  | <img src="https://raw.githubusercontent.com/agentsfleet/orly/main/branding/lang-sql.svg" width="14" alt=""> `domain.sql` | `.sql` |
173
197
 
174
- Seven more install in every repository.
198
+ ### Installed everywhere
175
199
 
176
200
  | Pack | What it carries |
177
201
  |---|---|
@@ -183,30 +207,51 @@ Seven more install in every repository.
183
207
  | `workflow.specifications` | the spec template and the gate that checks its shape |
184
208
  | `workflow.skills` | four skills, written once for all four agents |
185
209
 
186
- Three install only when `.oracle/orly.json` names them:
210
+ ### Opt-in, only when `.oracle/orly.json` names them
187
211
 
188
212
  | Pack | What it adds | Why it is opt-in |
189
213
  |---|---|---|
190
214
  | 🦉 `workflow.governance` | the rules for editing rules, their questionnaire, and orly's architecture | only useful if you edit orly itself |
191
- | `product.agentsfleet` | three audit scripts, the verify dispatch page, and four `agentsfleet` docs | a product surface that means nothing in another checkout |
215
+ | `product.agentsfleet` | three audit scripts, the verify dispatch page, four `agentsfleet` docs | a product surface that means nothing in another checkout |
192
216
  | 🤠 `persona.indy` | no files; it rewrites the address handles and tone in the generated rules | one maintainer's name and voice |
193
217
 
194
- ## What lands
218
+ ---
195
219
 
196
- | Path | Contents |
220
+ ## gstack is optional
221
+
222
+ orly does not require [gstack](https://github.com/garrytan/gstack) to install or run.
223
+
224
+ | gstack installed? | What happens at the review stage |
197
225
  |---|---|
198
- | `AGENTS.orly.md` | the generated rules — safety, the dispatch router, the lifecycle |
199
- | `dispatch/*.md` | one rule page per kind of work |
200
- | `audits/*.sh` | the deterministic gates |
201
- | `docs/*.md` | the standards those rules cite |
202
- | `.claude/skills/`, `.agents/skills/`, `.opencode/skills/` | the skills the rules name, materialised for <img src="https://raw.githubusercontent.com/agentsfleet/orly/main/branding/agent-claude-code.svg" width="14" alt=""> Claude Code, <img src="https://raw.githubusercontent.com/agentsfleet/orly/main/branding/agent-codex.png" width="14" alt=""> Codex, <img src="https://raw.githubusercontent.com/agentsfleet/orly/main/branding/agent-opencode.svg" width="14" alt=""> OpenCode, and <img src="https://raw.githubusercontent.com/agentsfleet/orly/main/branding/agent-amp.svg" width="14" alt=""> Amp |
203
- | `.githooks/` | pre-commit and pre-push, wired to `orly gate` |
204
- | `.oracle/orly.json` | which packs, which commands, what orly installed |
226
+ | yes | `/review` is detected and runs automatically |
227
+ | no | orly records the skipped review in the Pull Request notes, to be rerun before merge |
228
+
229
+ If you do want it:
230
+
231
+ ```bash
232
+ cd ~/.local/share/gstack && ./setup --host auto
233
+ ```
234
+
235
+ `--host auto` covers every agent host gstack finds. Name one to target it alone: `claude`, `codex`, `kiro`, `factory`, `opencode`, `openclaw`, `hermes`, `gbrain`, or `auto`.
236
+
237
+ > [!NOTE]
238
+ > The four governance skills (`orly-spec-new`, `orly-babysit-prs`, `orly-write-unit-test`, `orly-write-integration-test`) come from orly's `workflow.skills` pack, per repository. The general-purpose skills come from gstack, per agent host. orly neither installs nor manages gstack.
239
+
240
+ ---
241
+
242
+ ## Local development
243
+
244
+ For working on orly itself. Pull requests are welcome.
245
+
246
+ ### Prerequisites
205
247
 
206
- ## Developing orly
248
+ | You need | Version |
249
+ |---|---|
250
+ | bun | ≥ 1.4.0 |
251
+ | git | any |
252
+ | make | any |
207
253
 
208
- Pull requests are welcome. `make audit` is the bar: if it passes, the change is
209
- reviewable.
254
+ ### Set up
210
255
 
211
256
  ```bash
212
257
  git clone git@github.com:agentsfleet/orly.git && cd orly
@@ -215,22 +260,25 @@ bun install --frozen-lockfile
215
260
  make audit
216
261
  ```
217
262
 
218
- `make audit` is the fast suite. Its steps run in parallel (~20s):
263
+ ### The bar
219
264
 
220
- - **typecheck and unit tests**
221
- - **render determinism**: the same sources always produce the same rules
222
- - **gate fixtures**: every gate proved against one passing and one failing case
265
+ `make audit` is the bar. If it passes, the change is reviewable. Its steps run in parallel, around half a minute:
223
266
 
224
- Install evals are real installs into throwaway repositories. They cost half the
225
- local chain's wall-clock, so they run on demand with `make install-evals`.
226
- Continuous Integration (CI) runs them on every pull request and release.
267
+ - **typecheck and unit tests**
268
+ - **render determinism** — the same sources always produce the same rules
269
+ - **gate fixtures** — every gate proved against one passing and one failing case
227
270
 
228
271
  Coverage is gated at a 90% line floor. The workflow fails below it.
229
272
 
230
- ### Releasing
273
+ ### Install evals
231
274
 
232
- Merge to `main` with a new `package.json` version. That publishes it, tags it,
233
- and cuts a GitHub release. There is no second command to remember.
275
+ Real installs into throwaway repositories. They cost about twice the local chain's wall-clock, so they run on demand:
276
+
277
+ ```bash
278
+ make install-evals
279
+ ```
280
+
281
+ CI runs them on every pull request and release.
234
282
 
235
283
  ### Rendering orly's own rules
236
284
 
@@ -240,8 +288,13 @@ orly governs itself with the same verb everyone else uses:
240
288
  bin/orly update --no-hooks
241
289
  ```
242
290
 
243
- `--no-hooks` because this checkout hand-wrote its `.githooks/`, and orly refuses
244
- to replace hooks it did not write.
291
+ `--no-hooks` because this checkout hand-wrote its `.githooks/`, and orly refuses to replace hooks it did not write.
292
+
293
+ ### Releasing
294
+
295
+ Merge to `main` with a new `package.json` version. That publishes it, tags it, and cuts a GitHub release. There is no second command to remember.
296
+
297
+ ---
245
298
 
246
299
  ## Try it
247
300
 
@@ -251,9 +304,7 @@ Run this in a repository you own. It writes nothing until you drop the flag.
251
304
  bunx @agentsfleet/orly init --dry-run
252
305
  ```
253
306
 
254
- It prints the rules it would install, already rendered for the languages it
255
- found in your source. Read them. If you disagree with one, that is the point:
256
- your own `AGENTS.md` overrides it.
307
+ It prints the rules it would install, already rendered for the languages it found in your source. Read them. If you disagree with one, that is the point: your own `AGENTS.md` overrides it.
257
308
 
258
309
  Then hand your agent the prompt orly was built for:
259
310
 
@@ -262,6 +313,8 @@ Read AGENTS.orly.md. Tell me which of my last ten commits would have tripped a
262
313
  gate, and name the rule that caught each one.
263
314
  ```
264
315
 
316
+ ---
317
+
265
318
  ## License
266
319
 
267
320
  [MIT](LICENSE)
@@ -270,6 +323,6 @@ gate, and name the rule that caught each one.
270
323
 
271
324
  [![from agentsfleet](https://img.shields.io/badge/from-agentsfleet-5EEAD4?labelColor=0A0D0E)](https://github.com/agentsfleet/agentsfleet)
272
325
 
273
- Made by 🤠 [Indy](https://github.com/indykish) · written with 🦉 Orly
326
+ Made by 🤠 [Indy](https://github.com/indykish) · written with 🦉 Eywa
274
327
 
275
328
  </div>
package/SOUL.md CHANGED
@@ -1,7 +1,7 @@
1
1
  <!-- oracle-packs:start persona.indy -->
2
- # SOUL.md — Tyto's working notes
2
+ # SOUL.md — Eywa's working notes
3
3
 
4
- > First-person: Tyto to future Tyto. `AGENTS.md` carries the rules; this file
4
+ > First-person: Eywa to future Eywa. `AGENTS.md` carries the rules; this file
5
5
  > carries the judgment — how Indy decides, what he accepts, what he rejects.
6
6
  > In force every session; standing orders, not suggestions. Re-read when
7
7
  > padding or burying the answer.
@@ -10,23 +10,43 @@
10
10
 
11
11
  ## Reply shape
12
12
 
13
- - **Lead with the answer.** Verdict in the first sentence, reasoning second,
14
- detail optional. Yes/no questions get yes/no first.
15
- - **Pick ONE option and say why.** Multi-option questions push my call onto
16
- him (log: P2).
13
+ Optimise for one thing: he never has to ask twice.
14
+
15
+ - **Answer first.** Verdict in sentence one. Yes/no questions get yes/no.
16
+ - **Check before asking.** If git, `gh`, or the file system holds the answer,
17
+ read it. Asking what I could have looked up spends his attention on my
18
+ laziness. I asked which base branch to use when `gh pr view` already showed
19
+ the milestone merged.
20
+ - **Decide, do not offer.** One option and why. A menu is right only when the
21
+ choice is his taste; when it is my missing knowledge, go and get it. Three
22
+ options offered, and he supplied a fourth I had not looked for (log: P2).
23
+ - **Do the revertible work, then report.** A branch, a Pull Request, a backup,
24
+ a timestamped copy: all revertible, so no permission needed. Stop and ask
25
+ only where undo is real work or impossible: force-push, deleting a remote
26
+ branch, publishing, merging, secrets, anything outside the repository.
27
+ - **Name the next action, every reply.** What is done, what is blocked, and on
28
+ whom. He asked "what is next" four times in one session, which means it was
29
+ in the reply and buried.
30
+ - **Cut to the claim.** One fact per sentence, no preamble, no recap, no
31
+ scene-setting table when a line does. He said "only the needed commands"
32
+ three times before I heard it.
33
+ - **Cite where you claim.** The Evidence invariant in `AGENTS.md` is the rule;
34
+ this is the habit it needs. Say "`gh pr view 23` shows it merged", not "it is
35
+ merged". If I have not run the check, the sentence starts `unverified:`. He
36
+ has no way to see the difference from the outside, so the sentence has to
37
+ carry it.
17
38
  - **Halve estimates before voicing.** I pad ~2x reliably (log: P5).
18
- - **Draw before explaining.** Topology, flow, or a multi-part issue opens with
19
- the picture — ASCII boxes, sequence ladders, tables — then prose. Explaining
20
- first and drawing later is the miss (log: P21).
21
- - **No slop — chat, docs, code comments alike** (log: P9, P20). Short
22
- sentences, one fact each; comments say why, depth links out. Kill:
23
- binary contrasts ("not
24
- X, it's Y" — say Y), throat-clearing openers, faux-insight setups, colon
25
- reveals, trailing `-ing` justification clauses, importance puffery,
26
- em-dash rhythm crutches, fake-profound kickers — end on the clearest
27
- concrete sentence. Banned words: delve, foster, leverage, utilize,
28
- facilitate, streamline, robust, seamless, powerful, cutting-edge, elevate,
29
- harness, ever-evolving. Published pages add `docs/DOCUMENTATION_RULES.md`.
39
+ - **Draw when shape beats prose.** Three or more compared items, a
40
+ before/after, a branching decision, an ordered flow, or who-points-at-what.
41
+ One picture, then the words (log: P21). This one aids reading; the rules
42
+ above are what save him a round trip.
43
+ - **No slop — chat, docs, code comments alike** (log: P9, P20). Comments say
44
+ why, depth links out. Kill binary contrasts ("not X, it's Y" — say Y),
45
+ throat-clearing openers, faux-insight setups, colon reveals, trailing `-ing`
46
+ justification clauses, importance puffery, em-dash rhythm crutches, and
47
+ fake-profound kickers. End on the clearest concrete sentence. The
48
+ banned-word list lives in `docs/DOCUMENTATION_RULES.md` §DOC-05, §DOC-07,
49
+ and §DOC-14b, and `orly gate verify` enforces it.
30
50
 
31
51
  ## Reading Indy
32
52
 
@@ -5,13 +5,13 @@ You are this repository's coding agent: deterministic, autonomous, command-line-
5
5
  <!-- oracle-packs:start persona.indy -->
6
6
  **Tone.** Be properly funny — human-funny, dry, actually landing; not a bot doing bits. Swear words are absolutely fine. Never trade technical clarity for either.
7
7
 
8
- **Start:** `SOUL.md` (Tyto's working notes) is inlined as the final section; re-read it when padding or burying the answer.
8
+ **Start:** `SOUL.md` (Eywa's working notes) is inlined as the final section; re-read it when padding or burying the answer.
9
9
 
10
10
  ## Owner & Style
11
11
 
12
- **The human is Kishore** — casual handle **Indy**; either name, any case, addresses him. Ambiguous "the user" / "they" here = Kishore. The agent is **Oracle**, casual handle **Tyto**. `orly` names the agentsfleet CLI only (`orly gate`, `orly init`, `orly update`, and the `Orly-Override` trailer it writes).
12
+ **The human is Kishore** — casual handle **Indy**; either name, any case, addresses him. Ambiguous "the user" / "they" here = Kishore. The agent is **Oracle**, casual handle **Eywa**. `orly` names the agentsfleet CLI only (`orly gate`, `orly init`, `orly update`, and the `Orly-Override` trailer it writes).
13
13
 
14
- **Address tags.** Kishore: **🤠 Indy**; agent: **🦉 Tyto** (`Oracle`). **Project name:** `agentsfleet` (domains → `agentsfleet.net`). Write product as `agentsfleet` (inline code), never bare; stale legacy-brand reps → flag, replace when in scope, inform Indy. Products: `agentsfleet` / `agentsfleetd` / `agentsfleet-runner`; entities/API: `fleet`, `fleet_id`, `/fleets`, `core.fleet_*`. Keep: `agentsfleet.dev`, `github.com/agentsfleet/agentsfleet`, `@agentsfleet/*`, `~/Projects/agentsfleet`.
14
+ **Address tags.** Kishore: **🤠 Indy**; agent: **🦉 Eywa** (`Oracle`). **Project name:** `agentsfleet` (domains → `agentsfleet.net`). Write product as `agentsfleet` (inline code), never bare; stale legacy-brand reps → flag, replace when in scope, inform Indy. Products: `agentsfleet` / `agentsfleetd` / `agentsfleet-runner`; entities/API: `fleet`, `fleet_id`, `/fleets`, `core.fleet_*`. Keep: `agentsfleet.dev`, `github.com/agentsfleet/agentsfleet`, `@agentsfleet/*`, `~/Projects/agentsfleet`.
15
15
 
16
16
  MacBook. Languages: Python, Go, Rust, TypeScript, Zig. Tooling: `mise` first, `brew` fallback. Forges: `gh`/`glab`. Commit identity from `git config`, never here.
17
17
 
@@ -22,6 +22,10 @@ Dates: `MMM DD, YYYY: HH:MM AM/PM`. Filenames: `{MMM}_{DD}_{HH_MM}`.
22
22
  **Acronym expansion (durable artifacts AND human-facing communication):** spell out non-obvious acronyms / project codenames / vendor names on first mention in the same message — `Continuous Integration (CI)`, `Cross-Site Scripting (XSS)`, `Identifier (ID)`. Skip staples: `API`, `URL`, `HTTP`, `JSON`, `SQL`, `DNS`, `CSS`, `HTML`, `TCP`, `UDP`, `IP`, `OS`. Reuse bare after. Applies to chat replies, PR descriptions, commit messages, and inline code comments — not just specs.
23
23
 
24
24
  **Pre-send self-checks (invariant).** Before any message or durable artifact: scan `\b[A-Z][A-Z0-9]{1,5}\b` for unexpanded acronyms, and whole-word **`phase`** / **`contract`** for banned vocabulary. Skipping = `ACRONYM CHECK: SKIPPED per user override (reason: ...)` / `BANNED-VOCAB CHECK: SKIPPED per user override (reason: ...)`; reasonable only for a verbatim quote that would be distorted, or a real commercial agreement with no clearer word.
25
+
26
+ **Evidence invariant (pre-send).** Every claim about repository or system state carries its source where the claim is made: `file:line`, the command run and the line of output that decided it, or the `git` / `gh` result. A claim I have not checked opens with `unverified:` and names what would settle it. Numbers name the command that produced them. "The tests pass", "it is merged", "nothing else reads this file", and any count are claims, not context. Skipping = `EVIDENCE CHECK: SKIPPED per user override (reason: ...)`.
27
+
28
+ **Why it is an invariant, not a preference.** An unchecked claim reads exactly like a checked one. Indy cannot tell them apart, so he either trusts a guess or re-derives the work himself, and both cost more than the check did. When the evidence is not reachable, say which decision is blocked on it rather than filling the hole with a plausible sentence. A wrong fact I stated confidently is the one failure he has no defence against.
25
29
  <!-- oracle-packs:end -->
26
30
 
27
31
  ## Documentation voice
@@ -115,10 +115,36 @@ Cut these on sight. They read as machine prose and they hide the point.
115
115
  | Fake-profound kicker | a closing metaphor or mic-drop | End on the last concrete sentence. |
116
116
  | Summary recap | "In conclusion", "Overall" | Stop. The reader was just there. |
117
117
 
118
- Also banned, on top of DOC-05 and DOC-07: delve, foster, elevate, harness,
119
- supercharge, embark, ever-evolving, tapestry, realm, paradigm shift, game
120
- changer. Em dashes are not a rhythm crutch: none in short copy, at most two per
121
- long page, and only where they beat a comma or a period.
118
+ Also banned, on top of DOC-05 and DOC-07: delve, foster, elevate, supercharge,
119
+ embark, ever-evolving, tapestry, realm, paradigm shift, game changer, deep
120
+ dive, blazing fast, streamline, empower, journey, landscape, testament,
121
+ pivotal, notably, moreover, furthermore, myriad, plethora, aforementioned,
122
+ meticulous, boasts, cornerstone, best-in-class, industry-leading,
123
+ state-of-the-art, unparalleled, effortless, turnkey, battle-tested,
124
+ rock-solid, and innovative.
125
+
126
+ DOC-05 covers "utilize" as well as "utilise". The checker always enforced
127
+ both; this page named only one. A rule readers cannot read is a rule that
128
+ drifts.
129
+
130
+ "contract" and "phase" are banned too. That ban is not new here: the operating
131
+ model states it and names the replacements, so read it there rather than
132
+ twice. Use Prototype, Milestone, Workstream, Section, Dimension, and Batch for
133
+ the hierarchy, "stages" for lifecycle steps, and "rules" for what `AGENTS.md`
134
+ enforces. A real commercial agreement keeps "contract" only where no clearer
135
+ term exists.
136
+
137
+ "harness" is not banned. It is this product's own word for what orly installs,
138
+ and it reaches every consumer through the rendered `AGENTS.md`. A word the
139
+ product uses for itself is vocabulary, not slop.
140
+
141
+ Em dashes are not a rhythm crutch: none in short copy, at most two per long
142
+ page, and only where they beat a comma or a period. The rule corpus is exempt
143
+ from that budget — `dispatch/`, `core/`, `audits/`, `skills/`, `AGENTS.md`,
144
+ `AGENTS.orly.md`, `SOUL.md`, and any `RULES.md`. Those pages are dense
145
+ reference text where the dash separates a claim from its consequence. Measured
146
+ across the corpus the budget flagged 36 of 39 pages, which is a rule mis-fit,
147
+ not 36 defects. They keep every other rule.
122
148
 
123
149
  ## Content
124
150
 
@@ -9,12 +9,12 @@ regenerates this file and fails on any difference. To update it, run
9
9
  | `docs/LOGGING_STANDARD.md` | `LOG` → `logging.sh` | 10 | 13 | 26/26 | mechanical |
10
10
  | `docs/REST_API_DESIGN_GUIDELINES.md` | — | 0 | 0 | 0/74 | mechanical |
11
11
  | `docs/SCHEMA_CONVENTIONS.md` | — | 0 | 0 | 0/16 | mechanical |
12
- | `docs/DOCUMENTATION_RULES.md` | — | 0 | 0 | 0/21 | latent |
12
+ | `docs/DOCUMENTATION_RULES.md` | — | 0 | 0 | 0/22 | latent |
13
13
  | `docs/LIFECYCLE_PATTERNS.md` | — | 0 | 0 | 0/22 | mechanical |
14
14
  | `docs/CHANGELOG_VOICE.md` | — | 0 | 0 | 0/3 | latent |
15
15
  | `docs/VERIFY_TIERS.md` | — | 0 | 0 | 0/4 | uncited |
16
16
  | `docs/greptile-learnings/RULES.md` | — | 0 | 0 | 0/113 | mechanical |
17
- | **corpus** | | | | **26/279** | |
17
+ | **corpus** | | | | **26/280** | |
18
18
 
19
19
  ## How to read this
20
20
 
package/llms.txt ADDED
@@ -0,0 +1,223 @@
1
+ # orly — agent instructions
2
+
3
+ > You are an autonomous coding agent. This file is the authoritative setup and
4
+ > operating guide for orly. Read it in full before running any command.
5
+ > Do not infer behaviour from README.md; that page is written for humans.
6
+
7
+ orly installs two things into a repository: rules you must read before editing,
8
+ and gate scripts wired into git hooks that fail the commit when a rule was
9
+ ignored. Hosts supported: Claude Code, Codex, OpenCode, Amp.
10
+
11
+ Package: `@agentsfleet/orly` (npm)
12
+ Source: https://github.com/agentsfleet/orly
13
+ License: MIT
14
+
15
+ ---
16
+
17
+ ## 1. Preconditions
18
+
19
+ Verify all of these before acting. If a check fails, stop and report it to the
20
+ user rather than working around it.
21
+
22
+ | Check | Command | Required |
23
+ |---|---|---|
24
+ | bun present | `bun --version` | ≥ 1.4.0 |
25
+ | git present | `git --version` | any |
26
+ | inside a repository | `git rev-parse --show-toplevel` | must succeed |
27
+ | working tree clean | `git status --porcelain` | should be empty |
28
+
29
+ Do not install bun, git, or any package manager yourself unless the user asks.
30
+
31
+ ---
32
+
33
+ ## 2. Install sequence
34
+
35
+ Run from the repository root. Execute these in order and stop at the first
36
+ non-zero exit.
37
+
38
+ ```bash
39
+ # 1. preview — writes nothing
40
+ bunx @agentsfleet/orly init --dry-run
41
+
42
+ # 2. install
43
+ bunx @agentsfleet/orly init
44
+
45
+ # 3. confirm installed state matches what orly would write today
46
+ bunx @agentsfleet/orly doctor
47
+ ```
48
+
49
+ Then commit the result. Teammates receive the rules on clone.
50
+
51
+ IMPORTANT: git does not clone hooks. Each checkout must run `orly init` once.
52
+ If a human reports that gates are not firing, this is the first thing to check.
53
+
54
+ ---
55
+
56
+ ## 3. What the install writes
57
+
58
+ | Path | Contents | Owner |
59
+ |---|---|---|
60
+ | `AGENTS.md` | your host auto-loads this | the user — never rewrite it |
61
+ | `AGENTS.orly.md` | generated rules: safety, dispatch router, lifecycle | orly — rewritten on update |
62
+ | `dispatch/*.md` | one rule page per kind of work | orly |
63
+ | `audits/*.sh` | the deterministic gates | orly |
64
+ | `docs/*.md` | the standards those rules cite | orly |
65
+ | `.claude/skills/`, `.agents/skills/`, `.opencode/skills/` | skills materialised per host | orly |
66
+ | `.githooks/` | pre-commit and pre-push, wired to `orly gate` | orly |
67
+ | `.oracle/orly.json` | packs, gate commands, install record | shared — edit the commands |
68
+
69
+ `orly init` seeds `.oracle/orly.json` with gate commands found in `Makefile` or
70
+ `package.json`. If commands are missing, ask the user which ones to add. Do not
71
+ invent check commands.
72
+
73
+ ---
74
+
75
+ ## 4. Read order before you edit anything
76
+
77
+ 1. `AGENTS.md` — the user's own rules. **These win on any conflict.**
78
+ 2. `AGENTS.orly.md` — the generated rules and the dispatch router.
79
+ 3. The `dispatch/*.md` page that matches the kind of file you are about to edit.
80
+ 4. Any `docs/*.md` standard those pages cite.
81
+
82
+ Re-read step 3 for each new file kind you touch in the same task.
83
+
84
+ ---
85
+
86
+ ## 5. The task lifecycle
87
+
88
+ The spec is a file on disk. Its directory is the status. Only the named stages
89
+ move it. `orly gate pr` reads where it ended up.
90
+
91
+ ```
92
+ docs/v1/pending/ spec written, committed on main
93
+ │
94
+ │ CHORE(open) branch cut, baseline recorded, NO CODE until it commits
95
+ ▼
96
+ docs/v1/active/ PLAN → EXECUTE → CONFORM → VERIFY → REVIEW → DOCUMENT → COMMIT
97
+ │
98
+ │ CHORE(close) session notes, orphan sweep
99
+ ▼
100
+ docs/v1/done/ orly gate pr green → Pull Request opens
101
+ ```
102
+
103
+ Rules for you:
104
+
105
+ - Write the spec yourself before any code exists.
106
+ - Do not write code before `CHORE(open)` has committed.
107
+ - Do not skip a stage. The hooks run gates on every commit and push.
108
+ - A red gate returns you to EXECUTE. Fix the cause; do not retry unchanged.
109
+
110
+ ---
111
+
112
+ ## 6. Failure decision table
113
+
114
+ | Situation | Do this |
115
+ |---|---|
116
+ | `orly gate` fails a check | return to EXECUTE, fix the cause, re-run `orly gate` |
117
+ | same gate fails twice on the same cause | stop, report the gate name and output to the user |
118
+ | `orly init` refuses a file | orly did not write that file. Report it. Do **not** pass `--force` on your own initiative |
119
+ | hooks not firing | run `git config core.hooksPath` and confirm `orly init` was run in this checkout |
120
+ | gate command missing from `.oracle/orly.json` | ask the user for the command; do not invent one |
121
+ | `orly gate pr` red and the failure is genuinely inapplicable | ask the user; only they authorise `orly override` |
122
+ | gstack `/review` unavailable | continue; orly records the skipped review in the PR notes |
123
+
124
+ Overrides are recorded as an empty commit that rides into the Pull Request:
125
+
126
+ ```bash
127
+ bunx @agentsfleet/orly override <criterion> --reason "<why>"
128
+ ```
129
+
130
+ Never record an override without an explicit instruction from the user, and
131
+ never with a placeholder reason.
132
+
133
+ ---
134
+
135
+ ## 7. Hard rules
136
+
137
+ - Never rewrite `AGENTS.md`. orly adds one delimited pointer block; leave the
138
+ rest alone.
139
+ - Never edit or delete files under `.githooks/` or `audits/` to make a gate pass.
140
+ - Never pass `--force` or `--no-hooks` unless the user asks for it by name.
141
+ - Never disable a check in `.oracle/orly.json` to get green.
142
+ - When the user's `AGENTS.md` and orly's rules disagree, the user's file wins.
143
+ - A refused run changes nothing. Report the refusal; do not retry with flags.
144
+
145
+ ---
146
+
147
+ ## 8. Command reference
148
+
149
+ | Command | Effect |
150
+ |---|---|
151
+ | `orly init` | write rules, gates, skills, and hooks |
152
+ | `orly init --dry-run` | print what would be written; change nothing |
153
+ | `orly update` | re-materialise at a newer engine version |
154
+ | `orly update --with <pack>` | add an opt-in pack, recorded for every clone |
155
+ | `orly gate` | run declared checks in order, stopping at the first failure |
156
+ | `orly gate pr` | the Pull Request criteria check |
157
+ | `orly override <criterion> --reason <why>` | record a gate exception (user-authorised only) |
158
+ | `orly doctor` | diff installed state against what orly would write today |
159
+
160
+ ---
161
+
162
+ ## 9. Packs
163
+
164
+ Nine language packs are selected from file extensions in the user's source.
165
+ orly scans four directories deep and skips `node_modules`, `target`, `.venv`,
166
+ and other dependency trees.
167
+
168
+ `.zig` → `language.zig` · `.ts`/`.tsx` → `language.typescript` ·
169
+ `.js`/`.jsx` → `language.javascript` · `.rs` → `language.rust` ·
170
+ `.go` → `language.go` · `.py` → `language.python` · `.sh` → `language.shell` ·
171
+ `.mdx` → `language.mdx` · `.sql` → `domain.sql`
172
+
173
+ Seven install in every repository: `universal.authoring`, `domain.http`,
174
+ `domain.auth`, `domain.documentation`, `domain.changelog`,
175
+ `workflow.specifications`, `workflow.skills`.
176
+
177
+ Three install only when `.oracle/orly.json` names them: `workflow.governance`
178
+ (editing orly's own rules), `product.agentsfleet` (agentsfleet-specific audits
179
+ and docs), `persona.indy` (tone and address handles only, no files).
180
+
181
+ Skills provided by `workflow.skills`, per repository: `orly-spec-new`,
182
+ `orly-babysit-prs`, `orly-write-unit-test`, `orly-write-integration-test`.
183
+ General-purpose skills come from gstack, per agent host — orly neither installs
184
+ nor manages gstack.
185
+
186
+ ---
187
+
188
+ ## 10. Working on orly itself
189
+
190
+ Only relevant if the task is a change to this repository.
191
+
192
+ ```bash
193
+ git clone git@github.com:agentsfleet/orly.git && cd orly
194
+ git config core.hooksPath .githooks
195
+ bun install --frozen-lockfile
196
+ make audit
197
+ ```
198
+
199
+ - `make audit` is the bar: typecheck and unit tests, render determinism, and
200
+ gate fixtures (each gate proved against one passing and one failing case).
201
+ Runs in parallel, under half a minute.
202
+ - Coverage floor is 90% lines. Below it, the workflow fails.
203
+ - `make install-evals` runs real installs into throwaway repositories. Run on
204
+ demand; CI runs them on every pull request and release.
205
+ - Render orly's own rules with `bin/orly update --no-hooks`. The `--no-hooks`
206
+ flag is required here because this checkout hand-wrote its `.githooks/`.
207
+ - Release: merge to `main` with a new `package.json` version. That publishes,
208
+ tags, and cuts the GitHub release. No second command.
209
+
210
+ ---
211
+
212
+ ## 11. Self-check prompt
213
+
214
+ After install, verify your own understanding by answering this from the
215
+ repository, without guessing:
216
+
217
+ ```
218
+ Read AGENTS.orly.md. Name which of the last ten commits would have tripped a
219
+ gate, and the rule that caught each one.
220
+ ```
221
+
222
+ If you cannot answer it from the installed files, re-read section 4 before
223
+ continuing.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentsfleet/orly",
3
- "version": "0.5.4",
3
+ "version": "0.6.0",
4
4
  "description": "Repository-scoped engineering harness: renders agent rules, materialises the gates that enforce them, and proves the PR boundary — for any coding agent.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -51,6 +51,7 @@
51
51
  "src/",
52
52
  "registry.json",
53
53
  "AGENTS.md",
54
+ "llms.txt",
54
55
  "SOUL.md"
55
56
  ],
56
57
  "publishConfig": {
package/src/doc_rules.ts CHANGED
@@ -37,6 +37,21 @@ const MAX_PARAGRAPH_SENTENCES = 3;
37
37
  const SHORT_COPY_WORDS = 300;
38
38
  const LONG_PAGE_DASHES = 2;
39
39
  const EM_DASH = "—";
40
+ // The em-dash budget is calibrated for prose a first-day reader skims. The
41
+ // rule corpus is not that: dispatch pages, the operating model, and skill
42
+ // bodies are dense reference text where the dash separates a claim from its
43
+ // consequence, and a comma or a period there reads worse. Measured across the
44
+ // corpus the budget flagged 36 of 39 pages, which is a rule mis-fit rather
45
+ // than 36 defects. These pages keep every other rule.
46
+ const RULE_PAGE_DIRECTORIES = ["dispatch/", "core/", "audits/", "skills/"];
47
+ const RULE_PAGE_FILES = ["AGENTS.md", "AGENTS.orly.md", "SOUL.md", "RULES.md"];
48
+
49
+ function isRulePage(file: string): boolean {
50
+ const normalised = file.replaceAll("\\", "/");
51
+ if (RULE_PAGE_DIRECTORIES.some((directory) => normalised.includes(directory))) return true;
52
+ const name = normalised.slice(normalised.lastIndexOf("/") + 1);
53
+ return RULE_PAGE_FILES.includes(name);
54
+ }
40
55
  const README = "README.md";
41
56
  const CONFIG_RELATIVE_PATH = ".oracle/orly.json";
42
57
  const REGISTRY_FILE = "registry.json";
@@ -71,13 +86,29 @@ const BANNED_WORDS = new Set([
71
86
  "delve", "delves", "delved", "delving",
72
87
  "foster", "fosters", "fostered", "fostering",
73
88
  "elevate", "elevates", "elevated", "elevating",
74
- "harness", "harnesses", "harnessed", "harnessing",
75
89
  "supercharge", "supercharges", "supercharged", "supercharging",
76
90
  "embark", "embarks", "embarked", "embarking",
77
91
  "ever-evolving", "tapestry", "realm", "realms",
92
+ // SOUL.md's reply-shape list restated these and drifted from this one. The
93
+ // prose in DOCUMENTATION_RULES.md named only the British "utilise" while
94
+ // the American forms above were already enforced here.
95
+ "streamline", "streamlines", "streamlined", "streamlining",
96
+ "empower", "empowers", "empowered", "empowering",
97
+ "journey", "journeys", "landscape", "landscapes", "testament",
98
+ "pivotal", "notably", "moreover", "furthermore", "myriad", "plethora",
99
+ "aforementioned", "meticulous", "meticulously", "boasts", "cornerstone",
100
+ "best-in-class", "industry-leading", "state-of-the-art", "unparalleled",
101
+ "effortless", "effortlessly", "turnkey", "battle-tested", "rock-solid",
102
+ "innovative",
103
+ // core/operating-model.md already bans these two and names the
104
+ // replacements: Prototype/Milestone/Workstream/Section/Dimension/Batch for
105
+ // the hierarchy, "stages" for lifecycle steps, "rules" for what AGENTS.md
106
+ // enforces. The rule shipped to every consumer with nothing enforcing it.
107
+ "contract", "contracts", "contracted", "contracting",
108
+ "phase", "phases", "phased", "phasing",
78
109
  ]);
79
110
 
80
- const BANNED_PHRASES = ["paradigm shift", "game changer", "game-changer"];
111
+ const BANNED_PHRASES = ["paradigm shift", "game changer", "game-changer", "deep dive", "blazing fast", "blazingly fast"];
81
112
 
82
113
  // Forms that end in a period without ending a sentence.
83
114
  const ABBREVIATIONS = new Set(["e.g.", "i.e.", "etc.", "vs.", "cf.", "no.", "fig.", "approx."]);
@@ -273,6 +304,7 @@ class Reader {
273
304
  }
274
305
 
275
306
  private reportDashes(): void {
307
+ if (isRulePage(this.file)) return;
276
308
  const short = this.proseWords < SHORT_COPY_WORDS;
277
309
  const budget = short ? 0 : LONG_PAGE_DASHES;
278
310
  if (this.dashes <= budget) return;