@stofone/dsh-agent-roster 0.6.2 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,68 @@
2
2
 
3
3
  遵循 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/) 与 [SemVer](https://semver.org/lang/zh-CN/)。
4
4
 
5
+ ## [Unreleased]
6
+
7
+ ## [0.7.0] - 2026-11-02
8
+
9
+ ### Honest verification (issue #2)
10
+
11
+ - **`omitted` is split in two.** "The roster did not declare this field" and "the roster declared
12
+ a value, the runtime never persisted it" used to collapse into one status that the summary
13
+ counted as "not degraded". They are now `omitted` (nothing to check, expected) and
14
+ `not-persisted` (sent, no receipt, counted as degraded). `systemPrompt` lands in the second
15
+ bucket because `team.json` members have no `executionPrompt` key at all — the persona was
16
+ never actually verified before.
17
+ - **One predicate instead of three.** `isBindingFaithful` now delegates to
18
+ `summarizeBinding(...).faithful`, so the note and the implementation cannot drift apart again.
19
+ - **Four mutually exclusive buckets** in `roster_verify`: `faithful` / `unverified` / `drift` /
20
+ `missing`. `ok` requires `drift === 0 && missing === 0`, and `unverified` is printed on the
21
+ status line and the summary instead of hiding inside "degraded".
22
+ - **Materialised tool filters are visible.** Each member shows `deny`/`allow` counts and a
23
+ digest of the normalised list; the same `toolPolicy` materialising into two different deny
24
+ lists inside one team is reported as policy drift.
25
+ - **Provenance.** `roster_create` emits `roster:<id>@<version>#<sha8>` for the created team's
26
+ description; `roster_verify` parses it back and reports `absent` / `id-only` / `match` /
27
+ `differ` / `unknown-roster`. The plugin still never writes team state.
28
+ - **New tool `roster_diff`** — roster-to-roster diff for generation hand-over: members matched
29
+ by name (`aliases` are a hint, never auto-merged), effective values compared with their
30
+ origin, persona compared by length and hash only.
31
+
32
+ ### Capability requirements (new sibling file)
33
+
34
+ - **`capabilities.yaml`** — an optional file next to `roster.yaml` that declares what the
35
+ deployment must provide: `requires.skills`, `requires.toolPolicies`, `onMissing`
36
+ (`refuse` | `degraded`), `asOf` (date only) and `notes`. Unknown keys and unknown requirement
37
+ categories are errors: model routing, plugin versions, credential pointers and business
38
+ preconditions have no evidence source, so declaring them would only manufacture a new kind of
39
+ false green.
40
+ - **Three states, not two.** `checkCapabilities` answers `present` / `missing` / `unknown`;
41
+ only `missing` (the evidence source explicitly says no) trips the gate. `unknown` is neither a
42
+ pass nor a failure and is always printed.
43
+ - **`roster_create` refuses instead of warning.** With a `missing` requirement under
44
+ `onMissing: refuse` it emits no `agent_teams_add_member` argument at all and prints where each
45
+ requirement has to be installed. `onMissing: degraded` hands over the arguments and records
46
+ the debt.
47
+ - **`roster_verify`** gains `requires=<missing>missing/<declared>` and `capabilityBlocked` in its
48
+ status line, a capability section in the body, `ok` includes `capabilityBlocked === 0`, and a
49
+ structured `capabilities` field.
50
+ - **`roster_show`** prints the declaration block.
51
+ - New `schema/capabilities.v1.schema.json`, pinned to `lib/capabilities.js` by
52
+ `test/capabilities.test.js`.
53
+
54
+ - **The panel sees it.** Capability requirements surface as roster diagnostics: a missing
55
+ `toolPolicies` requirement is `error` under `refuse` (the sidebar badge turns red) and `warn`
56
+ under `degraded`; skill requirements are `capability-skills-unverified` / `info` because the
57
+ panel snapshot is synchronous and cannot enumerate the catalogue; an unset `knownToolPolicies`
58
+ yields one `capability-cross-check-skipped` entry naming the affected rosters.
59
+
60
+ ### Docs
61
+
62
+ - README (both languages): six tools, the new verification buckets, `roster_diff`, a
63
+ "one roster per directory, two generations per machine" section answering how to keep both
64
+ generations side by side, and a "capability requirements" section covering the three-state
65
+ check and the gate.
66
+
5
67
  ## [0.6.2] - 2026-10-30
6
68
 
7
69
  ### Packaging
@@ -201,5 +263,6 @@
201
263
  - 工具返回值含 `undefined` 键,运行时按 `value is not lossless JSON` 整次拒绝;缺失值统一写 `null`,
202
264
  且所有返回值先过 `lib/json.js#lossless`。
203
265
 
204
- [Unreleased]: https://github.com/STofone/dsh-agent-roster/compare/v0.2.0...main
266
+ [Unreleased]: https://github.com/STofone/dsh-agent-roster/compare/v0.7.0...main
267
+ [0.7.0]: https://github.com/STofone/dsh-agent-roster/releases/tag/v0.7.0
205
268
  [0.2.0]: https://github.com/STofone/dsh-agent-roster/releases/tag/v0.2.0
package/LICENSE CHANGED
@@ -1,21 +1,21 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 STofone
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
1
+ MIT License
2
+
3
+ Copyright (c) 2026 STofone
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.