@joenandez/academy 0.4.0-rc.1 → 0.4.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.
@@ -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.4.0",
5
5
  "hooks": "./hooks/hooks.json"
6
6
  }
package/CHANGELOG.md CHANGED
@@ -3,6 +3,30 @@
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
+ ## 0.4.0 — 2026-09-02
7
+
8
+ First stable release.
9
+
10
+ ### Changed
11
+
12
+ - **Stable registry channel.** `npm install -g @joenandez/academy` installs
13
+ the finished 0.4.0 release. Release checks can validate an explicit new
14
+ target while the previous candidate tag remains.
15
+ - **Published guidance.** The README documents stable registry installation
16
+ and the enforced `threads.md` budget.
17
+
18
+ ### Fixed
19
+
20
+ - **Memory bridge opt-in.** The observation bridge copies client observations
21
+ only when `ACADEMY_MEMORY_BRIDGE=1`. Session tracking and pending
22
+ consolidation remain active when the bridge is off.
23
+ - **Bare-run scheduler stability.** A bare run leaves the saved runtime and
24
+ the existing nightly registration unchanged. An explicit runtime flag is
25
+ the only run action that changes them.
26
+ - **Lifecycle recovery guidance.** The integration guide explains that an
27
+ archive or delete change can complete before an event-log failure. It tells
28
+ clients to recover with `list --json`.
29
+
6
30
  ## 0.4.0-rc.1 — 2026-08-31
7
31
 
8
32
  First release candidate, and the first Academy artifact that can be installed
package/README.md CHANGED
@@ -10,8 +10,8 @@ against whatever project you are in. Every command also answers JSON, so a
10
10
  desktop app, a web service, or another CLI can render and manage agents without
11
11
  reading Academy's source.
12
12
 
13
- **Status: `0.4.0-rc.1`, contract version 1.** Academy is not on the npm registry
14
- yet. Install it from a checkout, as below.
13
+ **Status: `0.4.0`, contract version 1.** The stable release is on npm.
14
+ Install it with `npm install -g @joenandez/academy`.
15
15
 
16
16
  ## Requirements
17
17
 
@@ -26,6 +26,10 @@ yet. Install it from a checkout, as below.
26
26
  ## Install
27
27
 
28
28
  ```bash
29
+ # Stable release install
30
+ npm install -g @joenandez/academy
31
+
32
+ # Contributor checkout
29
33
  git clone https://github.com/joenandez/academy.git
30
34
  cd academy
31
35
  npm link # makes `academy` available globally
@@ -73,7 +77,7 @@ every `academy run` compile them into
73
77
  | `knowledge.md` | Domain expertise, frameworks, patterns | ~1500–2500 |
74
78
  | `goals.md` | Strategic objectives (cap 3) | ~150 |
75
79
  | `priorities.md` | Weekly direction (3–5 visible) | ~250 |
76
- | `threads.md` | Active work pursuits | ~700 |
80
+ | `threads.md` | Active work pursuits | ~1750 |
77
81
  | `notes.md` | Micro-steering staging area | ~500 |
78
82
  | `dailys.md` | Last 7 working days | ~1000 |
79
83
 
@@ -133,7 +137,7 @@ The shape in one line: success is JSON on stdout with exit 0, failure is JSON on
133
137
  stderr with exit 1, and exit status is 0 if and only if `ok` is true.
134
138
 
135
139
  ```json
136
- { "contract_version": 1, "ok": true, "command": "doctor", "version": "0.4.0-rc.1" }
140
+ { "contract_version": 1, "ok": true, "command": "doctor", "version": "0.4.0" }
137
141
  ```
138
142
 
139
143
  Academy ships a conformance suite for client authors. It imports no Academy
@@ -588,6 +588,12 @@ Every published command except `unarchive` answers `agent_archived` for it — i
588
588
  is never reported as missing, because a client told an archived specialist does
589
589
  not exist would offer to hire a replacement for somebody who is still there.
590
590
 
591
+ **Committed-mutation failure.** Academy moves the directory before it appends
592
+ the lifecycle event. If `archive --json` answers `log_corrupt` or
593
+ `internal_error`, the move can already have landed. Recover with one
594
+ `academy list --json` call and replace the client roster and watermark from that
595
+ response.
596
+
591
597
  Errors: `invalid_name`, `agent_not_found`, `agent_archived`,
592
598
  `not_academy_owned`, `agent_exists`, `unsafe_agent_path`,
593
599
  `runtime_unavailable`, `unschedule_failed`, `log_corrupt`, `lock_timeout`.
@@ -635,6 +641,12 @@ agent that no longer exists. If it cannot be put back because the slot has been
635
641
  refilled, the answer is `unschedule_failed_restore_blocked` and the `error`
636
642
  object names the `quarantine` path an operator must recover by hand.
637
643
 
644
+ **Committed-mutation failure.** Academy removes the quarantined directory before
645
+ it appends the lifecycle event. If `delete --json` answers `log_corrupt` or
646
+ `internal_error`, the removal can already have landed. Recover with one
647
+ `academy list --json` call and replace the client roster and watermark from that
648
+ response.
649
+
638
650
  Errors: `invalid_name`, `agent_not_found`, `agent_archived`,
639
651
  `not_academy_owned`, `unsafe_agent_path`, `runtime_unavailable`,
640
652
  `unschedule_failed`, `unschedule_failed_restore_blocked`, `log_corrupt`,
@@ -723,6 +735,10 @@ code.
723
735
  `internal_error` is the floor and can answer any command. The other fourteen
724
736
  are raised only by the commands whose sections list them in §5.
725
737
 
738
+ For `archive` and `delete`, `log_corrupt` or `internal_error` can follow a
739
+ committed directory move or removal. Use `list --json` as the atomic roster and
740
+ watermark recovery call described in §8.
741
+
726
742
  **Handling guidance.** `agent_not_found`, `agent_exists`, `invalid_name`,
727
743
  `agent_archived` and `invalid_spec` are user-facing and should be rendered as
728
744
  such. `unsafe_agent_path`, `runtime_unavailable`, `log_corrupt`, `lock_timeout`
@@ -19,7 +19,9 @@ export function syncAcademyMemory(payload, env = process.env) {
19
19
  // agent still consolidates when the memory bridge is unavailable.
20
20
  if (env.ACADEMY_NIGHTLY_RUN !== '1') markPendingConsolidation(memoryDir);
21
21
 
22
- return { synced: syncBridgeObservations(env, observationsDir, sessionId) };
22
+ const synced =
23
+ env.ACADEMY_MEMORY_BRIDGE === '1' ? syncBridgeObservations(env, observationsDir, sessionId) : 0;
24
+ return { synced };
23
25
  }
24
26
 
25
27
  if (isMainModule(import.meta.url)) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@joenandez/academy",
3
- "version": "0.4.0-rc.1",
3
+ "version": "0.4.0",
4
4
  "description": "Academy v3 — portable AI agents with 8 boot surfaces and a skills primitive.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -81,8 +81,8 @@ function prepareAgentRun(name, requestedRuntime, passthrough) {
81
81
  ? { ...writeCodexProfile(dir, name), runtimeContextPath: codexRuntimeContextPath() }
82
82
  : undefined;
83
83
  if (codex) writeCodexHooks(codex.runtimeContextPath);
84
- const nightlyTask = registerNightlyConsolidationTask(dir, name);
85
- if (!nightlyTask.registered && process.env.ACADEMY_SKIP_NIGHTLY_TASK !== '1') {
84
+ const nightlyTask = requestedRuntime ? registerNightlyConsolidationTask(dir, name) : null;
85
+ if (nightlyTask && !nightlyTask.registered && process.env.ACADEMY_SKIP_NIGHTLY_TASK !== '1') {
86
86
  console.error(
87
87
  `Warning: nightly consolidation job "${nightlyTask.id}" not updated: ${nightlyTask.reason}`,
88
88
  );