wowbagger 0.1.0-alpha.7 → 0.1.0-alpha.9

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 (56) hide show
  1. package/CHANGELOG.md +213 -1
  2. package/README.md +282 -35
  3. package/adapters/claude-code/wowbagger-adapter.json +1 -1
  4. package/adapters/codex/wowbagger-adapter.json +1 -1
  5. package/adapters/opencode/wowbagger-adapter.json +1 -1
  6. package/assets/wowbagger-v1-more-whimsical.jpg +0 -0
  7. package/assets/wowbagger-v2-less-whimsical.jpg +0 -0
  8. package/assets/wowbagger-v3-herding-agent-cats.jpg +0 -0
  9. package/assets/wowbagger-v4-robot-agent-herding.jpg +0 -0
  10. package/assets/wowbagger-v5-typing-cats-circuit-staff.jpg +0 -0
  11. package/docs/adapter-contract.md +66 -6
  12. package/docs/host-contract.md +287 -0
  13. package/docs/mutation-contract.md +558 -17
  14. package/docs/work-claim-contract.md +56 -24
  15. package/package.json +20 -2
  16. package/schemas/bare-ready-result.json +27 -0
  17. package/schemas/bare-validation-result.json +23 -0
  18. package/schemas/common.json +470 -0
  19. package/schemas/core-capabilities-response.json +346 -0
  20. package/schemas/core-envelope.json +141 -0
  21. package/schemas/core-inspect-response.json +37 -0
  22. package/schemas/core-inspect-workbench-response.json +340 -0
  23. package/schemas/core-list-error-response.json +242 -0
  24. package/schemas/core-list-query.json +98 -0
  25. package/schemas/core-list-response.json +140 -0
  26. package/schemas/core-report-response.json +379 -0
  27. package/schemas/core-transition-error-response.json +852 -0
  28. package/schemas/core-transition-request.json +47 -0
  29. package/schemas/core-transition-response.json +49 -0
  30. package/schemas/index.json +108 -0
  31. package/schemas/ledger-mutation-refusal.json +288 -0
  32. package/schemas/report-config-v1.json +140 -0
  33. package/schemas/report-config-v2.json +242 -0
  34. package/skills/wowbagger/SKILL.md +165 -39
  35. package/src/adapter/core-probe.js +87 -7
  36. package/src/claim-capabilities.js +4 -5
  37. package/src/claim-coordinator.js +15 -2
  38. package/src/claim-prospective.js +151 -0
  39. package/src/claim-publication.js +49 -9
  40. package/src/claim-sync.js +66 -0
  41. package/src/cli.js +671 -49
  42. package/src/extension-provision.js +33 -0
  43. package/src/git-autocommit.js +36 -6
  44. package/src/git-reconciliation.js +53 -9
  45. package/src/launch.js +52 -0
  46. package/src/lifecycle.js +153 -0
  47. package/src/limits.js +39 -0
  48. package/src/list.js +365 -0
  49. package/src/mutation.js +145 -118
  50. package/src/projection.js +39 -0
  51. package/src/report-graph.js +122 -21
  52. package/src/report-html.js +219 -51
  53. package/src/report-view.js +189 -0
  54. package/src/report.js +145 -15
  55. package/src/validate.js +4 -1
  56. package/src/workbench.js +117 -0
package/CHANGELOG.md CHANGED
@@ -7,6 +7,180 @@ consolidation. The first tagged release inherits this file.
7
7
 
8
8
  ## Unreleased
9
9
 
10
+ ## 0.1.0-alpha.9 - 2026-08-23
11
+
12
+ ### Added
13
+
14
+ - **A public Wowbagger brand asset.** The repository now carries an optimized
15
+ 1024px image of Bowerick Wowbagger directing robotic agent cats at consoles
16
+ with a circuit-lit shepherd's staff. The asset is included in the npm
17
+ package for README and GitHub presentation.
18
+
19
+ ### Changed
20
+
21
+ - **Public product prose now describes the current engine.** README, npm
22
+ metadata, Claude plugin metadata, marketplace metadata, and the installed
23
+ skill now explain report sequencing dashboards, named views, facets, graph
24
+ filtering, guarded CAS mutations, claims, fencing, reconciliation, and the
25
+ separation between core and host responsibilities.
26
+ - **Agent onboarding is explicit.** The README and skill include a concise
27
+ agent TL;DR, exact core setup checks, the separate plugin/skills installer
28
+ routes, and the response-loss rule.
29
+
30
+ ## 0.1.0-alpha.8 - 2026-08-23
31
+
32
+ ### Added
33
+
34
+ - **A published launch seam for a host that cannot run a shell.** The package
35
+ now declares `exports`, and its main entry `wowbagger` exposes
36
+ `CORE_SCRIPT_PATH`, `MINIMUM_NODE_MAJOR`, and `resolveCoreLaunch(argv)`, which
37
+ returns the exact process tuple a direct-core host needs: an absolute Node
38
+ executable, an argument array whose first element is the absolute
39
+ `bin/wowbagger.js`, and `shell: false`. A host that resolves its own runtime
40
+ gets `resolveCoreLaunch(argv, { nodeExecutable })`, and a relative or bare
41
+ executable name is refused rather than left for PATH to answer. The script
42
+ path is also resolvable on its own as `wowbagger/wowbagger.js` for a host that
43
+ wants the path without importing anything. Deep imports that already worked —
44
+ `wowbagger/src/limits.js` and every other published path — keep resolving
45
+ through an explicit `"./*"` subpath. No command accepts, refuses, emits, or
46
+ writes anything different.
47
+
48
+ - **The machine contract ships as JSON Schema, not only as prose and fixtures.**
49
+ Seventeen JSON Schema 2020-12 documents under `schemas/` are published with
50
+ the package and resolvable as `wowbagger/schemas/<file>.json`, with
51
+ `schemas/index.json` naming each one's response domain and that domain's
52
+ version. They cover the core envelope and its four exact root shapes, the
53
+ capabilities envelope with every advertised limit as a constant, the two bare
54
+ results, the list query and its page and refusals, the default and workbench
55
+ inspect projections, the transition request, success, and every documented
56
+ refusal with its mutation state, the `ledger-mutation` fence refusals, report
57
+ configuration versions 1 and 2, and the report responses including a named
58
+ view. Every schema fixes its root members exactly and pins the version of its
59
+ own domain, so a core envelope refuses a namespaced refusal, a version 4
60
+ envelope, or an extra root member, and a version 1 report configuration
61
+ refuses a version 2 one. Exactness reaches the members too: an item core must
62
+ carry both relation lists, because the core view always emits them, and a
63
+ refusal raised before a commit is established pins its state to `unchanged`
64
+ rather than admitting the indeterminate state that only an interrupted write
65
+ can report. The validator is a test-only dependency; the runtime still has
66
+ exactly one dependency.
67
+
68
+ ### Documentation
69
+
70
+ - **`docs/host-contract.md` publishes the direct-core host boundary.** One
71
+ document now states what a UI plugin or other non-agent consumer needs and
72
+ what it must supply itself: the package resolution seam and the four-part
73
+ launch — Node.js 20 or later, an absolute Node executable, the absolute
74
+ `wowbagger.js`, an argument array, and `shell: false`; bounded stdin or a
75
+ host-created request file, never shell source and never inline unbounded argv
76
+ JSON; captured stdout and stderr; the owning-host path rule for a worktree, a
77
+ plain folder, direct SSH, and WSL, with no cross-runtime path guessing;
78
+ namespace-first response dispatch and the exit table; every advertised limit
79
+ with its exact value; the once-only dispatch sequence for a lost response; and
80
+ the seventeen packaged JSON Schemas by domain. It states that a missing
81
+ executable is a host-level result rather than malformed Wowbagger JSON, that
82
+ the host owns executable discovery, working directory, timeout, cancellation,
83
+ process-tree containment, stream caps, and routing, and that Wowbagger will
84
+ not add automatic transitions, mirrored ledger state, operation identity,
85
+ remote routing, or a daemon. The full `inspect` read is documented as
86
+ deliberately unbounded, with the reason. The README, the installed skill, and
87
+ `SPEC.md` section 10 point at it, and it ships in the npm package.
88
+ - **The public version and lifecycle vocabulary agrees with the runtime.**
89
+ `SPEC.md` section 10 said core mutation contracts 1 and 2 were defined and
90
+ that the runtime emitted version 2; it now says 1 through 5 and version 5. The
91
+ mutation contract's status line said versions 1, 2, and 3 with the runtime on
92
+ 3; it now says 1 through 5 and version 5. `deferred` has been a real status
93
+ since it shipped, but `SPEC.md` omitted it from the status field, the
94
+ lifecycle table, the transition table, the terminal-date invariants, the
95
+ decision-action list, and the terminal-decision table, and the mutation
96
+ contract omitted the `deferred` date from the lossless core view; all seven
97
+ now name it, along with the `resolve`, `defer`, and `undefer` decision actions
98
+ the validator has always accepted. No behaviour changed: these were prose
99
+ omissions, and the tests that guard them read the vocabularies from
100
+ `src/lifecycle.js` and `src/validate.js` rather than retyping them.
101
+ - **Response loss is a named contract instead of folklore.** The mutation
102
+ contract, the adapter contract, the README, and the installed skill now carry
103
+ the same sequence for a mutation whose response never arrived: dispatch once,
104
+ never replay, invalidate the inspected revision, reconnect, then re-read the
105
+ ledger. The mutation contract's new section 10 table separates the outcomes a
106
+ caller may act on — committed success, proven non-write, committed recovery,
107
+ unknown publication — from the two that establish nothing, a signalled or
108
+ timed-out transport and a missing envelope, and states that a later item state
109
+ never proves that the lost dispatch caused it. Adapter contract section 6.2
110
+ documents the `mutation_outcome: "unknown"` envelope and its per-command
111
+ `recovery` object exactly as the adapter emits them, and states that exit 4
112
+ `revision-conflict` is a proven non-write that is never relabelled response
113
+ loss. There is no operation ID, durable outcome store, or replay endpoint;
114
+ adding correlation requires a new contract decision. No command accepts,
115
+ refuses, emits, or writes anything different. Two conformance vectors now pin
116
+ the core's own exit-6 `write-outcome-unknown` and `post-commit-recovery-required`
117
+ envelopes at the adapter's process-outcome seam, taking the adapter vector set
118
+ to 212 assertions.
119
+ - **The exit tables state where `report` actually lands.** Both contracts filed
120
+ exit 1 as a bare-result-only condition and exit 3 as every invalid ledger,
121
+ while `report` answers an invalid ledger, an unreadable input, and a failed
122
+ publication at exit 1. The mutation contract now carries an exit 1 row naming
123
+ those codes, lists `report-config-invalid` and `report-view-not-found` in its
124
+ exit 2 row, and scopes exit 3 to every command except `report`; the host
125
+ contract's exit 1 and exit 3 conditions say the same. Two guards assert the
126
+ rows against the codes the runtime emits.
127
+
128
+ ### Changed
129
+
130
+ - **The report filters by facet groups instead of one value at a time.** The
131
+ drill-down's single-value mapped-field selects and its All/Ready/Blocked/
132
+ Ineligible buttons are gone. In their place is one group of checkbox chips per
133
+ dimension of the open set — Readiness, Status, Kind, and every configured
134
+ mapped field, so a mapped `class: bug` is a chip rather than a value hidden in
135
+ a dropdown. Values inside a group are alternatives, groups narrow each other,
136
+ and the search box is one more condition; every chip states the count it would
137
+ leave, measured against the search and the other groups but never against its
138
+ own, so two selections in one group cannot make their siblings read zero. A
139
+ visible result count, per-chip selected state, and `Clear filters` are new, and
140
+ opening a Work next or Attention row still clears whatever detached its card,
141
+ facets included.
142
+ - **The ledger graph filters by lifecycle status.** One chip group above the
143
+ stage carries the statuses the ledger holds, all selected, with `Select all`
144
+ and `Clear`. Deselecting a status drops its nodes, every link incident to one,
145
+ and their labels, reheats the layout in place, and takes a hidden node off the
146
+ hover card; the roster and node count follow the same selection, and an empty
147
+ selection draws an empty graph that says so. The legend, the WebGL-less
148
+ roster, camera interaction, and the no-fetch contract are unchanged, and
149
+ nothing here reads or writes the ledger.
150
+
151
+ ### Fixed
152
+
153
+ - **A report failure before publication says so, and never arrives causeless.**
154
+ An output path the filesystem cannot resolve — a `--out` under a regular
155
+ file, an unreadable directory on the way to it — was a raw runtime error
156
+ escaping into the command's catch-all, answered as `report-write-failed` with
157
+ empty `details` even though nothing had been rendered or replaced. It is now
158
+ `report-read-failed` with `details.operation` naming which resolution failed,
159
+ `details.path` naming the path the caller configured or passed, and
160
+ `details.cause` naming the filesystem's own code. An error no report path
161
+ throws on purpose still answers `report-write-failed`, because nothing
162
+ reached the output path, but it now carries `{operation, cause}` instead of
163
+ `{}`. Every `details.cause` is a bounded token — an error code, or the
164
+ error's kind when the runtime gave no code — so a publication failure no
165
+ longer republishes a runtime message, and the paths, credentials, and
166
+ run-specific values a message carries stay out of the envelope. Atomic
167
+ publication is unchanged: a report already at the selected path survives
168
+ every one of these refusals.
169
+ - **An empty named view stops blaming the reader.** A view whose criteria
170
+ matched nothing rendered the drill-down's `No items match these filters.` and
171
+ the graph's `No status is selected`, sending a reader to controls that could
172
+ not bring an item back. A named artifact with no items now states
173
+ `No ledger item matches this view's criteria.` and, in the graph, that it has
174
+ nothing to draw — visibly, without waiting for scripting. A report that holds
175
+ items keeps the filter and status copy, which is the honest answer when the
176
+ reader is the one who narrowed it, and the base report's bytes are unchanged.
177
+ - **`core-report-response.json` named a member the report never emitted.** The
178
+ published `ledger-invalid` refusal required `details.validation_errors`,
179
+ which is the mutation commands' member name; `report` has always emitted
180
+ `details.errors`. A consumer validating a real refusal against the shipped
181
+ schema failed on the runtime's own bytes. The schema now states `errors`, and
182
+ a live invalid-ledger report run is validated against it.
183
+
10
184
  ## 0.1.0-alpha.7 - 2026-08-18
11
185
 
12
186
  ### Changed
@@ -157,6 +331,44 @@ consolidation. The first tagged release inherits this file.
157
331
 
158
332
  ### Added
159
333
 
334
+ - **`inspect` answers a bounded per-item lifecycle affordance projection.**
335
+ `inspect --ledger <dir> (--id <id> | --number <n>) --workbench --as-of
336
+ YYYY-MM-DD --json` returns, from one complete validated ledger snapshot,
337
+ `result.workbench`: the projection version, the as-of date, the ledger
338
+ snapshot witness, an `observation` member, a bounded item summary, and one
339
+ `transition_options` entry for every lifecycle target the native edge table
340
+ allows out of that item's kind and status. Each option names its target
341
+ status, its generated decision action or `null`, whether a caller-supplied
342
+ summary and rationale are required, the minimum legal transition date
343
+ `max(created, updated)`, its observed enabled state, and the observed
344
+ precondition issues and multi-item blockers in the exact `transition`
345
+ vocabulary. A workbench can now show a person which transitions an item can
346
+ take without duplicating lifecycle logic and without submitting a mutating
347
+ probe.
348
+
349
+ The read is an observation, not a lease, and says so in the response:
350
+ `observation.authority` is `observed-snapshot` and `observation.rechecked_by`
351
+ names what a later `transition` rechecks under lock — revision, lock, claim
352
+ fence, reconciliation, and candidate validation. It writes no item, lock,
353
+ claim journal, reconciliation log, or Git state, and it takes no lock.
354
+ `transition` and the projection share one lifecycle definition
355
+ (`src/lifecycle.js`), and a differential guard dispatches every projected
356
+ option and every unadvertised target through the real mutation, so an
357
+ advertised affordance cannot drift from what the mutation does.
358
+
359
+ Every variable-size field is bounded and says what it left out: the projected
360
+ title, the relation lists, each option's issues and blockers, and the related
361
+ IDs inside an issue. `--workbench` requires `--as-of`, an unpaired `--as-of`
362
+ is refused rather than ignored, and an `inspect` invocation without
363
+ `--workbench` is byte-identical to before. `capabilities` advertises
364
+ `operations.inspect.workbench` and the three exact bounds
365
+ `max_workbench_title_characters`, `max_workbench_collection_entries`, and
366
+ `max_workbench_response_bytes`; the core contract version stays 5, and the
367
+ projection is negotiated by its own `projection_version`. An invalid ledger is
368
+ `ledger-invalid` at exit 3 with no projection attached, and a projection that
369
+ would exceed its response bound is refused whole with
370
+ `workbench-response-too-large` at exit 2.
371
+
160
372
  - **The conformance suite now measures real core outcomes end to end.** A new
161
373
  equivalence case, `16-core-outcome-e2e`, carries nine hand-authored scenarios
162
374
  that each run the direct real core in one isolated temporary workspace and,
@@ -570,7 +782,7 @@ consolidation. The first tagged release inherits this file.
570
782
  every read and every guarded mutation on that ledger, including ones that
571
783
  never touch the misplaced item, so the refusal has to say where the item
572
784
  belongs. The claim fence is not involved: `claim-verify` reports no finding
573
- on such a ledger, refuting the PropertyCompass2 PR #2184 claim that a
785
+ on such a ledger, refuting an earlier consumer report that a
574
786
  root-misplaced item makes the fence report `stale-write-detected` with
575
787
  `actual_revision: null`. Fixtures pin both configuration orders — layout
576
788
  bound first, and layout bound after the item was already committed at the