wowbagger 0.5.0-beta.0 → 0.5.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
@@ -7,6 +7,65 @@ consolidation. The first tagged release inherits this file.
7
7
 
8
8
  ## Unreleased
9
9
 
10
+ ## 0.5.0 - 2026-09-05
11
+
12
+ - **The report is one decision-focused workspace.** Items, Flow, and
13
+ Dependencies sit behind accessible view navigation; only the selected section
14
+ shows, and a reader without scripting keeps every section through anchors and
15
+ native `details`. The duplicated Work next and Attention lists are gone: one
16
+ canonical list carries five quick views (Work next, In progress, Blocked,
17
+ Needs triage, All open), one canonical detail per retained item, a desktop
18
+ list/detail split, and inline details below 1100px. Search plus facet groups
19
+ are the shared scope for the summaries, Flow, and the graph; quick views and
20
+ Show history change only the list. Opening a detail no longer clears the
21
+ search or facets, and a detail opened from Flow or Dependencies returns to
22
+ Items with the scope intact. Missing metadata is its own `Missing` chip,
23
+ distinct from a literal `Unclassified` value, and `tags` is projected as a
24
+ multi-value mapped field with per-field coverage counts.
25
+ - **Concentrations and blockers lead to exact items.** Scoped attention
26
+ actions, an area/status matrix with count and blocked count per cell, and
27
+ scoped members of the existing area-diverse batches each open a labelled
28
+ drilldown of their contributing items. Item details state downstream reach
29
+ and, separately, the items that become ready if done, derived once at
30
+ generation from the complete ledger and exposed to the browser as an
31
+ immutable `impactById`; excluded named-view items never enter it. Core
32
+ readiness and the recommended order are unchanged.
33
+ - **Flow is scoped and interactive.** Flow recomputes in the browser from the
34
+ scoped open and terminal population with inclusive From/To range controls
35
+ that refuse an invalid range visibly while keeping the last valid charts.
36
+ Weekly buckets, aging cells, completion samples, and cumulative date/band
37
+ selections drill into exact contributing items, including now-closed items
38
+ accepted on the selected date. Closures and done are named separately, the
39
+ forecast is computed only when Flow first opens, and an item killed straight
40
+ from triage no longer counts as missing acceptance history.
41
+ - **The graph follows the shared scope.** The graph-only status filter is
42
+ removed; nodes, induced links, labels, and the roster follow the report
43
+ scope, node and roster selections open the canonical detail, and downstream
44
+ and ready-if-done actions drill into the same sets the detail names. The
45
+ graph starts only when Dependencies first opens, pauses while hidden, and
46
+ probes WebGL once. The legend, the WebGL-less roster, reduced motion, the
47
+ vendored bundle pin, and the no-fetch content security policy are unchanged.
48
+ - `scripts/report-design-demo.js` publishes a deterministic, explicitly
49
+ synthetic report through the real pipeline for browser verification.
50
+ - **Stable and prerelease channels are defined.** A stable release sets both
51
+ `latest` and `next` to the stable version; a later prerelease moves only
52
+ `next` while `latest` stays on stable. Publish stable releases with
53
+ `npm publish --tag latest` and prereleases with `npm publish --tag next`.
54
+ - **Release tooling is version-aware.** The cut still proves exact version-site
55
+ equality and never edits the manifest; publication and channel verification
56
+ follow the stable-or-prerelease target state above.
57
+
58
+ The alpha.14 hard cutover remains the baseline: `claim-store-unavailable`
59
+ answers **The durable claim store is unavailable.** with
60
+ `claim-store-unreadable`; upgrade every writer before the first alpha.14 create.
61
+ There is no automatic migration or mixed-version grace period. There is no
62
+ batch mutation. The create-then-commit loop, implemented most briefly as serial
63
+ `create --auto-commit`, remains the supported bulk path. Ledger item #186 records the
64
+ permanent no-batch decision, and item #182 owns existing duplicate numbers.
65
+ The fence adds no new Git roster or history
66
+ traversal and costs two extra fsync'd journal appends within the 65,536-entry
67
+ limit.
68
+
10
69
  ## 0.5.0-beta.0 - 2026-08-30
11
70
 
12
71
  - Promote Wowbagger from alpha to beta while keeping `next` as the documented
package/README.md CHANGED
@@ -30,16 +30,17 @@ agent to use those guarantees instead of hand-editing your Markdown.
30
30
 
31
31
  **Start here:** [install the core and set up a ledger](#start-here).
32
32
 
33
- > **Status: beta, published, and self-hosted.** `0.5.0-beta.0` is on npm under
34
- > the `next` tag and on this repository's `v0.5.0-beta.0` tag. It is the
35
- > version this repository runs its own backlog on. The API remains pre-stable
36
- > and can change before the first stable release.
33
+ > **Status: published and self-hosted.** `0.5.0` is published on npm and has
34
+ > a matching repository tag. It is the version this repository runs its own
35
+ > backlog on. The API is stable at core contract version 5.
37
36
  >
38
- > **Install with `@next`.** Every published release is a prerelease. The
39
- > registry requires a `latest` dist-tag, so `latest` mirrors `next` — a bare
40
- > `npm install wowbagger` resolves to the current prerelease rather than an
41
- > older build — but `@next` is the documented install and the explicit
42
- > statement that you accept a prerelease.
37
+ > **Channels.** A stable release sets both `latest` and `next` to the stable
38
+ > version and publishes with `npm publish --tag latest`. A later prerelease
39
+ > moves only `next` and publishes with `npm publish --tag next`, so `latest`
40
+ > stays on the stable release. While every published release is a prerelease,
41
+ > `latest` mirrors `next`: install the prerelease explicitly with
42
+ > `wowbagger@next`. After the first stable release, a bare install resolves
43
+ > to the stable release.
43
44
  >
44
45
  > **What is proved.** Contract version **5** validates the complete Markdown
45
46
  > ledger, selects a deterministic ready queue, exposes bounded `list` and
@@ -50,11 +51,12 @@ agent to use those guarantees instead of hand-editing your Markdown.
50
51
  > verification, and publication finalization coordinate cooperating writers
51
52
  > without pretending to be an exclusive dispatch lock.
52
53
  >
53
- > `report` is a self-contained sequencing dashboard: **Work next**, **Attention**,
54
- > facet filters, inline evidence, terminal history, area-diverse batches, and a
55
- > 3D dependency graph. Version 2 report configurations add named custom views
56
- > whose statistics, readiness, attention, evidence, graph, and drill-down all
57
- > describe one filtered subset. Reports remain derived output, not mirrored
54
+ > `report` is a self-contained decision workspace: one scoped item browser with
55
+ > **Work next** and other quick views, an area/status matrix, scoped attention
56
+ > actions, dependency impact, interactive Flow charts, and a 3D dependency
57
+ > graph that all share one scope. Version 2 report configurations add named
58
+ > custom views whose statistics, readiness, attention, flow, graph, and impact
59
+ > all describe one filtered subset. Reports remain derived output, not mirrored
58
60
  > ledger state.
59
61
  >
60
62
  > The core ships Claude Code, Codex, and OpenCode adapter packages on one shared
@@ -77,7 +79,7 @@ Wowbagger is the core authority for a Git-native work ledger. Use it instead
77
79
  of editing ledger Markdown by hand.
78
80
 
79
81
  ```sh
80
- wowbagger --version # require 0.5.0-beta.0
82
+ wowbagger --version # require 0.5.0
81
83
  wowbagger capabilities --json # require contract_version: 5
82
84
  wowbagger validate --ledger ledger --json
83
85
  wowbagger ready --ledger ledger --as-of YYYY-MM-DD --json
@@ -104,10 +106,11 @@ Install the core CLI, then verify it. The supported runtime is Node.js 24; Node
104
106
  26 remains excluded because of the separate Vitest incompatibility:
105
107
 
106
108
  ```sh
107
- npm install -g wowbagger@0.5.0-beta.0 # exact plugin-matched release
109
+ npm install -g wowbagger@latest # stable release
110
+ npm install -g wowbagger@0.5.0 # exact plugin-matched release
108
111
  # or, from this release's Git tag:
109
- # npm install -g github:lstutzman/wowbagger#v0.5.0-beta.0
110
- wowbagger --version # 0.5.0-beta.0
112
+ # npm install -g github:lstutzman/wowbagger#v0.5.0
113
+ wowbagger --version # 0.5.0
111
114
  wowbagger capabilities --json # must report contract_version: 5
112
115
  ```
113
116
 
@@ -334,7 +337,7 @@ Four separate things, deliberately:
334
337
 
335
338
  The core and the plugin install independently and must carry matching
336
339
  distribution versions. The core contract version and the adapter contract
337
- version are separate domains: the core is at **3**, the adapter is at **2**, and
340
+ version are separate domains: the core is at **5**, the adapter is at **2**, and
338
341
  the legacy work-claim, ledger-publication, and ledger-mutation envelopes stay at
339
342
  **1**.
340
343
 
@@ -345,12 +348,14 @@ the legacy work-claim, ledger-publication, and ledger-mutation envelopes stay at
345
348
  Wowbagger ships as an npm package with a single `wowbagger` binary. There are
346
349
  two supported install routes:
347
350
 
348
- - **npm registry** — `npm install -g wowbagger@next` installs the current
349
- prerelease. `@next` is the documented spelling; `latest` mirrors it (the
350
- registry requires a `latest` tag), so a bare install resolves to the same
351
- bytes.
351
+ - **npm registry** — `npm install -g wowbagger` installs the stable release
352
+ once it exists; `npm install -g wowbagger@next` installs the newest
353
+ prerelease. While every published release is a prerelease, `latest` mirrors
354
+ `next`, so a bare install resolves to the same bytes. After the first
355
+ stable release, `latest` stays on stable and only `next` follows later
356
+ prereleases.
352
357
  - **git tag** —
353
- `npm install -g github:lstutzman/wowbagger#v0.5.0-beta.0` installs this
358
+ `npm install -g github:lstutzman/wowbagger#v0.5.0` installs this
354
359
  release. Installing at a ref installs the core and every adapter that ref
355
360
  carries.
356
361
 
@@ -373,8 +378,9 @@ sending the request and reading the refusal — an `unknown-member` issue at
373
378
  `/set/body_append` means the core predates the append — or pin the distribution
374
379
  version.
375
380
 
376
- - **Node.js:** 20 and later. The adapter conformance vectors run against Node
377
- 20 and the current runtime before each release.
381
+ - **Node.js:** 24 and later. The release gate runs the full suite on Node
382
+ 24.20.0 with the strict deprecation gate; Node 26 stays excluded because of
383
+ the separate Vitest incompatibility.
378
384
  - **Platforms:** the core runs wherever Node.js runs. The Claude Code adapter
379
385
  declares Darwin, Linux, and Windows `supported` from native common-vector
380
386
  evidence. Every other shipped adapter target remains `unverified`.
@@ -421,8 +427,8 @@ wowbagger core, this is how you move forward safely.
421
427
  Upgrade the pieces you installed:
422
428
 
423
429
  ```sh
424
- npm install -g wowbagger@next # public npm registry
425
- npm install -g github:lstutzman/wowbagger#v0.5.0-beta.0 # immutable Git release
430
+ npm install -g wowbagger@latest # public npm registry
431
+ npm install -g github:lstutzman/wowbagger#v0.5.0 # immutable Git release
426
432
  git pull && npm ci # or: a direct checkout
427
433
  ```
428
434
 
@@ -445,7 +451,7 @@ distribution versions equal.
445
451
 
446
452
  The shipped adapter selects only adapter contract version 2 and requires core
447
453
  contract version 5. The adapter contract and the core contract are separate
448
- version domains: the adapter stays at 2 while the core moves to 4. A v1-only
454
+ version domains: the adapter stays at 2 while the core is at 5. A v1-only
449
455
  consumer receives `unsupported-adapter-contract-version`; it does not receive v2
450
456
  behavior. The schema-2 transport is available. Ledger migration remains a
451
457
  separate quiesced maintenance operation. The
@@ -920,62 +926,108 @@ relative `--out` overrides resolve from the caller's working directory.
920
926
  "complexity": "/complexity",
921
927
  "rank": "/priority_rank",
922
928
  "class": "/class",
923
- "due": "/due"
929
+ "due": "/due",
930
+ "tags": "/tags"
924
931
  },
925
932
  "swarm": { "eligible_complexities": ["small", "medium"] }
926
933
  }
927
934
  ```
928
-
929
935
  `repository.logo`, `fields`, and `swarm` are optional. Field values resolve
930
936
  from parsed frontmatter with RFC 6901 JSON Pointers. A swarm requires mapped
931
937
  `area` and `complexity` fields. The report fetches nothing at view time.
932
938
 
933
- The report is a **sequencing dashboard**, not a state snapshot. It opens with
934
- **Work next**: the ready set in a recommended order, each entry carrying the
935
- factors that placed it. Below it sit **Attention** (blocked work naming its
936
- blockers, the oldest open work, and started work past this ledger's own
937
- 85th-percentile cycle time), then the **evidence layer**, then the **ledger
938
- graph**. State counts, item cards, filters, grouping, detail levels, terminal
939
- history, and area-diverse ready batches all remain, demoted below that decision
940
- surface.
941
-
942
- The drill-down filters are **facet groups**: Readiness, Status, Kind, and one
943
- group for every configured mapped field, each a fieldset of checkbox chips.
944
- Values inside a group are alternatives and groups narrow each other, so
945
- `ready` or `blocked` in Readiness plus `bug` in Class means ready-or-blocked
946
- bugs; the search box is one more condition on the same answer. Every chip
947
- carries the count it would leave, measured against the search and the other
948
- groups but never against its own, so two selections in one group cannot make
949
- their siblings read zero. The result count states how much of the open set is
950
- showing, and **Clear filters** gives every selection back. A Work next or
951
- Attention row still reaches its card: opening one clears the facets and the
952
- search first, because a row that names an item promises the item can be seen.
953
-
954
- The evidence layer is inline SVG, drawn at generation time and embedded in the
955
- file: an aging heatmap, weekly arrivals against completions, throughput with a
956
- four-week mean, a cumulative flow area, accept-to-complete cycle time, and a
957
- Monte Carlo forecast as 50, 85, and 95 percent bands. Each chart carries
958
- `role="img"` and an aria-label that states its finding in words, so the evidence
959
- survives a screen reader and a printout.
939
+ `tags` is the one multi-value mapped field. It accepts a nonempty string or an
940
+ array holding only nonempty strings: a scalar reads as a one-tag set, exact
941
+ duplicates collapse, and values sort deterministically. The mapping never
942
+ splits commas, lowercases values, coerces objects, or partially accepts a
943
+ mixed-type array. An empty array counts as missing; any other rejected value
944
+ is omitted from the item and counted as invalid metadata. `area` stays scalar.
945
+ The model carries `fieldCoverage`, one entry per configured field plus `area`
946
+ and `tags` when unmapped, ordered by field name with `present`, `missing`, and
947
+ `invalid` counts over the retained report population. An unmapped field counts
948
+ every retained item as missing, and a visible missing-mapping notice tells an
949
+ unconfigured mapping apart from missing item values. Missing metadata never
950
+ matches a filter value: there is no `Unclassified` bucket, so a filter for a
951
+ literal `Unclassified` tag matches only items really carrying that tag.
952
+
953
+ The report is a **decision-focused workspace**, not a state snapshot. It has
954
+ three sections behind accessible view navigation: **Items** (the default),
955
+ **Flow**, and **Dependencies**. Only the selected section is visible when
956
+ scripting runs; without scripting, every section stays readable through its
957
+ anchor and native `details` elements, and the artifact states its fixed scope.
958
+
959
+ Items opens with the state counts, then a sticky control strip: search, five
960
+ quick views (**Work next**, **In progress**, **Blocked**, **Needs triage**, and
961
+ **All open**), and the display controls (grouping, sorting, Basic/Standard/
962
+ Detailed, Show history, Expand all, Collapse all). Below 1100px the display
963
+ controls fold behind a **Display** toggle so search and quick views stay in
964
+ reach. Search and the facet groups form the **scope**; the scope narrows the
965
+ summaries, Flow, and Dependencies alike. Quick views and Show history change
966
+ only the list. Work next keeps its recommended order and prints the reasons
967
+ beside each row; any other sort presents itself as that sort.
968
+
969
+ There is one list and one canonical detail per retained item. Desktop widths
970
+ use a list/detail split; narrower widths show the selected detail inline.
971
+ Opening a detail never clears the search, the facets, or the list position, and
972
+ a detail opened from Flow or Dependencies returns to Items with the scope
973
+ intact. Expand all acts on visible rows only.
974
+
975
+ The **filters** are facet groups: Readiness, Status, Kind, Priority, and one
976
+ group for every configured mapped field, each a fieldset of checkbox chips
977
+ behind a collapsed **Filters** control. Values inside a group are alternatives
978
+ and groups narrow each other; the search box is one more condition on the same
979
+ answer. Every chip carries the count it would leave, measured against the
980
+ search and the other groups but never against its own. Missing metadata is its
981
+ own **Missing** chip, distinct from a literal `Unclassified` value. The result
982
+ count states how much of the retained set is showing, and **Clear filters**
983
+ gives every selection back.
984
+
985
+ Above the list sit scoped summaries that open exact contributing items through
986
+ a labelled drilldown pill: attention actions (in progress, blocked, needs
987
+ triage, oldest, and started work past this ledger's own 85th-percentile cycle
988
+ time), an **area/status matrix** with count and blocked count per cell, and
989
+ **Scoped members of existing batches**, which intersects the area-diverse
990
+ batches with the scoped ready set and omits empty batches. Each item detail
991
+ states its **downstream reach** (transitive dependents in the report) and,
992
+ separately, the items that become **ready if done**; neither alters core
993
+ readiness or the recommended order.
994
+
995
+ ### Flow
996
+
997
+ Flow recomputes from the scoped open and terminal population in the browser:
998
+ cumulative flow, weekly arrivals against closures with done counted
999
+ separately, throughput with a four-week mean, current aging by status,
1000
+ acceptance-to-completion samples, and the closure forecast. Inclusive **From**
1001
+ and **To** controls default to the twelve-week window; a start after the end,
1002
+ or an end after the report date, is refused with a visible error while the last
1003
+ valid charts stay. Weekly buckets, aging cells, completion samples, and
1004
+ cumulative date/band selections each drill into the exact contributing items,
1005
+ and the accessible tables offer the same actions. The forecast is computed only
1006
+ when Flow first opens and cached by cohort and range. Missing acceptance history
1007
+ is stated as reconstruction uncertainty; an item killed straight from triage is
1008
+ complete history, not a gap. The fixed server-rendered charts remain for
1009
+ readers without scripting, each with `role="img"` and an aria-label that states
1010
+ its finding in words.
960
1011
 
961
1012
  ### The ledger graph
962
1013
 
963
- Below the evidence layer the report draws the whole ledger as a force-directed
964
- 3D graph. Every item is a node, labelled `#N`, coloured by readiness for open
965
- items and by terminal status for closed ones, and sized by the same transitive
966
- unblocking leverage the recommended order uses. Edges run from a prerequisite
967
- or a parent to the item it releases: a `depends_on` edge is straight and
968
- arrowed, a `parent` edge is curved and unarrowed. Hovering or clicking a node
969
- opens a card with its number, title, status, age, leverage, and the same
970
- reasons line the ranked list prints for it.
971
-
972
- Above the stage sits one chip group of the lifecycle statuses the ledger holds,
973
- all selected, with **Select all** and **Clear**. Deselecting a status drops its
974
- nodes, every link that touched one of them, and their labels together, then
975
- reheats the layout in place: nothing is reloaded and the ledger is never
976
- touched. The roster and the node count follow the same selection, and clearing
977
- every status draws an empty graph that says it is empty rather than quietly
978
- showing the last one.
1014
+ Dependencies draws the scoped items as a force-directed 3D graph. Every item is
1015
+ a node, labelled `#N`, coloured by readiness for open items and by terminal
1016
+ status for closed ones, and sized by the same transitive unblocking leverage the
1017
+ recommended order uses. Edges run from a prerequisite or a parent to the item
1018
+ it releases: a `depends_on` edge is straight and arrowed, a `parent` edge is
1019
+ curved and unarrowed. Hovering a node opens a card with its number, title,
1020
+ status, age, leverage, and reasons; clicking it, or a roster row, opens the
1021
+ canonical detail in Items. Downstream and ready-if-done actions on the roster
1022
+ drill into the same sets the detail names.
1023
+
1024
+ The graph has no filter of its own: it follows the shared scope, so a scope
1025
+ change drops nodes, every link that touched one of them, and their labels
1026
+ together, then reheats the layout in place. A hidden blocker never turns a
1027
+ retained item ready, because readiness is projected over the complete ledger
1028
+ before any view narrows it. The graph starts only when Dependencies first
1029
+ opens, pauses while another section is shown, and an empty scope draws an
1030
+ empty graph that says so.
979
1031
 
980
1032
  The renderer is [`3d-force-graph`](https://github.com/vasturiano/3d-force-graph)
981
1033
  over Three.js, vendored into `vendor/3d-force-graph/` at a pinned version
@@ -1018,9 +1070,10 @@ weight and is shown as written.
1018
1070
  ### Named custom report views
1019
1071
 
1020
1072
  A named custom view is a second self-contained report generated from the same
1021
- complete ledger. Every section of it — statistics, **Work next**, **Attention**,
1022
- the evidence layer, the graph, the open-item drill-down, terminal history, and
1023
- the swarm batches — describes one configured subset, so the file is honest to
1073
+ complete ledger. Every section of it — statistics, **Work next** and the other
1074
+ quick views, the **Attention** summaries and area/status matrix, dependency
1075
+ impact, Flow, the graph, the drill-down pill, terminal history, and the
1076
+ swarm batches — describes one configured subset, so the file is honest to
1024
1077
  share as a scoped report. Excluded items are absent from the bytes rather than
1025
1078
  hidden by a stylesheet. The base report stays available and unchanged.
1026
1079
 
@@ -1085,9 +1138,10 @@ A `fields` key must also be a configured report field. Each field filter is a
1085
1138
  non-empty array of unique JSON strings, finite numbers, or booleans, and matching
1086
1139
  preserves JSON scalar type and value: stringification is not equality, so a
1087
1140
  mapped `2` does not answer a filter for `"2"`. An item carrying no mapped value
1088
- for a field matches no value selected for that field. No title-text inference,
1089
- regular expression, arbitrary JSON pointer, or body search belongs in a view
1090
- filter.
1141
+ for a field matches no value selected for that field. A `tags` filter uses
1142
+ any-member matching, so one item carrying two tags answers either tag. No
1143
+ title-text inference, regular expression, arbitrary JSON pointer, or body
1144
+ search belongs in a view filter.
1091
1145
 
1092
1146
  Wowbagger validates the complete ledger and computes readiness against the
1093
1147
  complete ledger before it filters, so excluding a blocker never makes blocked
@@ -1151,6 +1205,16 @@ current UTC date:
1151
1205
  npm run report -- --as-of YYYY-MM-DD
1152
1206
  ```
1153
1207
 
1208
+ If you verify the report in a browser from a checkout, generate a deterministic
1209
+ synthetic report through the real pipeline:
1210
+
1211
+ ```sh
1212
+ node scripts/report-design-demo.js --out /private/tmp/wowbagger-report-demo.html --items 40
1213
+ ```
1214
+
1215
+ That output is synthetic and checkout-only: it describes fixed demo data,
1216
+ never this repository's ledger.
1217
+
1154
1218
  ## Where the contracts live
1155
1219
 
1156
1220
  The README is the map. These are the territory, and they are normative where
@@ -1330,7 +1394,7 @@ It is the durable work ledger beneath those systems.
1330
1394
  **Shipped: the policy-input contract and the report's mapped fields keep
1331
1395
  consumer vocabulary out of the schema.**
1332
1396
  - Stabilize the machine-readable command contract and compatibility evidence.
1333
- **In progress at core contract version 5; the version is not frozen.**
1397
+ **Shipped: core contract version 5 is the stable contract.**
1334
1398
  - Ship Claude Code and Codex adapters. **Claude Code, Codex, and OpenCode
1335
1399
  packages share the version 2 engine; the Claude Code manifest declares Darwin
1336
1400
  `supported` after passing all 212 native assertions. Other adapter targets and
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wowbagger",
3
- "version": "0.5.0-beta.0",
3
+ "version": "0.5.0",
4
4
  "description": "Git-native work ledger for coding agents: deterministic ready queues, guarded CAS mutations, claims and fencing, and self-contained HTML reports.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -45,6 +45,10 @@
45
45
  "type": "string",
46
46
  "pattern": "^(/([^/~]|~[01])*)*$"
47
47
  },
48
+ "tags": {
49
+ "type": "string",
50
+ "pattern": "^(/([^/~]|~[01])*)*$"
51
+ },
48
52
  "class": {
49
53
  "type": "string",
50
54
  "pattern": "^(/([^/~]|~[01])*)*$"
@@ -45,6 +45,10 @@
45
45
  "type": "string",
46
46
  "pattern": "^(/([^/~]|~[01])*)*$"
47
47
  },
48
+ "tags": {
49
+ "type": "string",
50
+ "pattern": "^(/([^/~]|~[01])*)*$"
51
+ },
48
52
  "class": {
49
53
  "type": "string",
50
54
  "pattern": "^(/([^/~]|~[01])*)*$"
@@ -189,6 +193,7 @@
189
193
  "propertyNames": {
190
194
  "enum": [
191
195
  "area",
196
+ "tags",
192
197
  "class",
193
198
  "due",
194
199
  "rank",
@@ -14,7 +14,7 @@ publish something.
14
14
  Install the core separately before using this skill:
15
15
 
16
16
  ```sh
17
- npm install -g wowbagger@0.5.0-beta.0
17
+ npm install -g wowbagger@0.5.0
18
18
  ```
19
19
 
20
20
  The core requires Node.js 24 or later. This plugin ships only agent
@@ -38,9 +38,9 @@ wowbagger capabilities --json
38
38
 
39
39
  Read the plain distribution version from the first command and the top-level
40
40
  `contract_version` from the second. **This skill requires distribution version
41
- `0.5.0-beta.0` and core `contract_version: 5`.**
41
+ `0.5.0` and core `contract_version: 5`.**
42
42
 
43
- The distribution pin names the published `0.5.0-beta.0` release; the cut that
43
+ The distribution pin names the published `0.5.0` release; the cut that
44
44
  publishes core `contract_version: 5` moves it. Earlier cores report
45
45
  `contract_version: 3` or lower and lack behavior this skill requires, including
46
46
  the bounded item source, so the version check refuses them. Do not soften
@@ -146,8 +146,10 @@ the absolute `result.output`. On failure, require `ok: false` and inspect
146
146
  publication preserves the prior report. Do not parse the generated HTML and do
147
147
  not parse human output: the JSON result is the only machine surface.
148
148
 
149
- The report ends its decision surface with a 3D dependency graph of the items the
150
- artifact covers. Its renderer is a pinned, checksummed `3d-force-graph` build
149
+ The report is one shared Items, Flow, and Dependencies workspace. The
150
+ Dependencies section holds the 3D dependency graph of the items the artifact
151
+ covers, under the same scope as Items and Flow. Its renderer is a pinned,
152
+ checksummed `3d-force-graph` build
151
153
  vendored at `vendor/3d-force-graph/` and inlined at generation time, so the
152
154
  report is still one self-contained file that fetches nothing — it is roughly
153
155
  1.3 MB larger for it. A browser without WebGL shows the graph section's plain