agents-handoff 2.0.2 → 2.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Changelog
2
2
 
3
- All notable changes to agent-handoff are recorded here.
3
+ All notable changes to agents-handoff are recorded here.
4
4
 
5
5
  The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project
6
6
  adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). Releases before 2.0.0
@@ -15,6 +15,48 @@ version, and it is the version published to npm: the repository root is the
15
15
 
16
16
  Add entries under the matching heading as changes land.
17
17
 
18
+ ## [2.0.3] - 2026-10-09
19
+
20
+ ### Added
21
+
22
+ - **Named harness targets.** One run can install the skill into Claude Code, Codex CLI and the
23
+ harness-neutral `~/.agents/skills` at once: `--claude`, `--codex`, `--agents`,
24
+ `--harness claude,codex` (repeatable), `--all` for every harness whose directory exists on
25
+ this machine, `--skills-dir <dir>` for any other stack, and `--project` for the
26
+ per-repository form. Every target gets its own copy and its own install record.
27
+ - **`verify-package`**, a verb that checks an installation against the package npm is actually
28
+ serving for its version: it verifies the downloaded tarball against the registry's own
29
+ `integrity` and `shasum`, compares the published file set with the installed one file by
30
+ file, and compares the tarball sha256 with the value recorded for that install. `--record`
31
+ stores the tarball hashes in the install record, so later runs compare with a stored value.
32
+ - The install record (`.agents-handoff-install.json`) now carries a `package` block — name,
33
+ version, registry, tarball URL, and the sha256/sha512/integrity/shasum filled in by
34
+ `verify-package` — so an installation can be checked against the published artifact rather
35
+ than only against itself.
36
+ - Installing from the repository without publishing: `npx github:Alot1z/agent-handoff` runs the
37
+ same installer straight from GitHub, and the installation guide documents both that and the
38
+ clone-and-run path.
39
+ - Five installer behaviour tests — multi-harness install with a record per target, `--update`
40
+ over every installation, `--verify` failing on a tampered copy, `remove` keeping user data,
41
+ and `verify-package` refusing a version npm does not serve. The suite is 34 tests.
42
+
43
+ ### Changed
44
+
45
+ - `--update` and `--verify` with no harness flag now act on **every** installation found on the
46
+ machine instead of the one resolved target. A machine holding the skill in `~/.claude/skills`
47
+ and in `~/.agents/skills` has two copies, and updating only the resolved one left the other
48
+ silently stale; both verbs print a per-target summary.
49
+ - The runtime layer's entry point is `tools/agents-handoff.mjs`, matching the product name.
50
+ `tools/agent-handoff.mjs` is installed alongside it as a forwarder, so notes and scripts that
51
+ name the old path keep working.
52
+
53
+ ### Fixed
54
+
55
+ - `remove` deleted anything that was not one of three expected directory names, which meant a
56
+ handoff store kept under any other name was destroyed by `remove --force`. Removal is now
57
+ driven by the install manifest — what an install owns is what it copied — and the run prints
58
+ the entries it deliberately kept, including the store and `handoff.config.json`.
59
+
18
60
  ## [2.0.2] - 2026-10-09
19
61
 
20
62
  ### Added
@@ -49,7 +91,7 @@ Add entries under the matching heading as changes land.
49
91
  the development tree has. Sources are written in the shipped tree's terms and resolved against
50
92
  both layouts, and an install that cannot resolve a source now fails with the missing paths
51
93
  instead of warning and continuing.
52
- - CI failed on every run: the runtime-layer smoke test ran `agent-handoff.mjs list`, which is not
94
+ - CI failed on every run: the runtime-layer smoke test ran `agents-handoff.mjs list`, which is not
53
95
  a verb of that tool (it exits 2). The step builds a handoff into a scratch store and runs
54
96
  `index`, a verb that exists.
55
97
  - The shipped version disagreed across files: `SKILL.md` said 2.0.0 while `skill.json` and
@@ -107,7 +149,7 @@ documentation site.
107
149
 
108
150
  ### Added
109
151
 
110
- - **Capture engine** (`tools/handoff.mjs`, published as the `agent-handoff` bin). `build`
152
+ - **Capture engine** (`tools/handoff.mjs`, published as the `agents-handoff` bin). `build`
111
153
  reads a JSONL or plain-text transcript and writes a handoff directory:
112
154
  `HANDOFF.md`, `HANDOFF.summary.json`, `HANDOFF.llm.json`, `timeline.jsonl`, `TOOLS.md`,
113
155
  `manifest.json`. Also `list`, `show`, `verify`, `rename`, `retitle` and `config`.
@@ -121,7 +163,7 @@ documentation site.
121
163
  - **Store-root resolution** (`tools/lib/handoff-root.mjs`): `HANDOFFS_ROOT`, then
122
164
  `handoff.config.json` found by walking up, then a `handoffs/` directory on the same walk,
123
165
  then the skill directory. Reported by `handoff.mjs config`.
124
- - **Runtime layer** (`tools/agent-handoff.mjs`): `auto`, `verify-gate`, `promote`, `merge`,
166
+ - **Runtime layer** (`tools/agents-handoff.mjs`): `auto`, `verify-gate`, `promote`, `merge`,
125
167
  `federated-merge`, `self-improve`, `index`. Every mutating command takes a lock, backs up
126
168
  before writing, verifies after applying, and rolls back on failure.
127
169
  - **Bounded execution** (`tools/runtime-engine.mjs`): risk classes `R0`–`R4` evaluated against
@@ -131,8 +173,8 @@ documentation site.
131
173
  `command` probes that report `healthy` / `unhealthy` / `unknown` with the evidence behind
132
174
  each verdict.
133
175
  - **Installer** (`install/`, package `agents-handoff`): `install`, `update`, `remove`,
134
- `verify`, `list`, `where`, targeting a resolved global root, `./local/skills/agent-handoff`,
135
- or `./skills/agent-handoff`.
176
+ `verify`, `list`, `where`, targeting a resolved global root, `./local/skills/agents-handoff`,
177
+ or `./skills/agents-handoff`.
136
178
  - **Documentation site** at <https://alot1z.github.io/agent-handoff/>, built by GitHub Pages
137
179
  from `docs/`.
138
180
  - **CI** (`.github/workflows/ci.yml`): the test suite on Node 18, 20 and 22, a runtime-layer
package/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # agent-handoff
1
+ # agents-handoff
2
2
 
3
3
  **[Installation guide →](https://alot1z.github.io/agent-handoff/INSTALL.html)** · **[Documentation →](https://alot1z.github.io/agent-handoff/)** · **[Changelog](CHANGELOG.md)**
4
4
 
@@ -8,22 +8,61 @@
8
8
 
9
9
  One handoff format for every AI coding harness. A working session — messages, tool calls,
10
10
  reasoning, and the provenance to prove where each byte came from — is captured as a folder
11
- that a fresh agent can continue from with zero shared memory.
12
-
13
- - Zero runtime dependencies; Node.js 18 or newer.
14
- - Reads any JSONL or plain-text transcript, whatever produced it.
15
- - Every artifact carries a sha256 provenance chain, and `verify` recomputes it.
16
- - Writes are backed up, verified and rolled back on failure.
11
+ that a fresh agent can continue from with zero shared memory. Zero runtime dependencies,
12
+ Node.js 18 or newer, nothing read from the network at run time.
17
13
 
18
14
  ## Install
19
15
 
20
16
  ```bash
21
- npx agents-handoff
22
- npx agents-handoff where # show the resolved install root, and why it was chosen
17
+ npx agents-handoff --all # every harness found on this machine, in one run
18
+ ```
19
+
20
+ That is the whole install. Choose your stack instead — one harness, several, or a skills
21
+ directory of your own:
22
+
23
+ | Command | Installs into |
24
+ |---|---|
25
+ | `npx agents-handoff --claude` | `~/.claude/skills` — Claude Code |
26
+ | `npx agents-handoff --codex` | `~/.codex/skills` — Codex CLI |
27
+ | `npx agents-handoff --agents` | `~/.agents/skills` — the harness-neutral store |
28
+ | `npx agents-handoff --harness claude,codex` | the named harnesses, in one run |
29
+ | `npx agents-handoff --project --claude` | `./.claude/skills` — this repository only |
30
+ | `npx agents-handoff --skills-dir <dir>` | any other stack, exactly |
31
+
32
+ Without a harness flag the installer resolves the global root rather than hard-coding one and
33
+ reports which it chose — `npx agents-handoff where` prints the same decision on its own.
34
+
35
+ ### Or straight from the repository
36
+
37
+ ```bash
38
+ npx github:Alot1z/agent-handoff --claude # run the installer from GitHub, no npm
39
+ ```
40
+
41
+ ```bash
42
+ git clone https://github.com/Alot1z/agent-handoff.git
43
+ cd agent-handoff
44
+ node install/install.mjs --all # the same installer, run from the tree
45
+ ```
46
+
47
+ ### Update it, and check it against the published package
48
+
49
+ ```bash
50
+ npx agents-handoff --update # every installation found, one run
51
+ npx agents-handoff --verify --provenance # every installation, against its own record
52
+ npx agents-handoff --verify-package --record # against the tarball npm is serving
53
+ npx agents-handoff --doctor # what is here, and is it intact
54
+ npx agents-handoff --remove # removes the skill; your store is kept
23
55
  ```
24
56
 
25
- The installer resolves the global root instead of hard-coding one. The resolution order,
26
- the location targets and the requirements are in the
57
+ Every install writes `.agents-handoff-install.json` beside the skill: a sha256 over the
58
+ installed file set, what it was installed from, and a `package` block naming the version it
59
+ should match. `verify` recomputes that hash and fails when a file changed, so an installation
60
+ is checkable rather than merely present; `verify-package` fetches the published tarball,
61
+ checks it against the registry's own integrity and shasum, and compares the installed files
62
+ with the package file by file — `--record` stores the tarball hashes in the install record.
63
+ `update` and `verify` with no harness flag act on **every** installation found, and `remove`
64
+ deletes only what the install manifest owns, printing what it kept, so a store survives under
65
+ any name. The resolution order, the location targets and the requirements are in the
27
66
  **[installation guide](https://alot1z.github.io/agent-handoff/INSTALL.html)** and
28
67
  [docs/INSTALL.md](docs/INSTALL.md).
29
68
 
@@ -86,13 +125,14 @@ Full documentation is published at **<https://alot1z.github.io/agent-handoff/>**
86
125
 
87
126
  ```
88
127
  tools/handoff.mjs capture engine (the CLI above)
89
- tools/agent-handoff.mjs runtime layer: auto, verify-gate, promote, merge, self-improve, index, dispatch
128
+ tools/agents-handoff.mjs runtime layer: auto, verify-gate, promote, merge, self-improve, index, dispatch
129
+ tools/agent-handoff.mjs forwarder to the above, kept so older notes keep working
90
130
  tools/runtime-engine.mjs bounded execution and the permission gate
91
131
  tools/capability-registry.mjs capability health probes
92
132
  tools/lib/ shared store-root resolution
93
133
  docs/ refs/ templates/ documentation, reference material, output templates
94
134
  schemas/ handoff payload and configuration schemas
95
- install/ the npx installer package
135
+ install/ the installer behind the agents-handoff npx package
96
136
  tests/ acceptance fixture and a minimal transcript
97
137
  ```
98
138
 
package/SKILL.md CHANGED
@@ -1,12 +1,12 @@
1
1
  ---
2
- name: agent-handoff
2
+ name: agents-handoff
3
3
  description: >-
4
4
  Write, verify, and hand off complete AI working sessions across any harness
5
5
  (Claude Code, Codex, DeepSeek Harness, plain JSONL or text logs). Captures a
6
6
  session as a portable, sha256-proven handoff folder a fresh agent can continue
7
7
  from with zero shared memory, with versioned contracts, an evidence gate, and
8
8
  backup/verify/rollback on every write. Zero runtime dependencies, no network.
9
- version: 2.0.2
9
+ version: 2.0.3
10
10
  domain: orchestration
11
11
  tokens: 900
12
12
  allowed-tools: Bash(node:*), Read, Edit, Write
@@ -25,8 +25,8 @@ conversation anywhere, with provenance for every artifact.
25
25
  | **L1 Metadata** | Always (frontmatter above) | ~100 | name + description |
26
26
  | **L2 Instructions** | This file, when triggered | <5k | core workflow + commands below |
27
27
  | **L3 Resources** | As needed | none until read | `docs/`, `templates/`, `refs/`, `tools/handoff.mjs` |
28
- | **L4 Dynamic** | When you need runtime/self-adapting | none until run | `tools/agent-handoff.mjs`: auto, verify-gate, promote, merge, self-improve |
29
- | **L5 Collaborative** | Verified handoff dispatches a worker | none until run | `tools/agent-handoff.mjs` dispatch + `docs/LEVEL5.md` |
28
+ | **L4 Dynamic** | When you need runtime/self-adapting | none until run | `tools/agents-handoff.mjs`: auto, verify-gate, promote, merge, self-improve |
29
+ | **L5 Collaborative** | Verified handoff dispatches a worker | none until run | `tools/agents-handoff.mjs` dispatch + `docs/LEVEL5.md` |
30
30
 
31
31
  ## What this skill is (capabilities + contracts)
32
32
 
@@ -100,13 +100,13 @@ FOLLOW_UP:
100
100
 
101
101
  ### D. Level 4 runtime + L5 dispatch
102
102
  ```bash
103
- HANDOFFS_ROOT=<store> node tools/agent-handoff.mjs auto --source <file> --session <id> --harness <h> --project <p>
104
- HANDOFFS_ROOT=<store> node tools/agent-handoff.mjs verify-gate <id-prefix>
105
- HANDOFFS_ROOT=<store> node tools/agent-handoff.mjs promote <id-prefix>
106
- HANDOFFS_ROOT=<store> node tools/agent-handoff.mjs merge <a> <b>
107
- HANDOFFS_ROOT=<store> node tools/agent-handoff.mjs self-improve
108
- HANDOFFS_ROOT=<store> node tools/agent-handoff.mjs index
109
- HANDOFFS_ROOT=<store> node tools/agent-handoff.mjs dispatch <id-prefix> --task "<objective>" [--broker <orchestrator-root> --live]
103
+ HANDOFFS_ROOT=<store> node tools/agents-handoff.mjs auto --source <file> --session <id> --harness <h> --project <p>
104
+ HANDOFFS_ROOT=<store> node tools/agents-handoff.mjs verify-gate <id-prefix>
105
+ HANDOFFS_ROOT=<store> node tools/agents-handoff.mjs promote <id-prefix>
106
+ HANDOFFS_ROOT=<store> node tools/agents-handoff.mjs merge <a> <b>
107
+ HANDOFFS_ROOT=<store> node tools/agents-handoff.mjs self-improve
108
+ HANDOFFS_ROOT=<store> node tools/agents-handoff.mjs index
109
+ HANDOFFS_ROOT=<store> node tools/agents-handoff.mjs dispatch <id-prefix> --task "<objective>" [--broker <orchestrator-root> --live]
110
110
  ```
111
111
  Dispatch re-runs the evidence gate first; carries manifest sha256; dry-run by default
112
112
  (autonomy ladder: workflow-execute requires explicit --live).
@@ -137,7 +137,7 @@ Dispatch re-runs the evidence gate first; carries manifest sha256; dry-run by de
137
137
  | Fresh-session bootstrap | `refs/bootstrap.md` |
138
138
  | Brief discipline | `refs/brief-checklist.md` |
139
139
  | Engine source | `tools/handoff.mjs` |
140
- | L4 runtime | `tools/agent-handoff.mjs` |
140
+ | L4 runtime | `tools/agents-handoff.mjs` |
141
141
  | L4/L5 design | `docs/LEVEL4.md`, `docs/LEVEL5.md` |
142
142
  | Cross-harness adapters | `refs/ADAPTERS.md` |
143
143
  | Handoff format + schema | `docs/FORMAT.md`, `templates/` |
@@ -11,7 +11,7 @@
11
11
  {
12
12
  "id": "filesystem.write",
13
13
  "kind": "dir-writable",
14
- "target": ".agent-handoff",
14
+ "target": ".agents-handoff",
15
15
  "required": true,
16
16
  "purpose": "persist runtime state and checkpoints"
17
17
  },
@@ -11,7 +11,7 @@ elsewhere means either pasting the chat back in, or starting from memory. Both l
11
11
  that matters: the exact turns, the tool calls, and the ability to prove which source bytes
12
12
  produced the brief you are reading.
13
13
 
14
- agent-handoff turns the session into files instead. A directory of plain text and JSON, a
14
+ agents-handoff turns the session into files instead. A directory of plain text and JSON, a
15
15
  hash chain over it, and a fixed folder layout. Anything that can read a file can continue
16
16
  from one, with no shared memory between the two sessions.
17
17
 
@@ -22,10 +22,10 @@ Five layers, each with one job, and each usable without the ones above it.
22
22
  | Layer | File | Job |
23
23
  |---|---|---|
24
24
  | Capture engine | `tools/handoff.mjs` | Turns one transcript into one handoff folder. Passive: something has to invoke it. |
25
- | Runtime layer | `tools/agent-handoff.mjs` | Acts on the state of the store: staleness, gates, composition, imports, index. |
25
+ | Runtime layer | `tools/agents-handoff.mjs` | Acts on the state of the store: staleness, gates, composition, imports, index. |
26
26
  | Bounded execution | `tools/runtime-engine.mjs` | Decides whether an operation may run, before running it. |
27
27
  | Capability probes | `tools/capability-registry.mjs` | Reports what a declared capability actually does on this machine. |
28
- | Distribution | `install/install.mjs` | Puts the skill where a client will look for it. |
28
+ | Distribution | `install/install.mjs` | Puts the skill where a client will look for it — one harness, several at once, or an exact directory — and records what it installed. |
29
29
 
30
30
  The capture engine has no opinion about installation, and the runtime layer has no opinion
31
31
  about transcripts — it shells out to the engine for builds and verification. That split is
@@ -90,6 +90,23 @@ What the chain detects: a manifest edited by hand, a truncated or extended timel
90
90
  payload that no longer parses. What it does not do is prove that the source was authentic —
91
91
  read [PROVENANCE.md](PROVENANCE.md) for the precise boundary.
92
92
 
93
+ ## Install provenance
94
+
95
+ A handoff folder proves what it was built from. An installation answers a different question:
96
+ what is on this machine, and where did it come from. The installer writes
97
+ `.agents-handoff-install.json` into every copy it makes, and `verify` re-hashes the same file
98
+ set to compare the copy with that record.
99
+
100
+ | Value | Definition |
101
+ |---|---|
102
+ | `files_sha256` | SHA-256 over the sorted `path\0sha256(file)` lines of every manifest file. |
103
+ | `files` | Per-file sha256 values, so a mismatch names the file that changed. |
104
+ | `source` | `tree` for a copy made from a checkout or archive beside the installer, or `archive` with the tag and the archive's own sha256 when the copy was fetched. |
105
+
106
+ The install record is a record, not a signature: it proves what was installed and detects
107
+ drift, and it cannot prove the tree it came from was trustworthy. That distinction is stated
108
+ in full in [PROVENANCE.md](PROVENANCE.md).
109
+
93
110
  ## Concurrency and write safety
94
111
 
95
112
  Every mutating runtime command takes a lock before touching the store. Locks live in
@@ -145,19 +162,25 @@ stated in the command reference rather than left for a caller to discover.
145
162
 
146
163
  ```
147
164
  tools/handoff.mjs capture engine
148
- tools/agent-handoff.mjs runtime layer
165
+ tools/agents-handoff.mjs runtime layer
166
+ tools/agent-handoff.mjs forwarder from the runtime layer's pre-rename path
149
167
  tools/runtime-engine.mjs bounded execution
150
168
  tools/capability-registry.mjs capability probes
151
169
  tools/lib/handoff-root.mjs store-root resolution (single owner)
152
170
  tools/handoff.test.mjs the hermetic test suite
153
171
  docs/ this documentation and the Pages site
172
+ docs/SESSIONS.md the session index, rendered from a real store
173
+ .github/scripts/ generators and checks: the session index, the doc link check
154
174
  refs/ reference material: adapters, protocol, roles, brief checklist
155
175
  templates/ handoff templates and the LLM payload schema
156
176
  schemas/ the portable handoff payload schema
157
- install/ the npx installer package
177
+ install/ the installer behind the agents-handoff npx package
158
178
  tests/ acceptance fixture and a minimal transcript
159
179
  ```
160
180
 
181
+ Inside an installed copy — not in this repository — the installer adds
182
+ `.agents-handoff-install.json`, the record of what landed there and what it was made from.
183
+
161
184
  The documentation site at <https://alot1z.github.io/agent-handoff/> is built by GitHub Pages
162
185
  directly from `docs/`. `docs/_data/nav.yml` is the navigation, `docs/_config.yml` is the
163
186
  Jekyll configuration, and `.github/scripts/check-docs.mjs` fails CI when a page is missing
package/docs/CHANGELOG.md CHANGED
@@ -4,7 +4,7 @@ title: Changelog
4
4
 
5
5
  # Changelog
6
6
 
7
- All notable changes to agent-handoff are recorded here.
7
+ All notable changes to agents-handoff are recorded here.
8
8
 
9
9
  The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project
10
10
  adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). Releases before 2.0.0
@@ -12,15 +12,57 @@ were development builds and were never published, so they are not listed.
12
12
 
13
13
  The version in [package.json](https://github.com/Alot1z/agent-handoff/blob/main/package.json)
14
14
  and [skill.json](https://github.com/Alot1z/agent-handoff/blob/main/skill.json) is the release
15
- version. The version of the separate installer package is in
16
- [install/package.json](https://github.com/Alot1z/agent-handoff/blob/main/install/package.json)
17
- and has its own
18
- [changelog](https://github.com/Alot1z/agent-handoff/blob/main/install/CHANGELOG.md).
15
+ version, and it is the version published to npm: the repository root is the
16
+ [`agents-handoff`](https://www.npmjs.com/package/agents-handoff) package.
19
17
 
20
18
  ## [Unreleased]
21
19
 
22
20
  Add entries under the matching heading as changes land.
23
21
 
22
+ ## [2.0.3] - 2026-10-09
23
+
24
+ ### Added
25
+
26
+ - **Named harness targets.** One run can install the skill into Claude Code, Codex CLI and the
27
+ harness-neutral `~/.agents/skills` at once: `--claude`, `--codex`, `--agents`,
28
+ `--harness claude,codex` (repeatable), `--all` for every harness whose directory exists on
29
+ this machine, `--skills-dir <dir>` for any other stack, and `--project` for the
30
+ per-repository form. Every target gets its own copy and its own install record.
31
+ - **`verify-package`**, a verb that checks an installation against the package npm is actually
32
+ serving for its version: it verifies the downloaded tarball against the registry's own
33
+ `integrity` and `shasum`, compares the published file set with the installed one file by
34
+ file, and compares the tarball sha256 with the value recorded for that install. `--record`
35
+ stores the tarball hashes in the install record, so later runs compare with a stored value.
36
+ - The install record (`.agents-handoff-install.json`) now carries a `package` block — name,
37
+ version, registry, tarball URL, and the sha256/sha512/integrity/shasum filled in by
38
+ `verify-package` — so an installation can be checked against the published artifact rather
39
+ than only against itself.
40
+ - Installing from the repository without publishing: `npx github:Alot1z/agent-handoff` runs the
41
+ same installer straight from GitHub, and the installation guide documents both that and the
42
+ clone-and-run path.
43
+ - Five installer behaviour tests — multi-harness install with a record per target, `--update`
44
+ over every installation, `--verify` failing on a tampered copy, `remove` keeping user data,
45
+ and `verify-package` refusing a version npm does not serve. The suite is 34 tests.
46
+
47
+ ### Changed
48
+
49
+ - `--update` and `--verify` with no harness flag now act on **every** installation found on the
50
+ machine instead of the one resolved target. A machine holding the skill in `~/.claude/skills`
51
+ and in `~/.agents/skills` has two copies, and updating only the resolved one left the other
52
+ silently stale; both verbs print a per-target summary.
53
+ - The runtime layer's entry point is `tools/agents-handoff.mjs`, matching the product name.
54
+ `tools/agent-handoff.mjs` is installed alongside it as a forwarder, so notes and scripts that
55
+ name the old path keep working.
56
+
57
+ ### Fixed
58
+
59
+ - `remove` deleted anything that was not one of three expected directory names, which meant a
60
+ handoff store kept under any other name was destroyed by `remove --force`. Removal is now
61
+ driven by the install manifest — what an install owns is what it copied — and the run prints
62
+ the entries it deliberately kept, including the store and `handoff.config.json`.
63
+
64
+ ## [2.0.2] - 2026-10-09
65
+
24
66
  ### Added
25
67
 
26
68
  - **[Session index](https://alot1z.github.io/agent-handoff/SESSIONS.html)** (`docs/SESSIONS.md`):
@@ -30,16 +72,19 @@ Add entries under the matching heading as changes land.
30
72
  the engine from the two transcripts this repository ships, and
31
73
  `.github/scripts/build-sessions-index.mjs --check` fails the build when the page and the store
32
74
  disagree.
33
- - The installer is published to npm from the release workflow: a tag publishes `install/` as
34
- `agents-handoff`, skips a version npm already has, and reports — without failing the
35
- release — when `NPM_TOKEN` is not configured.
75
+ - The skill is published to npm as
76
+ [`agents-handoff`](https://www.npmjs.com/package/agents-handoff), from the repository root,
77
+ and the release workflow publishes it on a tag: it skips a version npm already has, and
78
+ reports — without failing the release — when `NPM_TOKEN` is not configured. The package
79
+ carries the skill tree, so `npx agents-handoff` installs with no download.
80
+ - `npm test`, `npm run check:docs` and `npm run check:session-index` are wired into
81
+ `prepublishOnly`, so a tree whose suite, links or session index are stale cannot be published.
36
82
 
37
83
  ### Changed
38
84
 
39
- - `npx agents-handoff` now installs the skill as documented. The published package
40
- carries `install/` alone, so the installer downloads the archive for the requested version and
41
- copies from it. It previously looked for the skill files beside itself, found none, and
42
- reported success while installing nothing.
85
+ - `npx agents-handoff` now installs the skill as documented. It previously looked for the skill
86
+ files beside itself, found none, and reported success while installing nothing; a bare copy of
87
+ `install/` still falls back to downloading the archive for the requested version.
43
88
  - The clean-checkout suite builds its fixture from the shipped projection rather than the
44
89
  development tree, which is what let the installer's broken source paths pass every local test.
45
90
 
@@ -50,7 +95,7 @@ Add entries under the matching heading as changes land.
50
95
  the development tree has. Sources are written in the shipped tree's terms and resolved against
51
96
  both layouts, and an install that cannot resolve a source now fails with the missing paths
52
97
  instead of warning and continuing.
53
- - CI failed on every run: the runtime-layer smoke test ran `agent-handoff.mjs list`, which is not
98
+ - CI failed on every run: the runtime-layer smoke test ran `agents-handoff.mjs list`, which is not
54
99
  a verb of that tool (it exits 2). The step builds a handoff into a scratch store and runs
55
100
  `index`, a verb that exists.
56
101
  - The shipped version disagreed across files: `SKILL.md` said 2.0.0 while `skill.json` and
@@ -108,7 +153,7 @@ documentation site.
108
153
 
109
154
  ### Added
110
155
 
111
- - **Capture engine** (`tools/handoff.mjs`, published as the `agent-handoff` bin). `build`
156
+ - **Capture engine** (`tools/handoff.mjs`, published as the `agents-handoff` bin). `build`
112
157
  reads a JSONL or plain-text transcript and writes a handoff directory:
113
158
  `HANDOFF.md`, `HANDOFF.summary.json`, `HANDOFF.llm.json`, `timeline.jsonl`, `TOOLS.md`,
114
159
  `manifest.json`. Also `list`, `show`, `verify`, `rename`, `retitle` and `config`.
@@ -122,7 +167,7 @@ documentation site.
122
167
  - **Store-root resolution** (`tools/lib/handoff-root.mjs`): `HANDOFFS_ROOT`, then
123
168
  `handoff.config.json` found by walking up, then a `handoffs/` directory on the same walk,
124
169
  then the skill directory. Reported by `handoff.mjs config`.
125
- - **Runtime layer** (`tools/agent-handoff.mjs`): `auto`, `verify-gate`, `promote`, `merge`,
170
+ - **Runtime layer** (`tools/agents-handoff.mjs`): `auto`, `verify-gate`, `promote`, `merge`,
126
171
  `federated-merge`, `self-improve`, `index`. Every mutating command takes a lock, backs up
127
172
  before writing, verifies after applying, and rolls back on failure.
128
173
  - **Bounded execution** (`tools/runtime-engine.mjs`): risk classes `R0`–`R4` evaluated against
@@ -132,8 +177,8 @@ documentation site.
132
177
  `command` probes that report `healthy` / `unhealthy` / `unknown` with the evidence behind
133
178
  each verdict.
134
179
  - **Installer** (`install/`, package `agents-handoff`): `install`, `update`, `remove`,
135
- `verify`, `list`, `where`, targeting a resolved global root, `./local/skills/agent-handoff`,
136
- or `./skills/agent-handoff`.
180
+ `verify`, `list`, `where`, targeting a resolved global root, `./local/skills/agents-handoff`,
181
+ or `./skills/agents-handoff`.
137
182
  - **Documentation site** at <https://alot1z.github.io/agent-handoff/>, built by GitHub Pages
138
183
  from `docs/`.
139
184
  - **CI** (`.github/workflows/ci.yml`): the test suite on Node 18, 20 and 22, a runtime-layer