agentboot 0.1.0 → 0.2.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.
Files changed (66) hide show
  1. package/README.md +8 -7
  2. package/agentboot.config.json +4 -1
  3. package/package.json +2 -2
  4. package/scripts/cli.ts +42 -14
  5. package/scripts/compile.ts +30 -7
  6. package/scripts/dev-sync.ts +1 -1
  7. package/scripts/lib/config.ts +17 -1
  8. package/scripts/validate.ts +12 -7
  9. package/.github/ISSUE_TEMPLATE/persona-request.md +0 -62
  10. package/.github/ISSUE_TEMPLATE/quality-feedback.md +0 -67
  11. package/.github/workflows/cla.yml +0 -25
  12. package/.github/workflows/validate.yml +0 -49
  13. package/.idea/agentboot.iml +0 -9
  14. package/.idea/misc.xml +0 -6
  15. package/.idea/modules.xml +0 -8
  16. package/.idea/vcs.xml +0 -6
  17. package/CLAUDE.md +0 -230
  18. package/CONTRIBUTING.md +0 -168
  19. package/PERSONAS.md +0 -156
  20. package/core/instructions/baseline.instructions.md +0 -133
  21. package/core/instructions/security.instructions.md +0 -186
  22. package/core/personas/code-reviewer/SKILL.md +0 -175
  23. package/core/personas/security-reviewer/SKILL.md +0 -233
  24. package/core/personas/test-data-expert/SKILL.md +0 -234
  25. package/core/personas/test-generator/SKILL.md +0 -262
  26. package/core/traits/audit-trail.md +0 -182
  27. package/core/traits/confidence-signaling.md +0 -172
  28. package/core/traits/critical-thinking.md +0 -129
  29. package/core/traits/schema-awareness.md +0 -132
  30. package/core/traits/source-citation.md +0 -174
  31. package/core/traits/structured-output.md +0 -199
  32. package/docs/ci-cd-automation.md +0 -548
  33. package/docs/claude-code-reference/README.md +0 -21
  34. package/docs/claude-code-reference/agentboot-coverage.md +0 -484
  35. package/docs/claude-code-reference/feature-inventory.md +0 -906
  36. package/docs/cli-commands-audit.md +0 -112
  37. package/docs/cli-design.md +0 -924
  38. package/docs/concepts.md +0 -1117
  39. package/docs/config-schema-audit.md +0 -121
  40. package/docs/configuration.md +0 -645
  41. package/docs/delivery-methods.md +0 -758
  42. package/docs/developer-onboarding.md +0 -342
  43. package/docs/extending.md +0 -448
  44. package/docs/getting-started.md +0 -298
  45. package/docs/knowledge-layer.md +0 -464
  46. package/docs/marketplace.md +0 -822
  47. package/docs/org-connection.md +0 -570
  48. package/docs/plans/architecture.md +0 -2429
  49. package/docs/plans/design.md +0 -2018
  50. package/docs/plans/prd.md +0 -1862
  51. package/docs/plans/stack-rank.md +0 -261
  52. package/docs/plans/technical-spec.md +0 -2755
  53. package/docs/privacy-and-safety.md +0 -807
  54. package/docs/prompt-optimization.md +0 -1071
  55. package/docs/test-plan.md +0 -972
  56. package/docs/third-party-ecosystem.md +0 -496
  57. package/domains/compliance-template/README.md +0 -173
  58. package/domains/compliance-template/traits/compliance-aware.md +0 -228
  59. package/examples/enterprise/agentboot.config.json +0 -184
  60. package/examples/minimal/agentboot.config.json +0 -46
  61. package/tests/REGRESSION-PLAN.md +0 -705
  62. package/tests/TEST-PLAN.md +0 -111
  63. package/tests/cli.test.ts +0 -705
  64. package/tests/pipeline.test.ts +0 -608
  65. package/tests/validate.test.ts +0 -278
  66. package/tsconfig.json +0 -62
package/docs/concepts.md DELETED
@@ -1,1117 +0,0 @@
1
- # AgentBoot Concepts
2
-
3
- This document explains the conceptual foundation of AgentBoot. Read this before reading
4
- the configuration reference or the getting-started guide. The concepts here inform every
5
- design decision in the system.
6
-
7
- ---
8
-
9
- ## What is a trait
10
-
11
- A trait is a reusable behavioral building block for an AI persona. It captures a single
12
- aspect of how an agent should think or communicate — a cognitive stance, an output
13
- discipline, or an epistemic commitment.
14
-
15
- The analogy from software engineering is the DRY principle applied to AI behavior. Before
16
- traits, every persona had to independently specify its approach to things like skepticism,
17
- output structure, and evidence requirements. In practice, this meant the same concepts
18
- were expressed slightly differently in every persona — sometimes well, sometimes poorly,
19
- always inconsistently. When you wanted to improve how all your personas handle uncertainty,
20
- you had to touch every file.
21
-
22
- Traits solve this. You write `critical-thinking` once. Every persona that needs skeptical
23
- review simply composes it with a weight. Improve the trait definition, and all composing
24
- personas improve automatically.
25
-
26
- A trait is not:
27
- - A checklist of domain rules. "Verify that GDPR consent is captured" is not a trait;
28
- it is a domain-specific requirement that belongs in a domain layer.
29
- - A persona. A persona has identity, purpose, and scope. A trait has neither — it only
30
- modulates behavior.
31
- - A prompt template. Traits are building blocks, not invocation patterns.
32
-
33
- The trait files in `core/traits/` are the authoritative definitions. Each one defines
34
- the behavior at each applicable configuration level (HIGH / MEDIUM / LOW, or whatever
35
- axes of variation the trait exposes), the anti-patterns to avoid, and the interaction
36
- effects with other traits.
37
-
38
- ---
39
-
40
- ## What is a persona
41
-
42
- A persona is a complete, deployable agent: a composition of traits plus a specialized
43
- system prompt that defines the agent's identity, operating context, and mandate.
44
-
45
- AgentBoot uses the [agentskills.io](https://agentskills.io) SKILL.md format for persona
46
- files. This means every persona is a Markdown file with YAML frontmatter that specifies
47
- its ID, version, traits, scope, and output format — followed by the system prompt in
48
- prose. The frontmatter is machine-readable (the build and sync tooling uses it); the
49
- prose is human-readable and is what the model receives.
50
-
51
- The frontmatter trait block is where trait composition happens:
52
-
53
- ```yaml
54
- traits:
55
- critical-thinking: HIGH
56
- structured-output: true
57
- source-citation: true
58
- confidence-signaling: true
59
- ```
60
-
61
- Each trait listed here is resolved from the trait definitions at build time and woven
62
- into the persona's effective system prompt. This means the persona author writes what
63
- makes their persona unique — the domain knowledge, the operating context, the mandate —
64
- and inherits the generic behavioral discipline from the trait definitions.
65
-
66
- A persona is not:
67
- - A chat conversation. Personas are always-on agents that operate within a defined scope,
68
- not one-off system prompts.
69
- - An extension of another persona. Personas compose traits; they do not inherit from
70
- each other.
71
- - A configuration file. The SKILL.md prose is the primary artifact. The frontmatter
72
- is metadata, not the definition.
73
-
74
- ---
75
-
76
- ## The scope hierarchy
77
-
78
- AgentBoot models your organization as a four-level hierarchy:
79
-
80
- ```
81
- org
82
- └── group
83
- └── team
84
- └── repo
85
- ```
86
-
87
- This mirrors the way real organizations are actually structured — and the way
88
- responsibility and governance work in them.
89
-
90
- **Org level** is where universal rules live. Code review standards that apply to every
91
- engineer, security guardrails that the CISO requires on all codebases, output discipline
92
- that the organization wants from every AI interaction. Org-level configuration is always
93
- active in every repo that is registered with the org.
94
-
95
- **Group level** is for horizontal concerns that cross teams but do not apply to the whole
96
- org. A platform engineering group might deploy additional infrastructure review personas
97
- to all platform teams. A product group might add user-facing copy review personas that
98
- the platform group doesn't need.
99
-
100
- **Team level** is where team-specific customization happens. A team that works in a
101
- specific framework, owns a specific kind of system, or has team-level standards that
102
- differ from the group default can add configuration at this level. Team-level
103
- configuration layers on top of group and org, never replacing it.
104
-
105
- **Repo level** is where path-scoped instructions live. Repos can add instructions that
106
- activate only when specific file types or directories are touched. A Lambda functions
107
- directory might activate additional serverless-specific review guidance. A database
108
- migrations directory might activate schema review guardrails.
109
-
110
- **Precedence:** More specific scopes win on optional behaviors; more general scopes win
111
- on mandatory behaviors. Rules (always-on instructions) are mandatory by nature — they
112
- cannot be disabled at lower scopes. Personas and traits are optional — lower scopes
113
- can adjust weights, add personas, or set trait weights to zero. To make a specific
114
- behavior mandatory, encode it as a rule rather than marking a persona as required.
115
-
116
- This hierarchy matters for two reasons. First, it ensures that governance propagates
117
- downward automatically — a new team that registers with the org immediately gets all
118
- org-level and group-level configuration without any manual setup. Second, it preserves
119
- team autonomy on things that are genuinely team-specific.
120
-
121
- ---
122
-
123
- ## Claude Code-native output
124
-
125
- AgentBoot's cross-platform output (SKILL.md + CLAUDE.md + copilot-instructions.md) works
126
- everywhere but leaves significant Claude Code capabilities on the table. When the target
127
- is Claude Code, AgentBoot should generate a **Claude Code-native output** that uses the
128
- platform's full feature surface.
129
-
130
- ### What Claude Code reads natively (no build step required)
131
-
132
- ```
133
- .claude/
134
- ├── CLAUDE.md # Project instructions (supports @imports)
135
- ├── settings.json # Hooks, permissions, env vars
136
- ├── settings.local.json # Local overrides (gitignored)
137
- ├── agents/
138
- │ └── {name}/CLAUDE.md # Custom subagents (not SKILL.md)
139
- ├── skills/
140
- │ └── {name}/SKILL.md # Invocable skills (agentskills.io format)
141
- ├── rules/
142
- │ └── {topic}.md # Path-scoped rules (paths: frontmatter)
143
- └── .mcp.json # MCP server configuration
144
- ```
145
-
146
- ### @import: the key Claude Code feature AgentBoot must use
147
-
148
- Claude Code's CLAUDE.md supports `@path/to/file` imports that expand inline at load
149
- time. This changes the compilation model fundamentally:
150
-
151
- **Cross-platform output (current):** Traits are inlined into SKILL.md at build time.
152
- Each compiled persona is a standalone file with all trait content baked in. This is
153
- necessary for platforms that don't support file inclusion.
154
-
155
- **Claude Code-native output (new):** Traits stay as separate files. The generated
156
- CLAUDE.md uses `@imports` to compose them at load time:
157
-
158
- ```markdown
159
- # Code Reviewer
160
-
161
- @.claude/traits/critical-thinking.md
162
- @.claude/traits/structured-output.md
163
- @.claude/traits/source-citation.md
164
-
165
- You are a code reviewer. Your job is to find bugs, quality issues...
166
- ```
167
-
168
- This has three advantages over inlined output:
169
- 1. **Maintainability** — traits are maintained in one place. Updates propagate to all
170
- composing personas automatically without rebuilding.
171
- 2. **Live editing** — changing a trait file takes effect immediately without rebuilding.
172
- 3. **Transparency** — developers can read each trait file independently instead of
173
- wading through a monolithic system prompt.
174
-
175
- The build system generates **one self-contained folder per platform** under `dist/`.
176
- Each platform folder (e.g., `dist/claude/`, `dist/copilot/`, `dist/cursor/`, `dist/skill/`,
177
- `dist/gemini/`) contains everything needed for that platform and nothing it doesn't.
178
- The Claude Code folder uses @import-based files; the skill folder uses inlined SKILL.md
179
- for cross-platform distribution.
180
-
181
- ### Agent frontmatter: much richer than SKILL.md
182
-
183
- Claude Code's `.claude/agents/{name}/CLAUDE.md` supports frontmatter fields that the
184
- generic SKILL.md format does not:
185
-
186
- ```yaml
187
- ---
188
- name: review-security
189
- description: Deep security review — OWASP, auth, data handling, PHI
190
- model: opus # Per-agent model selection
191
- permissionMode: default # default | acceptEdits | bypassPermissions
192
- maxTurns: 25 # Agentic turn limit
193
- disallowedTools: Edit, Write, Agent # Tool restrictions (read-only reviewer)
194
- tools: Read, Grep, Glob, Bash # Tool allowlist (alternative to denylist)
195
- skills: # Preload these skills into agent context
196
- - hipaa-check
197
- - review-security
198
- mcpServers: # Scoped MCP servers
199
- - compliance-kb
200
- hooks: # Agent-specific hooks
201
- PreToolUse:
202
- - matcher: "Bash"
203
- hooks:
204
- - type: command
205
- command: "./hooks/validate-no-phi.sh"
206
- memory: project # Persistent memory scope
207
- isolation: worktree # Git worktree isolation
208
- ---
209
- ```
210
-
211
- AgentBoot's `persona.config.json` should map to these fields. The compile step should
212
- generate Claude Code agent CLAUDE.md files with the full native frontmatter — not just
213
- the subset that agentskills.io supports.
214
-
215
- ### Rules use `paths:`, not `globs:`
216
-
217
- Claude Code's `.claude/rules/` files use `paths:` in frontmatter (not `globs:`). The
218
- An earlier implementation used `globs:` which was valid at the time but the
219
- current Claude Code documentation specifies `paths:`:
220
-
221
- ```yaml
222
- ---
223
- paths:
224
- - "src/api/**/*.ts"
225
- - "**/*.sql"
226
- - "**/migrations/**"
227
- ---
228
- ```
229
-
230
- AgentBoot's gotchas rules and path-scoped instructions should generate `paths:`
231
- frontmatter for Claude Code output and `globs:` where other platforms expect it.
232
-
233
- ### Hooks belong in settings.json
234
-
235
- Claude Code hooks are configured in `.claude/settings.json`, not in standalone files.
236
- AgentBoot's compliance hooks should generate settings.json entries:
237
-
238
- ```json
239
- {
240
- "hooks": {
241
- "UserPromptSubmit": [
242
- {
243
- "matcher": "",
244
- "hooks": [
245
- {
246
- "type": "command",
247
- "command": ".claude/hooks/phi-input-scan.sh",
248
- "timeout": 5000
249
- }
250
- ]
251
- }
252
- ],
253
- "Stop": [
254
- {
255
- "matcher": "",
256
- "hooks": [
257
- {
258
- "type": "command",
259
- "command": ".claude/hooks/phi-output-scan.sh"
260
- }
261
- ]
262
- }
263
- ]
264
- }
265
- }
266
- ```
267
-
268
- The available hook events cover the full agent lifecycle: `SessionStart`,
269
- `PreToolUse`, `PostToolUse`, `UserPromptSubmit`, `Stop`, `SubagentStart`,
270
- `SubagentStop`, `Notification`, and more. AgentBoot should generate hook
271
- configurations for compliance, audit logging, and guardrail enforcement as part
272
- of the sync output.
273
-
274
- ### Managed settings = HARD guardrails
275
-
276
- Claude Code's managed settings (`/Library/Application Support/ClaudeCode/` on macOS,
277
- `/etc/claude-code/` on Linux) are deployed by MDM and **cannot be overridden by any
278
- user or project setting**. This is the native mechanism for HARD guardrails:
279
-
280
- ```
281
- /Library/Application Support/ClaudeCode/
282
- ├── managed-settings.json # Non-overridable settings + hooks
283
- ├── managed-mcp.json # Non-overridable MCP servers
284
- └── CLAUDE.md # Non-overridable instructions
285
- ```
286
-
287
- AgentBoot should generate managed settings artifacts for organizations that deploy
288
- via MDM. These map directly to the HARD guardrail tier — PHI scanning hooks,
289
- credential blocking, audit logging that no developer can disable.
290
-
291
- ### MCP configuration in .mcp.json
292
-
293
- When personas need external tool access (knowledge bases, data detection, domain
294
- lookup), AgentBoot should generate `.mcp.json` entries:
295
-
296
- ```json
297
- {
298
- "mcpServers": {
299
- "compliance-kb": {
300
- "type": "stdio",
301
- "command": "npx",
302
- "args": ["-y", "@my-org/compliance-kb-server"]
303
- }
304
- }
305
- }
306
- ```
307
-
308
- This is synced to target repos alongside the persona files. Agents that reference
309
- MCP servers in their frontmatter (`mcpServers: [compliance-kb]`) will automatically
310
- have access.
311
-
312
- ### Skills with context forking
313
-
314
- Claude Code skills support `context: fork` which delegates the skill to a subagent
315
- with an isolated context. This is the native mechanism for reviewer isolation — the
316
- reviewer doesn't see the generation conversation:
317
-
318
- ```yaml
319
- ---
320
- name: review-code
321
- description: Code review against team standards
322
- context: fork
323
- agent: code-reviewer
324
- allowed-tools: Read, Grep, Glob, Bash
325
- ---
326
- ```
327
-
328
- AgentBoot's review personas should use this pattern for Claude Code output. The skill
329
- is the invocation surface (`/review-code`), and it forks to the agent, which runs in
330
- isolation with its own tools and permissions.
331
-
332
- ### Summary: per-platform compilation targets
333
-
334
- AgentBoot's compile step produces one self-contained folder per platform under `dist/`.
335
- Each folder has everything needed for that platform, nothing it doesn't. Scope hierarchy
336
- (core → groups → teams) is preserved within each platform folder. Duplication across
337
- platforms is intentional — generated files are cattle not pets. Diffing across platforms
338
- (e.g., `diff dist/claude/ dist/copilot/`) shows exactly what's different between
339
- distributions.
340
-
341
- ```
342
- dist/
343
- ├── claude/ # Self-contained Claude Code distribution
344
- │ ├── core/
345
- │ │ ├── agents/code-reviewer.md
346
- │ │ ├── skills/review-code.md
347
- │ │ ├── traits/critical-thinking.md
348
- │ │ ├── rules/baseline.md
349
- │ │ ├── CLAUDE.md (with @imports)
350
- │ │ └── settings.json (hooks)
351
- │ ├── groups/{group}/
352
- │ └── teams/{group}/{team}/
353
-
354
- ├── copilot/ # Self-contained Copilot distribution
355
- │ ├── core/
356
- │ │ ├── .github/copilot-instructions.md
357
- │ │ └── .github/prompts/review-code.md
358
- │ ├── groups/...
359
- │ └── teams/...
360
-
361
- ├── cursor/ # Self-contained Cursor distribution
362
- │ ├── core/
363
- │ │ └── .cursor/rules/*.md
364
- │ ├── groups/...
365
- │ └── teams/...
366
-
367
- ├── skill/ # Cross-platform SKILL.md (agentskills.io)
368
- │ ├── core/
369
- │ │ ├── code-reviewer/SKILL.md (traits inlined)
370
- │ │ └── PERSONAS.md
371
- │ ├── groups/...
372
- │ └── teams/...
373
-
374
- └── gemini/ # Self-contained Gemini CLI distribution
375
- ├── core/
376
- │ └── GEMINI.md
377
- ├── groups/...
378
- └── teams/...
379
- ```
380
-
381
- The sync engine reads from `dist/{platform}/` and writes to target repos in
382
- platform-native locations. Organizations choose which platform to deploy per repo
383
- based on their agent toolchain.
384
-
385
- ---
386
-
387
- ## Prompts as code
388
-
389
- AgentBoot treats AI agent behavior as infrastructure: defined in files, stored in version
390
- control, reviewed in pull requests, with a complete audit history.
391
-
392
- This is the same shift that happened with Infrastructure as Code (Terraform, Pulumi) and
393
- Configuration as Code (Kubernetes manifests, GitHub Actions workflows). Before IaC, every
394
- environment was a snowflake — you could not reproduce it, you could not review changes to
395
- it, and you could not trace the history of decisions. After IaC, every change is a commit.
396
-
397
- Prompts as Code applies the same discipline to AI behavior. Before it, every team's
398
- CLAUDE.md was written in isolation, improved informally, and never reviewed. When
399
- something went wrong with an agent, there was no diff to examine. When best practice
400
- evolved, there was no way to propagate the update.
401
-
402
- With AgentBoot:
403
- - Every change to an agent's behavior is a pull request with a description and a review.
404
- - Traits and personas have version numbers. You can pin a repo to `critical-thinking@1.2`
405
- and upgrade deliberately.
406
- - The sync pipeline means the update propagates to all registered repos automatically
407
- after the PR merges.
408
- - The `PERSONAS.md` registry is generated from the source files — it is always accurate
409
- because it cannot drift from the actual definitions.
410
-
411
- This is not bureaucracy for its own sake. It is the mechanism by which a small team can
412
- govern AI agent behavior across dozens or hundreds of repos without heroic manual effort.
413
-
414
- ---
415
-
416
- ## The distribution model
417
-
418
- AgentBoot follows a hub-and-spoke distribution model:
419
-
420
- ```
421
- github.com/acme/personas (hub)
422
- └── agentboot build && agentboot sync
423
- ├── repo-A/.claude/
424
- ├── repo-B/.claude/
425
- └── repo-N/.claude/
426
- ```
427
-
428
- ### Personas hub naming convention
429
-
430
- The hub repo is the org's single source of truth for all agentic personas, traits,
431
- and instructions. The recommended naming convention:
432
-
433
- | Priority | Name | When to use |
434
- |---|---|---|
435
- | Default | `personas` | Use this. The GitHub org already namespaces it (`github.com/acme/personas`). |
436
- | Fallback | `agent-personas` | If `personas` is already taken (e.g., marketing/UX personas). |
437
-
438
- Avoid redundant prefixes — `github.com/acme/acme-personas` repeats the org name.
439
- Avoid tool-specific names — `acme-agentboot` implies a fork of the build tool.
440
- Use short names or abbreviations — "ACME Technologies LLC" is just `acme`.
441
-
442
- The `agentboot setup` wizard checks for existing `personas` repos and suggests
443
- `agent-personas` as the fallback when there's a collision.
444
-
445
- ### Hub contents
446
-
447
- The hub is a single private repository that your organization owns, created from the
448
- AgentBoot template. It contains:
449
- - Your `agentboot.config.json`
450
- - Any org-specific persona extensions (traits, gotchas, instructions)
451
- - `repos.json` listing the spoke repos that receive compiled output
452
-
453
- The spoke repos are your actual codebases. They receive compiled persona files, always-on
454
- instruction fragments, and path-scoped instructions via the sync script. They do not
455
- contain the source of truth — only the compiled output. If a team wants to understand why
456
- an agent behaves a certain way, they look at the hub, not their own repo.
457
-
458
- The build step (`npm run build`) resolves all trait compositions, validates frontmatter,
459
- generates `PERSONAS.md`, and produces the compiled output. The sync step (`npm run sync`)
460
- pushes the compiled output to each registered repo and opens a PR. Human review of that
461
- PR is the governance checkpoint.
462
-
463
- This model has a deliberate property: the spokes are passive. They receive governance;
464
- they do not produce it. Teams can add repo-level extensions through the hub's team
465
- configuration — they do not commit persona files directly to their own repos. This
466
- prevents drift and keeps the hub authoritative.
467
-
468
- ### Public repo pattern
469
-
470
- For private repos, sync creates a PR and the compiled `.claude/` content is committed
471
- normally. But for **public repos**, committing org-specific personas would leak private
472
- content (org traits, internal gotchas, compliance rules) into a public repository.
473
-
474
- The public repo pattern solves this:
475
-
476
- 1. **Compiled output is gitignored** in the public repo (`.claude/` in `.gitignore`)
477
- 2. **Repo-specific enrichments live in the hub**, not in the target repo, under a
478
- `public-repos/{repo}/` directory
479
- 3. **Sync still writes locally** — developers get the files, they just aren't committed
480
- 4. **New developers run `agentboot connect`** to pull content from the hub on first clone
481
-
482
- The prompts-as-code invariant holds: all content is in version control, reviewed, and
483
- audited — it's just in the hub's private git instead of the spoke's public git.
484
-
485
- **Hub structure with public repos:**
486
- ```
487
- acme/personas/
488
- ├── core/ # org-wide (all repos)
489
- ├── groups/
490
- ├── teams/
491
- ├── public-repos/ # only if org has public repos
492
- │ ├── agentboot/
493
- │ │ ├── rules/no-runtime.md
494
- │ │ └── gotchas/jsonc-parser.md
495
- │ └── oss-library/
496
- │ └── gotchas/wasm-compat.md
497
- ├── agentboot.config.json
498
- └── repos.json
499
- ```
500
-
501
- **Scope merge order with public repos:**
502
- `core/` → `groups/{g}/` → `teams/{g}/{t}/` → `public-repos/{repo}/`
503
-
504
- The `public-repos/` scope is the most specific — it wins on filename conflict.
505
-
506
- **Developer experience is identical.** A developer inside a public repo runs the same
507
- commands as in a private repo:
508
-
509
- ```bash
510
- agentboot add gotcha "JSONC parser doesn't handle block comments"
511
- ```
512
-
513
- AgentBoot detects the repo is public (from `repos.json` or git remote), confirms the
514
- hub is available and writable, and routes the content to `public-repos/{repo}/` in the
515
- hub. The developer never changes directories or thinks about where the file goes.
516
-
517
- **If the hub is not available or not writable, the command errors:**
518
- ```
519
- ERROR: Hub repo not found or not writable. Your gotcha cannot be persisted.
520
- Run `agentboot connect` to link your hub, or check permissions.
521
- ```
522
-
523
- This is a hard error, not a warning. Content never falls through to the public repo's
524
- git. There is no "write it anyway" option.
525
-
526
- **repos.json marks public repos explicitly:**
527
- ```json
528
- [
529
- { "path": "../api", "label": "API", "platform": "claude" },
530
- { "path": "../agentboot", "label": "AgentBoot", "platform": "claude", "public": true }
531
- ]
532
- ```
533
-
534
- ---
535
-
536
- ## The trait weight system
537
-
538
- Several core traits — `critical-thinking` is the primary example — expose a weight axis:
539
- `HIGH`, `MEDIUM`, and `LOW`. This is not a priority system; it is a calibration system.
540
-
541
- The same underlying logic applies at every weight. At HIGH, the threshold for surfacing
542
- a concern is very low — the persona speaks up about anything it notices. At LOW, the
543
- threshold is high — the persona surfaces only things that clearly matter. MEDIUM is the
544
- calibrated default for ordinary review.
545
-
546
- Why not just write separate personas for "strict" and "lenient" review? Because the
547
- behavioral logic is identical; only the threshold differs. Separate personas would
548
- duplicate that logic and diverge over time. The weight system keeps the logic in one
549
- place (the trait definition) while letting persona authors calibrate the stance.
550
-
551
- In practice: security reviewers use `critical-thinking: HIGH` because the cost of missing
552
- a vulnerability is high. A documentation reviewer might use `critical-thinking: MEDIUM`
553
- because it needs to flag genuine problems without making authors feel attacked by minor
554
- nit feedback. A first-pass code review persona for learning environments might use
555
- `critical-thinking: LOW` to reduce noise and keep the feedback focused.
556
-
557
- The weight does not override the severity floor. At any weight, CRITICAL findings must
558
- always surface. `critical-thinking: LOW` reduces noise; it does not create blind spots.
559
-
560
- ---
561
-
562
- ## Gotchas rules
563
-
564
- A gotchas rule is a path-scoped instruction that encodes hard-won operational knowledge —
565
- the kind of information that lives in one engineer's head until they leave and the team
566
- rediscovers it the hard way. Every organization has these. AgentBoot makes them a
567
- first-class concept.
568
-
569
- A gotchas file is a Markdown file with `paths:` frontmatter that limits when the rule
570
- activates. When a developer is working on a file that matches the glob pattern, the
571
- gotchas content is automatically included in the agent's context. When working on
572
- unrelated files, the gotchas are invisible — zero context cost.
573
-
574
- ```markdown
575
- ---
576
- paths:
577
- - "db/**"
578
- - "**/*.sql"
579
- - "**/migrations/**"
580
- description: "PostgreSQL and RDS gotchas"
581
- ---
582
-
583
- # PostgreSQL / RDS Gotchas
584
-
585
- - **Partitions do NOT inherit `relrowsecurity`.** Enable RLS explicitly on each
586
- partition.
587
- - **Always verify `relrowsecurity` is ON, not just that policies exist.** Policies
588
- without enforcement = no protection.
589
- - **UUID PK causes exponential INSERT slowdown.** Drop ALL indexes before bulk load,
590
- recreate after.
591
- ```
592
-
593
- Gotchas rules belong in your domain layer or in team-level extensions — they are
594
- organization-specific by nature. AgentBoot core does not ship gotchas because they are
595
- inherently tied to your stack and your production incidents.
596
-
597
- The pattern is powerful because it captures knowledge at the exact moment it is needed.
598
- A developer writing a database migration sees the PostgreSQL gotchas. A developer
599
- writing a Lambda handler sees the serverless gotchas. No one has to remember to consult
600
- a wiki page or ask the right person.
601
-
602
- ---
603
-
604
- ## Compliance hooks
605
-
606
- AgentBoot supports a defense-in-depth model for compliance enforcement, using the hook
607
- system provided by the target agent platform.
608
-
609
- The model has three layers, in decreasing order of enforcement strength:
610
-
611
- 1. **Input hook (deterministic):** A pre-prompt hook that scans user input before the
612
- model sees it. If the hook detects a violation (PHI, credentials, internal URLs),
613
- it blocks the request with a non-zero exit code. This is the strongest available
614
- technical control.
615
-
616
- 2. **Instruction-based refusal (advisory):** An always-on instruction fragment that
617
- tells the model to refuse to process sensitive content. This is prompt-level, not
618
- deterministic — the model may not recognize all violations. But it is active in
619
- every interaction and costs nothing when not triggered.
620
-
621
- 3. **Output hook (advisory):** A post-response hook that scans the model's output for
622
- compliance violations. This layer can log and warn but **cannot block** — in Claude
623
- Code, the Stop hook fires after the response has already rendered to the developer.
624
- This is an architectural constraint, not a bug. Document it honestly.
625
-
626
- The three layers are complementary. The input hook catches what it can deterministically.
627
- The instruction catches what the model can recognize. The output hook provides audit
628
- evidence and catches leakage that the instruction missed. No single layer is sufficient
629
- alone.
630
-
631
- AgentBoot generalizes this from healthcare PHI to any sensitive data pattern — PII,
632
- credentials, internal API keys, production URLs, customer data. The hook templates are
633
- configurable per organization through the domain layer.
634
-
635
- **Honest limitation:** Not all agent platforms support hooks. Claude Code has full
636
- hook support (PreToolUse, PostToolUse, Stop). GitHub Copilot CLI has limited pre-prompt
637
- hooks. IDE-based agents generally have no hook mechanism. AgentBoot documents these gaps
638
- per platform rather than promising universal enforcement.
639
-
640
- ---
641
-
642
- ## ADR governance
643
-
644
- When a persona flags something, and the developer intentionally chose to do it
645
- differently, the organization needs a mechanism to say "this is an approved exception."
646
- Without this, every guardrail violation becomes a battle, and engineers start ignoring
647
- review findings.
648
-
649
- AgentBoot supports Architecture Decision Records (ADRs) as the exception governance
650
- mechanism. The lifecycle is:
651
-
652
- 1. **Review** — a persona flags a finding during review
653
- 2. **Propose** — the developer uses `/create-adr` or `/propose-exception` to draft a
654
- formal exception with rationale
655
- 3. **Approve** — a designated reviewer (CODEOWNERS, tech lead) reviews the exception
656
- PR and approves or rejects it
657
- 4. **Commit** — the approved exception becomes a permanent record in the ADR index,
658
- and the persona learns to accept the deviation for that specific case
659
-
660
- ADRs live in the personas repo (not the target repo) because they are governance
661
- artifacts, not code artifacts. They are tracked in an `adrs/index.json` that the
662
- build system can reference.
663
-
664
- This is complementary to the temporary elevation pattern (where a developer needs a
665
- one-time bypass for debugging). ADRs handle *permanent, approved deviations*. Temporary
666
- elevation handles *emergency access with audit trail and auto-expiry*. A mature
667
- governance system needs both.
668
-
669
- ---
670
-
671
- ## Numeric trait weights
672
-
673
- The HIGH / MEDIUM / LOW weight system described earlier is the simplified interface.
674
- Under the hood, traits that support calibration use a numeric 0.0–1.0 scale that maps
675
- to finer-grained behavior:
676
-
677
- | Numeric | Named | Typical Use |
678
- |---------|-------|-------------|
679
- | 0.0 | OFF | Trait inactive |
680
- | 0.3 | LOW | Light review — trust the author, flag only clear defects |
681
- | 0.5 | MEDIUM | Standard — question choices, verify claims |
682
- | 0.7 | HIGH | Thorough — actively look for hidden issues |
683
- | 1.0 | MAX | Adversarial — assume hostile input, verify everything |
684
-
685
- In `persona.config.json`, you can use either form:
686
-
687
- ```json
688
- {
689
- "traits": {
690
- "critical-thinking": "HIGH",
691
- "creative-suggestion": 0.3
692
- }
693
- }
694
- ```
695
-
696
- The build system resolves named weights to their numeric equivalents. The persona's
697
- compiled SKILL.md receives the calibration instructions appropriate for its weight.
698
-
699
- The `creative-suggestion` trait is the counterpart to `critical-thinking`. Where
700
- critical thinking is the tear-down dial (skepticism), creative suggestion is the
701
- build-up dial (proactive improvement suggestions). Security reviewers typically use
702
- high critical thinking and low creative suggestion. Code reviewers use moderate
703
- levels of both.
704
-
705
- ---
706
-
707
- ## Self-improvement reflections
708
-
709
- Personas can optionally write a brief reflection after completing their task. The
710
- reflection is saved to `.claude/reflections/{persona-name}/{timestamp}.md` and captures:
711
- what the persona was asked to do, what it found, what it was uncertain about, and what
712
- it would do differently next time.
713
-
714
- Over time, these reflections accumulate into a dataset that reveals patterns: which
715
- findings are most common, which areas have the most uncertainty, which personas are
716
- invoked most frequently. A `/review-reflections` skill can summarize these patterns
717
- for human review — identifying trait calibration opportunities, missing rules, or
718
- personas that need additional training data.
719
-
720
- The self-improvement loop progresses through three phases:
721
- - **Phase A (current):** Humans edit persona definitions based on observed behavior
722
- - **Phase B (design target):** Reflections + `/review-reflections` skill
723
- - **Phase C (future):** Automated accuracy tracking
724
-
725
- This is opt-in — not all agent platforms support file write-back, and not all
726
- organizations want the overhead. Enable it in `agentboot.config.json` when ready.
727
-
728
- ---
729
-
730
- ## Reviewer selection
731
-
732
- When a codebase has multiple reviewer personas (code, security, architecture, cost),
733
- developers should not have to decide which one to invoke. A reviewer selection config
734
- maps file paths and change types to the appropriate reviewer(s):
735
-
736
- ```json
737
- {
738
- "rules": [
739
- { "glob": "**/*.sql", "reviewers": ["code-reviewer", "security-reviewer"] },
740
- { "glob": "infra/**", "reviewers": ["code-reviewer", "cost-reviewer"] },
741
- { "glob": "src/auth/**", "reviewers": ["security-reviewer"] }
742
- ],
743
- "default": ["code-reviewer"]
744
- }
745
- ```
746
-
747
- A `/review` meta-skill reads this config, inspects the current diff, and routes to
748
- the appropriate persona(s). The developer invokes `/review` and the system decides
749
- which specialists are needed. This is the orchestrator pattern from the origin designs
750
- — a lightweight routing layer, not a complex agent-to-agent messaging system.
751
-
752
- ---
753
-
754
- ## HARD/SOFT guardrail elevation
755
-
756
- Not all guardrails are equal. Some rules must never be bypassed — a PHI scrubber in a
757
- healthcare org, a credential scanner in a fintech. Others are important defaults that a
758
- senior engineer may need to temporarily override for debugging or experimentation.
759
-
760
- AgentBoot distinguishes two tiers:
761
-
762
- **HARD guardrails** are deployed via MDM (managed device management) or marked
763
- `required: true` in the org config. They cannot be elevated, overridden, or disabled at
764
- any scope level. The build system enforces this — a team-level config that attempts to
765
- disable a HARD guardrail causes a build failure. HARD guardrails are for rules where
766
- violation is a compliance incident, not a judgment call.
767
-
768
- **SOFT guardrails** are deployed via the shared repo and can be temporarily elevated.
769
- The elevation mechanism:
770
-
771
- 1. Developer invokes `/elevate {guardrail-name}` with a reason
772
- 2. The skill grants a time-bounded bypass (default TTL: 30 minutes)
773
- 3. An audit log entry is created: who elevated, what, why, when, TTL
774
- 4. When the TTL expires, the guardrail automatically re-engages
775
- 5. All actions taken during the elevation window are logged
776
-
777
- For larger organizations where automated elevation creates audit risk, AgentBoot also
778
- supports a manual escalation model: the developer files a GitHub issue requesting
779
- bypass, a designated approver grants or denies it, and the decision is recorded. This
780
- is the pattern used in a large enterprise design, where the team size and
781
- compliance requirements made automated elevation inappropriate.
782
-
783
- A mature governance system needs both HARD/SOFT tiers and both temporary elevation
784
- (for debugging) and permanent exceptions (ADRs, described above).
785
-
786
- ---
787
-
788
- ## Team champions
789
-
790
- Technical distribution of personas is necessary but not sufficient. Adoption requires
791
- a human governance layer — someone on each team who understands the persona system,
792
- syncs updates, files quality feedback, and answers questions from teammates.
793
-
794
- AgentBoot calls this role the **Team Champion**. Each team designates one engineer
795
- (typically a tech lead or senior IC) who:
796
-
797
- - Runs `npm run sync` to pull the latest persona updates into team repos
798
- - Reviews sync PRs before merging (the governance checkpoint)
799
- - Files GitHub issues against the personas repo when a persona produces poor findings
800
- or misses something it should have caught
801
- - Onboards new team members on how to use the persona system
802
- - Proposes new gotchas rules, trait calibration changes, or team-level extensions based
803
- on their team's experience
804
-
805
- The Team Champion is not a full-time role — it is a rotating responsibility that takes
806
- minutes per week in steady state. The value is having a named person accountable for
807
- the feedback loop between the team and the personas repo.
808
-
809
- This pattern was validated in a large engineering organization, where the studio has
810
- multiple siloed development teams. Without Team Champions, persona updates would land
811
- in team repos without anyone understanding what changed or why. With them, each team
812
- has a human bridge between the governance system and the developers who use it daily.
813
-
814
- ---
815
-
816
- ## SME discoverability
817
-
818
- When an organization has domain expert personas (compliance SMEs, FHIR experts,
819
- architecture advisors), developers need to know they exist before they can use them.
820
- A persona that no one knows about delivers no value.
821
-
822
- AgentBoot addresses this with a discoverability fragment — a lightweight always-on
823
- CLAUDE.md section (~100 tokens) that lists all available personas and how to invoke
824
- them:
825
-
826
- ```markdown
827
- ## Available Personas
828
-
829
- | Command | What it does |
830
- |---------|-------------|
831
- | `/review-code` | Code review against team standards |
832
- | `/review-security` | Security-focused review (OWASP, auth, data handling) |
833
- | `/gen-tests` | Generate unit and integration tests |
834
- | `/gen-testdata` | Generate realistic synthetic test data |
835
- | `/sme-compliance` | HIPAA/GDPR/SOC2 compliance questions |
836
- ```
837
-
838
- This fragment is auto-generated by the build system from the compiled persona registry.
839
- It costs virtually nothing per session (the token count is trivial) but makes personas
840
- discoverable without consulting external documentation. A developer who did not know
841
- the test data expert existed will see it listed and try it.
842
-
843
- The fragment is regenerated on every build, so it stays in sync with the actual persona
844
- inventory automatically. Personas that are disabled at a scope level are excluded from
845
- that scope's fragment.
846
-
847
- ---
848
-
849
- ## MCP-first tool integrations
850
-
851
- When personas need to interact with external systems — knowledge bases, data detection
852
- services, domain lookup APIs, test data generators — AgentBoot recommends building
853
- these as MCP (Model Context Protocol) servers from day one.
854
-
855
- MCP is now GA in Claude Code, VS Code (Copilot), and the CLI. It is also supported by
856
- Cursor, Gemini CLI, and other agent platforms. An MCP server built for one agent works
857
- identically in all of them — with no modification.
858
-
859
- This matters for two reasons:
860
-
861
- 1. **Investment protection.** If your organization builds a knowledge base MCP server
862
- for Claude Code, it works in Copilot agent mode and Cursor without rework. If you
863
- build it as a Claude Code-specific tool, you rebuild from scratch for every platform.
864
-
865
- 2. **Clean migration path.** An MCP server that reads markdown files today can be
866
- swapped for one backed by pgvector or a vector DB tomorrow — the persona definitions
867
- don't change. The MCP interface is the abstraction boundary.
868
-
869
- The alternative — having personas read files directly via Grep/Glob — is simpler for V1
870
- but creates migration work later. The upfront cost of an MCP wrapper is a thin server;
871
- the long-term benefit is zero-change migration and multi-platform compatibility.
872
-
873
- For AgentBoot, this means: domain layers that need external data access should define
874
- MCP server specifications alongside their persona definitions. The build system can
875
- generate MCP configuration stanzas that get synced to target repos.
876
-
877
- ---
878
-
879
- ## Structured telemetry
880
-
881
- Persona invocations should emit structured JSON logs from day one — not plain text.
882
- The difference matters when you need to answer questions like "which persona is invoked
883
- most often?", "what is the average token cost per review?", or "which teams use the
884
- security reviewer least?"
885
-
886
- AgentBoot specifies a telemetry format based on GELF (Graylog Extended Log Format) /
887
- NDJSON with defined fields:
888
-
889
- ```json
890
- {
891
- "persona_id": "review-security",
892
- "model": "claude-sonnet-4-6",
893
- "scope": "team:platform/api",
894
- "product": "my-app",
895
- "session_id": "abc123",
896
- "input_tokens": 4200,
897
- "output_tokens": 1800,
898
- "outcome": "completed",
899
- "findings": { "CRITICAL": 0, "ERROR": 1, "WARN": 3, "INFO": 2 },
900
- "duration_ms": 12400,
901
- "timestamp": "2026-03-19T14:30:00Z"
902
- }
903
- ```
904
-
905
- This is emitted by the audit-trail trait (which all review personas should compose).
906
- The log is human-queryable with `jq` from day one — no dashboarding infrastructure
907
- required to start getting value.
908
-
909
- Telemetry enables:
910
- - **Cost optimization** — identify which personas and models cost the most per finding
911
- - **Coverage tracking** — ensure security reviews are happening on every repo
912
- - **Quality feedback** — correlate finding severity with actual bug rates
913
- - **Adoption metrics** — measure which teams are using the system and which aren't
914
-
915
- Plain text log lines (`PERSONA_START agent=review-code`) are an anti-pattern. They
916
- cannot be queried, aggregated, or analyzed without parsing. Start structured.
917
-
918
- ---
919
-
920
- ## Persona arbitrator
921
-
922
- When multiple reviewer personas examine the same code, they may produce conflicting
923
- findings. A security reviewer might flag a pattern as risky while an architecture
924
- reviewer considers it the correct approach for the domain. A code reviewer might
925
- suggest refactoring something that the cost reviewer flags as an unnecessary token
926
- expenditure.
927
-
928
- The persona arbitrator is a dedicated persona that resolves these conflicts. It:
929
-
930
- 1. Receives the conflicting findings from both personas
931
- 2. Understands the scope hierarchy and which persona has authority in the conflict
932
- 3. Produces a reasoned resolution — either accepting one finding over the other with
933
- an explanation, or escalating to human review when the conflict is genuinely
934
- ambiguous
935
-
936
- The arbitrator is not invoked on every review — only when the `/review` meta-skill
937
- detects that two or more reviewers produced contradictory findings on the same code
938
- location. This keeps it lightweight.
939
-
940
- Without an arbitrator, conflict resolution falls to the developer, who may not have
941
- the context to judge between a security concern and an architecture rationale. The
942
- arbitrator provides that context by reading both personas' reasoning and the relevant
943
- rules at each scope level.
944
-
945
- This is a V2+ feature for organizations running multiple reviewer personas. For V1
946
- with a single code reviewer and security reviewer, conflicts are rare enough that
947
- human resolution is sufficient.
948
-
949
- ---
950
-
951
- ## Autonomy progression
952
-
953
- Not all personas should operate at the same level of independence. A documentation
954
- generator might be fully autonomous (generate and commit without human review), while
955
- a security reviewer should always require human sign-off on its findings.
956
-
957
- AgentBoot models this as a three-phase autonomy progression, tracked per persona:
958
-
959
- | Phase | Name | Behavior |
960
- |-------|------|----------|
961
- | 1 | **Advisory** | Persona produces findings. Human reviews and decides what to act on. No automated actions. |
962
- | 2 | **Auto-approve** | Persona produces findings and applies low-risk fixes automatically (formatting, import ordering, missing type annotations). High-risk findings still require human review. |
963
- | 3 | **Autonomous** | Persona operates independently — produces findings, applies fixes, commits changes. Human reviews the output post-hoc. |
964
-
965
- The current autonomy phase is declared in `persona.config.json`:
966
-
967
- ```json
968
- {
969
- "autonomy": "advisory"
970
- }
971
- ```
972
-
973
- Promotion from one phase to the next is a governance decision, not a technical
974
- configuration change. It should require evidence: the persona has been operating at
975
- Phase 1 for N weeks with an acceptable false-positive rate, so the team approves
976
- promotion to Phase 2. This evidence-based progression prevents premature automation
977
- and builds trust in the persona system.
978
-
979
- Phase 3 (Autonomous) should be reserved for personas with high confidence scores,
980
- extensive behavioral test coverage, and explicit team approval. Most organizations
981
- will run most personas at Phase 1 indefinitely — and that is fine. Advisory mode
982
- is the right default for critical review personas.
983
-
984
- ---
985
-
986
- ## Two-channel MDM distribution
987
-
988
- For enterprise organizations with managed device fleets, AgentBoot supports a
989
- two-channel distribution model that separates non-negotiable enforcement from
990
- team-customizable configuration:
991
-
992
- **Channel 1: MDM (Managed Device Management)**
993
- Deploys via JumpCloud, Jamf, Intune, or equivalent to:
994
- - `managed-settings.json` — Claude Code settings that cannot be overridden by any user
995
- - `managed-mcp.json` — MCP server configurations that are always active
996
-
997
- This channel carries HARD guardrails only — the rules where organizational compliance
998
- requires zero possibility of developer override. PHI scanning hooks, credential
999
- blocking, audit logging requirements. MDM-deployed settings take precedence over all
1000
- other configuration sources.
1001
-
1002
- **Channel 2: Git (Shared Repo)**
1003
- Distributes via the standard hub-and-spoke model:
1004
- - SOFT guardrails, traits, personas, skills
1005
- - Team-level customizations
1006
- - Always-on instructions
1007
-
1008
- This channel carries everything that benefits from version control, code review, and
1009
- team-level customization.
1010
-
1011
- The two channels serve different trust levels. MDM is "the organization enforces this
1012
- on your machine." Git is "the team agreed to use this in their repos." Both are
1013
- necessary for enterprise governance; neither is sufficient alone.
1014
-
1015
- This is an enterprise add-on, not a core requirement. Most organizations start with
1016
- Channel 2 only and add MDM enforcement when compliance requirements or team size
1017
- demand it. AgentBoot documents the pattern so organizations that need it know exactly
1018
- how to implement it.
1019
-
1020
- ---
1021
-
1022
- ## Proactive human action notifications
1023
-
1024
- When AgentBoot performs an action that requires human follow-up to take effect, it
1025
- must tell the user what to do. The user should never have to guess why something
1026
- isn't working after running a command. This is a core value-add.
1027
-
1028
- Examples:
1029
- - After `dev-sync` or `sync` changes `.claude/` files: "Restart Claude Code to pick
1030
- up persona changes"
1031
- - After `sync` changes files in target repos: list which repos were updated
1032
- - After any config change affecting runtime behavior: tell the user what to
1033
- restart or reload
1034
- - After `publish`: "Plugin published. Developers run `claude plugin install ...`"
1035
- - After `uninstall`: "Removed N files. Restart Claude Code if a session is active."
1036
-
1037
- Every command that produces side effects ends with a "next steps" line if human
1038
- action is needed. No silent state changes.
1039
-
1040
- ---
1041
-
1042
- ## Anti-patterns
1043
-
1044
- These patterns were tried in AgentBoot's origin implementations and should be
1045
- avoided. Each was rejected for a specific reason.
1046
-
1047
- ### Overcommitting on V1 scope
1048
-
1049
- An early design specified 25 V1 personas and 8 milestones.
1050
- For a 2-person founding team, this would have taken months and risked V1 never
1051
- shipping. A revised design scoped V1 to 6 personas and 6 milestones — buildable
1052
- in weeks.
1053
-
1054
- **Rule:** Start with 3-6 personas that address your highest-value use cases. Add more
1055
- after the first ones are deployed, used, and refined. A shipped persona system with 4
1056
- personas beats a designed system with 25 that never launches.
1057
-
1058
- ### Plain text log lines
1059
-
1060
- An early design used plain text log output (`PERSONA_START agent=review-code`).
1061
- This cannot be queried, aggregated, or analyzed without custom parsing. When you need
1062
- to answer "how many security reviews ran last week?", plain text requires grep and
1063
- regex. Structured JSON requires `jq '.persona_id == "review-security"' | wc -l`.
1064
-
1065
- **Rule:** Use structured telemetry (GELF/NDJSON) from day one. The upfront cost is
1066
- trivial; the analysis benefit is permanent.
1067
-
1068
- ### Runtime trait inclusion
1069
-
1070
- Early designs proposed `@include` directives that would resolve trait references
1071
- at runtime — the agent would read and compose trait files during each session. This
1072
- breaks on platforms that don't support file inclusion (Copilot, Cursor) and wastes
1073
- tokens re-reading trait files on every invocation.
1074
-
1075
- **Rule:** Traits are composed at build time. The compiled output is complete and
1076
- standalone. The agent receives a single file with all trait content already inlined.
1077
- No runtime resolution.
1078
-
1079
- ### Vendor-locked persona formats
1080
-
1081
- An enterprise Copilot deployment explicitly rejected Copilot-proprietary prompt
1082
- files as the primary persona definition format (decision D-01). Prompt files
1083
- (`*.prompt.md`) are VS Code-specific and not recognized by CLI agent mode or other
1084
- tools. The agentskills.io SKILL.md format was chosen instead because it works across
1085
- 26+ platforms.
1086
-
1087
- **Rule:** Use open standards for persona definitions. Vendor-specific formats can
1088
- coexist as convenience layers (e.g., IDE slash commands) but must not be the
1089
- authoritative definition.
1090
-
1091
- ### Forking base personas for customization
1092
-
1093
- When a product team needs to add domain-specific rules to a reviewer, the temptation
1094
- is to copy the base persona, modify it, and maintain the fork. This creates divergence
1095
- — improvements to the base persona never reach the fork, and the fork accumulates
1096
- product-specific cruft that makes it unmaintainable.
1097
-
1098
- **Rule:** Use the per-persona extension pattern instead. The base persona reads its
1099
- extension file at setup time and incorporates the additional rules. The base definition
1100
- stays unmodified and receives upstream improvements automatically.
1101
-
1102
- ### Deep inheritance hierarchies
1103
-
1104
- Object-oriented inheritance applied to personas ("security-reviewer extends
1105
- code-reviewer extends base-reviewer") creates fragile chains where changes to a
1106
- parent persona have unpredictable effects on children. This was explicitly rejected
1107
- as Design Principle #1 in AgentBoot's earliest design: composition over inheritance.
1108
-
1109
- **Rule:** Personas compose traits. They do not inherit from each other. If two
1110
- personas share behavior, that behavior belongs in a trait that both compose.
1111
-
1112
- ---
1113
-
1114
- *See also:*
1115
- - [`docs/getting-started.md`](getting-started.md) — hands-on walkthrough from zero to first sync
1116
- - [`docs/configuration.md`](configuration.md) — complete `agentboot.config.json` reference
1117
- - [`docs/extending.md`](extending.md) — building a domain layer on top of core