@joenandez/academy 0.4.0-rc.1 → 0.5.12

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 (121) hide show
  1. package/.claude-plugin/marketplace.json +5 -0
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/CHANGELOG.md +414 -0
  4. package/README.md +66 -117
  5. package/hooks/backstory/.claude-plugin/plugin.json +11 -0
  6. package/hooks/backstory/SOURCE +2 -0
  7. package/hooks/backstory/bin/backstory +9 -0
  8. package/hooks/backstory/hooks/hooks.json +45 -0
  9. package/hooks/backstory/scripts/knowledge.mjs +87 -0
  10. package/hooks/backstory/scripts/memory.mjs +685 -0
  11. package/hooks/backstory/scripts/tool-tick.mjs +1 -0
  12. package/hooks/backstory/skills/capture/SKILL.md +71 -0
  13. package/hooks/backstory/skills/capture/references/knowledge-capture-input.json +16 -0
  14. package/hooks/backstory/skills/capture/references/tagging-policy.md +29 -0
  15. package/hooks/backstory/skills/memory/SKILL.md +70 -0
  16. package/hooks/backstory/skills/setup/SKILL.md +85 -0
  17. package/hooks/context_metrics.mjs +67 -0
  18. package/hooks/hook_runtime.mjs +43 -2
  19. package/hooks/memory_bridge.mjs +286 -52
  20. package/hooks/memory_store.mjs +78 -26
  21. package/hooks/register_session.mjs +76 -14
  22. package/hooks/roque/.claude-plugin/plugin.json +6 -0
  23. package/hooks/roque/LICENSE +21 -0
  24. package/hooks/roque/SOURCE +1 -0
  25. package/hooks/roque/hooks.json +38 -0
  26. package/hooks/roque/package.json +3 -0
  27. package/hooks/roque/roque.js +1690 -0
  28. package/hooks/sync_memory.mjs +12 -6
  29. package/package.json +7 -3
  30. package/scripts/cli/agent-gate.mjs +70 -0
  31. package/scripts/cli/agent-id.mjs +37 -0
  32. package/scripts/cli/archive.mjs +39 -38
  33. package/scripts/cli/archived.mjs +4 -2
  34. package/scripts/cli/args-kinds.mjs +33 -0
  35. package/scripts/cli/args-notes.mjs +42 -0
  36. package/scripts/cli/args-owner.mjs +37 -0
  37. package/scripts/cli/args-run.mjs +38 -0
  38. package/scripts/cli/args.mjs +47 -104
  39. package/scripts/cli/beads.mjs +57 -0
  40. package/scripts/cli/codex.mjs +66 -12
  41. package/scripts/cli/core.mjs +117 -41
  42. package/scripts/cli/create.mjs +224 -76
  43. package/scripts/cli/curator-feed-codex.mjs +81 -0
  44. package/scripts/cli/curator-feed-observations.mjs +97 -0
  45. package/scripts/cli/curator-feed-scope.mjs +124 -0
  46. package/scripts/cli/curator-feed-sources.mjs +172 -0
  47. package/scripts/cli/curator-feed.mjs +318 -0
  48. package/scripts/cli/default-name.mjs +73 -0
  49. package/scripts/cli/doctor.mjs +67 -2
  50. package/scripts/cli/eventlog.mjs +6 -2
  51. package/scripts/cli/exit-code.mjs +9 -0
  52. package/scripts/cli/first-run.mjs +115 -0
  53. package/scripts/cli/heartbeat.mjs +135 -0
  54. package/scripts/cli/helm-skip.mjs +20 -0
  55. package/scripts/cli/hire-headless.mjs +37 -22
  56. package/scripts/cli/hire.mjs +8 -2
  57. package/scripts/cli/inspect.mjs +36 -18
  58. package/scripts/cli/lifecycle.mjs +95 -49
  59. package/scripts/cli/main.mjs +32 -2
  60. package/scripts/cli/memory-env.mjs +124 -0
  61. package/scripts/cli/migrate.mjs +13 -7
  62. package/scripts/cli/next-steps.mjs +13 -0
  63. package/scripts/cli/nightly-launch.mjs +118 -0
  64. package/scripts/cli/nightly.mjs +228 -0
  65. package/scripts/cli/notes.mjs +58 -8
  66. package/scripts/cli/owner-config.mjs +181 -0
  67. package/scripts/cli/owner-jobs.mjs +201 -0
  68. package/scripts/cli/prompt-append.mjs +135 -0
  69. package/scripts/cli/rename.mjs +90 -109
  70. package/scripts/cli/run-context.mjs +50 -0
  71. package/scripts/cli/run.mjs +236 -79
  72. package/scripts/cli/scaffold.mjs +119 -126
  73. package/scripts/cli/schedule-errors.mjs +70 -0
  74. package/scripts/cli/sessions.mjs +10 -3
  75. package/scripts/cli/skills-check.mjs +147 -0
  76. package/scripts/cli/skills.mjs +170 -0
  77. package/scripts/cli/start.mjs +201 -0
  78. package/scripts/cli/templates.mjs +119 -45
  79. package/scripts/cli/tldr.mjs +184 -0
  80. package/scripts/cli/toml-string.mjs +76 -0
  81. package/scripts/cli/user-work-view.mjs +48 -0
  82. package/scripts/cli/writable-dirs.mjs +23 -0
  83. package/scripts/cli/yaml.mjs +1 -1
  84. package/skills/hire/SKILL.md +112 -100
  85. package/skills/hire/references/owner.md +68 -0
  86. package/templates/agents/claude-code/knowledge-curator.md +5 -2
  87. package/templates/agents/codex/knowledge-curator.toml +2 -1
  88. package/templates/operating-model/base.md +78 -0
  89. package/templates/operating-model/owner.md +11 -0
  90. package/templates/operating-model/principal.md +9 -0
  91. package/templates/operating-model/specialist.md +9 -0
  92. package/templates/packs/owner/craft.md +32 -0
  93. package/templates/packs/owner/identity.md +13 -0
  94. package/templates/packs/owner/mandate.md +26 -0
  95. package/templates/packs/owner/owner/SKILL.md +118 -0
  96. package/templates/packs/owner/owner-feedback/SKILL.md +49 -0
  97. package/templates/packs/owner/owner-heartbeat/SKILL.md +35 -0
  98. package/templates/packs/owner/owner-nightly/SKILL.md +114 -0
  99. package/templates/packs/owner/owner-review/SKILL.md +70 -0
  100. package/templates/packs/owner/owner-work/SKILL.md +53 -0
  101. package/templates/packs/principal/craft.md +27 -0
  102. package/templates/packs/principal/identity.md +13 -0
  103. package/templates/packs/principal/mandate.md +23 -0
  104. package/templates/packs/principal/principal-brief/SKILL.md +44 -0
  105. package/templates/packs/principal/principal-intro/SKILL.md +95 -0
  106. package/templates/packs/principal/principal-nightly/SKILL.md +152 -0
  107. package/templates/skills/check-in/SKILL.md +34 -24
  108. package/templates/skills/knowledge-curation/SKILL.md +89 -48
  109. package/templates/skills/local-rules/SKILL.md +86 -0
  110. package/templates/skills/nightly-consolidation/SKILL.md +131 -100
  111. package/templates/skills/skill-method/SKILL.md +79 -0
  112. package/templates/skills/user-nightly/SKILL.md +143 -0
  113. package/templates/skills/work-graph/SKILL.md +75 -0
  114. package/conformance/README.md +0 -60
  115. package/conformance/discovery.test.mjs +0 -140
  116. package/conformance/envelope.test.mjs +0 -185
  117. package/conformance/error-codes.test.mjs +0 -125
  118. package/conformance/harness.mjs +0 -180
  119. package/conformance/identity.test.mjs +0 -125
  120. package/docs/integration-guide.md +0 -1026
  121. package/templates/skills/self-update/SKILL.md +0 -121
@@ -9,6 +9,11 @@
9
9
  "name": "academy",
10
10
  "source": ".",
11
11
  "description": "Academy v3 — portable AI agents."
12
+ },
13
+ {
14
+ "name": "roque",
15
+ "source": "./hooks/roque",
16
+ "description": "Roque: keeps long sessions on track across compaction."
12
17
  }
13
18
  ]
14
19
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "academy",
3
3
  "description": "Academy v3 — portable AI agents.",
4
- "version": "0.4.0-rc.1",
4
+ "version": "0.5.12",
5
5
  "hooks": "./hooks/hooks.json"
6
6
  }
package/CHANGELOG.md CHANGED
@@ -3,6 +3,420 @@
3
3
  This project follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
4
4
  The heading at the top of this file is the version in `package.json`.
5
5
 
6
+ <!--
7
+ The release skill folds the block below into the `## <target>` section when it
8
+ cuts the next release. It is not a `## ` heading, so the version check in
9
+ `scripts/release-check.mjs` still reads the released version at the top.
10
+ -->
11
+
12
+ ## 0.5.12 — 2026-10-19
13
+
14
+ ### Added
15
+
16
+ - **Backstory memory for agents.** The Stop-hook sweep also copies Backstory
17
+ observations (`BACKSTORY_HOME`, default `~/.backstory`) for the agent's
18
+ recorded sessions into its archive, so an agent that runs on Backstory instead
19
+ of Subspace memory still feeds its nightly. Nightly sessions are now marked in
20
+ `memory/sessions.jsonl`, and their own observations are never swept.
21
+
22
+ ## 0.5.11 — 2026-10-19
23
+
24
+ ### Changed
25
+
26
+ - **Context compression: agents just note, and the nightly routes.** Agents
27
+ add notes with `academy notes add` and no longer pick a file. Each nightly
28
+ files a note into knowledge, work, a new `references/` file, or Beads (system
29
+ notes become `academy-system` tasks). The curator hands agent-specific
30
+ `[proposed]` user lines back to that agent.
31
+ - **The nightly runs only when there is something to do.** A note or new
32
+ session arms it; a night with no new input skips in code, without a model
33
+ run. A night with an empty archive still curates notes and trims.
34
+ - **`references/` holds conditional facts.** Each file is reached by a
35
+ `useWhen` line in an always-on file, and `academy skills check` measures it.
36
+ Owner hires write their environment and context to `references/mandate.md`;
37
+ curation never edits that file.
38
+ - **Budgets.** The mandate cap is 600 tokens, enforced and reported, but it
39
+ never blocks a nightly. Staged `## Proposed` lines in `user.md` do not count.
40
+ `user.md` is organized in tiers, with `## Proposed` last.
41
+
42
+ ### Fixed
43
+
44
+ - **A note added during a nightly is never lost.** Every writer saves its input
45
+ and arms the nightly marker in one locked step, and a marker the last run did
46
+ not use always launches the next one. A lock left by a dead process clears
47
+ after 60 seconds.
48
+
49
+ ## 0.5.10 — 2026-10-18
50
+
51
+ ### Changed
52
+
53
+ - **The curator emails the user after every nightly run, quiet nights
54
+ included.** Before, it wrote only when something material changed, so a
55
+ quiet night looked the same as a failed run. A material change still leads
56
+ with what changed and what the curator needs. A quiet night says so in the
57
+ subject, and the body lists what was updated or says that nothing changed.
58
+ - **Internal: the curator feed code is split into smaller modules** so the
59
+ pre-push quality gate passes again. The feed's output is unchanged.
60
+
61
+ ## 0.5.9 — 2026-10-17
62
+
63
+ ### Fixed
64
+
65
+ - **Scheduled agent runs in a memory topic now keep their memory.** When a run
66
+ inherits a topic (its project and workspace) without the memory-enabled flag,
67
+ as a scheduled job does, `academy run` now sets the flag. Before, the
68
+ client skipped every turn of such a run, and the session record kept no
69
+ topic, so the agent's nightly found nothing to consolidate. An explicit flag
70
+ value, such as `0`, is kept.
71
+
72
+ ## 0.5.8 — 2026-10-17
73
+
74
+ ### Added
75
+
76
+ - **Every Principal sends a morning brief.** A new job,
77
+ `<name>-principal-brief`, runs each day at 07:00 in the agent's timezone and
78
+ starts the new `principal-brief` skill. The agent emails the user a short
79
+ agenda: what they did together the day before, and what to pair on today.
80
+ It suggests an idea only from something the user said, with its date. The
81
+ brief only reads, writes, and sends; it starts no work. The agent picks the
82
+ sections and the length, and keeps a quiet day short. A local rule can change
83
+ the brief or turn it off. `create` registers the job for a new Principal,
84
+ `stop`, `archive`, and `delete` remove it, and `start` registers it again. An
85
+ existing Principal gets the job with `academy start <name>`. A rename keeps
86
+ the job. Under a named `AGENTS_ROOT`, the brief gets the same
87
+ `jobs.agents_root` warning as the nightly.
88
+ - **Every agent can read the user feed.** The feed script now serves any
89
+ agent, and the operating model lists it in every agent's Tools table. By
90
+ default it holds only the entries attributed to the calling agent. `--all`
91
+ holds every entry, and `--project`, `--topic`, and `--branch` narrow it; a
92
+ header line counts the entries each filter leaves out. `--max-tokens` caps
93
+ the file (default 25,000). When the cap cuts, the oldest entries go first and
94
+ a header line says how many went and how to narrow the window. A cap smaller
95
+ than the header is refused.
96
+
97
+ ### Changed
98
+
99
+ - **The curator still reads every entry.** The `user-nightly` skill runs the
100
+ feed with `--all --max-tokens 500000`, so the curator's file is the same as
101
+ in 0.5.7.
102
+
103
+ ### Fixed
104
+
105
+ - **The agent-written brief mark names no person.** Spectre plan-review briefs
106
+ in the feed are now marked
107
+ `[likely agent-written brief, not the user's words]`.
108
+
109
+ ## 0.5.7 — 2026-10-17
110
+
111
+ ### Added
112
+
113
+ - **The curator reads a daily feed.** A new script,
114
+ `scripts/cli/curator-feed.mjs`, writes one file per night to the curator's
115
+ `dreams/user-feed/` folder. It holds every prompt the user typed in Claude
116
+ Code and Codex chat, every email the user sent to an agent through tldr, and
117
+ the last memory observation of each turn, each with its time, project,
118
+ branch, session, and agent. Automation turns are left out only by an entry
119
+ flag, an exact generated string, or a complete generated envelope; a typed
120
+ prompt is never dropped for its opening words. Spectre plan-review briefs
121
+ stay in, marked as likely agent-written. Prompts are cut at 2,000 characters
122
+ with a `[cut: N chars]` marker. When one source fails, the file still holds
123
+ the others. The script prints one JSON line with the counts, the source
124
+ states, and the token totals of the curator's previous run.
125
+ - **Sessions record their injected context size.** Each `sessions.jsonl` row
126
+ now carries a `context` measurement (total, overhead, per-surface tokens,
127
+ skill listing) and the transcript path, so context growth can be tracked per
128
+ agent.
129
+
130
+ ### Changed
131
+
132
+ - **The `user-nightly` skill reads the feed first.** The curator runs the
133
+ feed script, reads the whole file, and searches memory or transcripts only
134
+ to settle a question the feed cannot answer. When a source fails, it falls
135
+ back to its old search for that source. Its report gets a `## Feed` section
136
+ with the feed size and the previous run's tokens. On a test day the run
137
+ took 9 minutes instead of 46 and used 34 model calls instead of 53.
138
+ - **Roque sync.** Roque `f62066c` (0.1.1): `3c61e59` retires the standalone
139
+ Roque release, and `f62066c` documents that Roque ships inside Academy. No
140
+ hook behavior changed.
141
+
142
+ ## 0.5.6 — 2026-10-15
143
+
144
+ ### Added
145
+
146
+ - **Roque ships with Academy.** Every agent session now loads Roque, which
147
+ keeps long sessions on track across compaction. Near the compaction point
148
+ (75% and 90%) it asks the agent to keep a state file at
149
+ `.roque/state/<session>.md`. After a compaction it gives that state back to
150
+ the agent. Claude Code sessions also save each compaction summary. Claude
151
+ Code loads the Roque copy in Academy with `--plugin-dir`, so an installed
152
+ `roque` plugin does not run a second time. Codex sessions get two Roque
153
+ hooks next to the Academy hooks; approve them once in Codex `/hooks`.
154
+ `.roque/off` in a project turns Roque off there. First Roque sync: Roque
155
+ `bf4c36b` (0.1.1).
156
+ - **Normal sessions can install Roque from Academy.** The Academy marketplace
157
+ now lists `roque`: `claude plugin install roque@academy-local`.
158
+
159
+ ### Changed
160
+
161
+ - **Agent sessions compact at a 430,000-token window.** `academy run` sets
162
+ `CLAUDE_CODE_AUTO_COMPACT_WINDOW=430000` for each Claude Code session it
163
+ starts. A value already set in the environment wins. Other sessions do not
164
+ change.
165
+
166
+ ## 0.5.5 — 2026-10-15
167
+
168
+ ### Added
169
+
170
+ - **The Owner loop.** An Owner now keeps a strategy, runs a weekly
171
+ owner-review with the user, drives initiatives, and schedules its own
172
+ follow-up sessions. A new Owner gets a seeded `craft.md` and identity, and
173
+ says hello with a first update on its first daily open.
174
+ - **Owner onboarding.** `academy create` makes an Owner as a draft. A draft
175
+ Owner has only the nightly job and does not run. `academy start <agent>`
176
+ checks the Owner's mandate and terms, registers its jobs, and requests one
177
+ first daily run. A failed start restores the earlier state.
178
+ - **`academy stop <agent>`.** Stop marks the agent stopped, deletes every job
179
+ of the agent, and keeps its files. A stopped agent does not run until
180
+ `academy start`.
181
+ - **Default names.** `academy create` without a name picks the first free
182
+ default name.
183
+ - **Rename keeps the agent.** Each agent has a fixed id. `academy rename`
184
+ changes only the name: the folder, jobs, run routes, and Beads labels keep
185
+ the fixed id. Commands accept the fixed id or the current name.
186
+ - **A Principal can hire an Owner** through the Owner hire steps.
187
+
188
+ ### Changed
189
+
190
+ - `academy doctor` lists `start` and `stop` in its command list and usage.
191
+ - A terminal Owner create prints how to start the draft.
192
+ - Every tldr call has a 60 s limit, so a hung call cannot hold the lifecycle
193
+ lock.
194
+
195
+ ### Fixed
196
+
197
+ - An agent loads the `user-work.md` sections that name its fixed id or its
198
+ current name.
199
+ - `academy list`, `clean`, and `run` use the current name after a rename.
200
+ - `academy hire` counts a draft Owner as a taken name and never reuses an
201
+ existing agent.
202
+ - An Owner backs off only after an empty session.
203
+ - Archive and rename delete an Owner's self-scheduled sessions.
204
+
205
+ ## 0.5.4 — 2026-10-13
206
+
207
+ ### Changed
208
+
209
+ - **Scheduled runs bypass permission prompts by default.** A nightly run
210
+ without a permission flag on its job now launches Claude Code with
211
+ `--permission-mode bypassPermissions` (was `auto`) and Codex with
212
+ `--dangerously-bypass-approvals-and-sandbox` (was `--ask-for-approval never
213
+ --sandbox workspace-write`). New Owner daily and heartbeat jobs store
214
+ `bypassPermissions` for Claude and `danger-full-access` for Codex. A mode
215
+ already stored on a job is never changed.
216
+
217
+ ### Fixed
218
+
219
+ - **Nightly runs can write their memory files again.** Auto mode refused every
220
+ file write in an unattended run, so the nightly kept no work, notes,
221
+ knowledge, or dreams report.
222
+
223
+ ## 0.5.3 — 2026-10-12
224
+
225
+ ### Added
226
+
227
+ - **A new Principal opens with a short first-session intro.** `create --kind
228
+ principal` now writes `intro-pending.md` in the agent's home. The first
229
+ `academy run` of that Principal from a terminal, with nothing after `--`,
230
+ starts the session with one plain sentence that points at the
231
+ `principal-intro` skill. A scheduled run, a headless run, a resume, and any
232
+ run with a passthrough never starts the intro. `run` writes one
233
+ `run.intro_seed` line to stderr when it does.
234
+ - **`create --kind principal` in a terminal asks for a missing name and starts
235
+ the first session.** `--no-start` creates the agent and prints
236
+ `academy run <name>` instead. `--json`, a pipe, and every other kind take the
237
+ same path as before: a missing name is still `invalid_name`, and the
238
+ `create` envelope has no new field. `contract_version` stays `1`.
239
+
240
+ ### Changed
241
+
242
+ - **The Principal mandate names the work, not projects.** A new Principal's
243
+ `mandate.md` has a `## Working on` section. The first session adds one
244
+ `- <ws-id> <title>` line for the work the user names, and the curator uses
245
+ it to map that Workstream to the Principal. The template has no
246
+ `## Projects` or `## Environment` section, and the Principal operating
247
+ model points at the work in the mandate.
248
+
249
+ ## 0.5.2 — 2026-10-12
250
+
251
+ ### Changed
252
+
253
+ - **Each agent loads only its own part of `user-work.md`.** The shared file is
254
+ now a short preamble and `##` sections, one for each goal and each
255
+ Workstream. Each section has an `agents:` line with agent names or `none`.
256
+ When `academy run` compiles an agent's prompt, it keeps the preamble and
257
+ only the sections that name the agent, and it removes the `agents:` lines.
258
+ A section without an `agents:` line goes to no agent, and an agent that no
259
+ section names gets the preamble only. Claude and Codex get the same view.
260
+ `academy run` writes one `run.user_work_view` line to stderr with the
261
+ section and kept counts.
262
+ - **`academy tokens` and `academy budget` count each agent's share** of
263
+ `user-work.md`, not the whole file. The JSON shape is unchanged, and
264
+ `contract_version` stays `1`.
265
+ - **The curator's `user-nightly` skill writes the sectioned format.** It maps
266
+ sections to agents from mandates and Beads `owner:` labels, checks each
267
+ mapped agent's budget, and lists each new or changed assignment in its
268
+ email. Rules that apply to every agent go to `user.md` Standing rules.
269
+ - **Agent skills read the full `user-work.md` only on demand.** The operating
270
+ model and the work skills say the agent's share is in its prompt.
271
+ `work-graph` lists Workstream titles with `bd list --type workstream --json`
272
+ before it proposes a new Workstream.
273
+
274
+ ## 0.5.1 — 2026-10-09
275
+
276
+ ### Changed
277
+
278
+ - **A user can create any number of Principals.** `create --kind principal`
279
+ no longer refuses a second Principal, live or archived. The `agent_exists`
280
+ reason `principal_exists` is retired and no longer raised. `contract_version`
281
+ stays `1`: no field was added or removed. A create now writes each missing
282
+ shared seed with an exclusive-create flag, so concurrent creates and
283
+ `academy notes add --user` never overwrite `user.md` or `user-work.md`.
284
+ - **The Principal pack mandate has a Projects section.** A new Principal's
285
+ `mandate.md` starts with `- Not yet named.` under `## Projects` and tells the
286
+ Principal to ask the user in its first session which projects it covers. The
287
+ pack text no longer says "all projects".
288
+
289
+ ### Fixed
290
+
291
+ - **A create that loses a same-name race no longer deletes the winner.** When
292
+ two `academy create` requests for one name run at once, the one that loses
293
+ the directory creation now refuses with `agent_exists` and removes nothing.
294
+ Before, its rollback could delete the agent the other request had just made.
295
+ - **Concurrent first creates no longer fail on the agents folder.** Creating
296
+ the `AGENTS_ROOT` folder is now safe when several creates start together.
297
+
298
+ ## 0.5.0 — 2026-10-09
299
+
300
+ ### Added
301
+
302
+ - **`academy notes add --user "<text>"`** appends a
303
+ `- [proposed] YYYY-MM-DD HH:MM <agent>: <text>` line to the shared `user.md`.
304
+ - **Skills `work-graph` and `check-in` for every kind, and `user-nightly` for
305
+ the curator.** `work-graph` covers Workstreams in Beads. `user-nightly`
306
+ maintains `user.md` and `user-work.md` each night.
307
+ - **Agent kinds.** `academy create --kind specialist|owner|principal` makes
308
+ an agent of that kind, and agent records report `kind`. Each kind renders its
309
+ own skill list from a package-skill manifest, and every kind gets the
310
+ `skill-method` and `local-rules` skills and a `local-rules.md` surface.
311
+ - **The Owner pack.** An Owner gets the `owner`, `owner-work`,
312
+ `owner-heartbeat`, `owner-nightly`, and `owner-feedback` skills, `owner_*`
313
+ settings in `agent.yaml`, and three scheduled jobs: a daily run, a heartbeat
314
+ inside `owner_hours`, and a nightly. `academy delete` and `archive`
315
+ unschedule every Academy job of the agent.
316
+ - **The Principal pack.** One Principal per user, with its pack skills and
317
+ write access to the shared root for Codex runs.
318
+ - **Scheduler skip line.** A scheduled run that decides on purpose not to start
319
+ a session prints one `helm.skip` line and exits 0, so the scheduler records a
320
+ skip and starts no fallback session.
321
+ - **Nightly receipts.** The nightly verifies its consolidation and writes
322
+ `memory/nightly-last.json`; `academy doctor` reports each agent's last
323
+ nightly receipt and checks `bd`.
324
+ - **Skill size check.** `academy skills check` measures unpublished skills
325
+ against the 2,000-token ceiling.
326
+
327
+ ### Changed
328
+
329
+ - **Breaking: a new boot-surface file set for every agent.** Every kind now
330
+ boots the same nine surfaces, in this order: `identity.md`, `craft.md`,
331
+ `mandate.md`, `work.md`, `knowledge.md`, `notes.md`, `local-rules.md`, and the
332
+ shared `user.md` and `user-work.md` in `ACADEMY_HOME`. These files are
333
+ retired: `role.md`, `goals.md`, `priorities.md`, `threads.md`, `dailys.md`,
334
+ and the shared `projects.md`. `inspect` reports the new names, so a client
335
+ that reads or writes a retired file must move to the new names. An existing
336
+ agent needs a one-time, reviewed migration: split `identity.md` and `role.md`
337
+ into identity, craft, and mandate; fold `goals.md` into `mandate.md`; fold
338
+ `priorities.md` and `threads.md` into `work.md`. The migration moves the old
339
+ files to `<agent>/retired/` and deletes nothing. `contract_version` stays
340
+ `1`: Academy's own tools were the only consumers of these filenames.
341
+ `docs/integration-guide.md` §10 lists the new file set and the shared paths.
342
+ - **One user Beads database.** Every kind works in the database at
343
+ `ACADEMY_HOME/.beads`, with `BEADS_ACTOR=<agent>@<pid>`. Workstreams are a
344
+ custom Beads type in it, and each Owner item carries the label
345
+ `owner:<agent>`. An Owner's own `.beads` directory moves into it once.
346
+ - **The harness prompt is kept.** Academy now appends its prompt to the
347
+ runtime's own system prompt (inline `--append-system-prompt <text>` for Claude,
348
+ and `developer_instructions` for Codex). It no longer replaces that prompt.
349
+ Claude gets the inline form so that a host's own
350
+ `--append-system-prompt-file` (the Subspace terminal wrapper) combines with
351
+ Academy's prompt instead of being replaced by it.
352
+ - **A shared writable home.** Every kind gets `ACADEMY_HOME` as a writable
353
+ directory, so any agent can append to the shared user files.
354
+ - **The memory bridge is always on.** There is no opt-in flag. Runs go
355
+ through the memory wrapper when the memory environment is absent, each
356
+ session records its memory project and workspace, and a sweep collects
357
+ delayed observations.
358
+ - **Every compiled prompt opens with the operating model** for the agent's
359
+ kind.
360
+ - **Scheduling goes through `tldr-agents tasks`**, and nightly jobs register
361
+ with `schedule --merge`, so a re-register keeps operator edits.
362
+
363
+ ### Fixed
364
+
365
+ - **A scheduled run for a missing agent skips instead of failing.** Under a
366
+ scheduler job id, `academy run` and `academy nightly` print one `helm.skip`
367
+ line (`agent_not_found`), log `run.agent_missing`, and exit 0, so the
368
+ scheduler records a skip and launches no fallback session. A run without a
369
+ job id still exits 1 with the not-found message.
370
+ - **Owner status emails name the agent and the run.** The `owner-work` skill
371
+ starts each subject with the agent's name and says in its first body line
372
+ which run sent the message, in plain words.
373
+ - **Dependency security.** `smol-toml` moves past GHSA-r4xh-jqrq-34v2.
374
+ - **Nightly robustness.** A failed, busy, or swept nightly keeps its input; a
375
+ Codex nightly runs outside a git repository; a report Academy judged failed
376
+ never seeds a checkpoint; and the verdict and seed read the report with one
377
+ parser.
378
+ - **Owner schedules.** Scheduled run flags come from the job id, an overnight
379
+ weekday window is read by the day it opened, and `owner_hours` is read once
380
+ for both the daily cron and the heartbeat guard.
381
+ - **Prompt rendering.** The shared system prompt is written atomically, and a
382
+ failed write removes its temp file.
383
+ - **`create` errors.** `create` reports the scheduler's error envelope instead
384
+ of its log line.
385
+ - **Curator nightly.** It works in the foreground, writes its report before
386
+ any email, and states a failed report.
387
+
388
+ ### Removed
389
+
390
+ - **`principal-memory` and `self-update` skills.** Routing moves into the
391
+ operating model, and graduation rules move into the nightly skills.
392
+ - **Internal files in the package.** The packed tarball no longer carries the
393
+ conformance suite or the integration guide, and the release check refuses
394
+ internal paths.
395
+
396
+ ## 0.4.0 — 2026-09-02
397
+
398
+ First stable release.
399
+
400
+ ### Changed
401
+
402
+ - **Stable registry channel.** `npm install -g @joenandez/academy` installs
403
+ the finished 0.4.0 release. Release checks can validate an explicit new
404
+ target while the previous candidate tag remains.
405
+ - **Published guidance.** The README documents stable registry installation
406
+ and the enforced `threads.md` budget.
407
+
408
+ ### Fixed
409
+
410
+ - **Memory bridge opt-in.** The observation bridge copies client observations
411
+ only when `ACADEMY_MEMORY_BRIDGE=1`. Session tracking and pending
412
+ consolidation remain active when the bridge is off.
413
+ - **Bare-run scheduler stability.** A bare run leaves the saved runtime and
414
+ the existing nightly registration unchanged. An explicit runtime flag is
415
+ the only run action that changes them.
416
+ - **Lifecycle recovery guidance.** The integration guide explains that an
417
+ archive or delete change can complete before an event-log failure. It tells
418
+ clients to recover with `list --json`.
419
+
6
420
  ## 0.4.0-rc.1 — 2026-08-31
7
421
 
8
422
  First release candidate, and the first Academy artifact that can be installed