{"_id":"wowbagger","_rev":"29-b0a3196d6ecc4798a7fd503ea9615eb1","name":"wowbagger","dist-tags":{"next":"0.5.0","latest":"0.5.0"},"versions":{"0.1.0-alpha.1":{"name":"wowbagger","version":"0.1.0-alpha.1","keywords":["ledger","task-management","backlog","coordination","agent","markdown","git","cli"],"author":{"name":"Lee Stutzman"},"license":"MIT","_id":"wowbagger@0.1.0-alpha.1","maintainers":[{"name":"lee-stutzman","email":"lstutzman@gmail.com"}],"homepage":"https://github.com/lstutzman/wowbagger","bugs":{"url":"https://github.com/lstutzman/wowbagger/issues"},"bin":{"wowbagger":"bin/wowbagger.js"},"dist":{"shasum":"9be56c41b7284517964b027ede9ad2005203e4f6","tarball":"https://registry.npmjs.org/wowbagger/-/wowbagger-0.1.0-alpha.1.tgz","fileCount":46,"integrity":"sha512-i/5x58cDdQOgUw6OHUH++DPEy6VLqaE4Vf/M40xSviuNpi9FSgN12ui8FL44RvBRsXJcOR29RhbwktUxj/TBfA==","signatures":[{"sig":"MEUCIA8l2nrGD3qSXav73lV6tPQ4vIU9R9EsH0NkTPIRrJggAiEAmQ6kIPQ6mJtQ5dtpHMaVxItlKupEgmOSaj9CE41Ujgc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":408326},"type":"module","_from":"file:/tmp/wowbagger-0.1.0-alpha.1.tgz","engines":{"node":">=20"},"scripts":{"test":"node --test test/*.test.js","check":"npm test && git diff --check && git diff --cached --check","prepublishOnly":"node bin/wowbagger.js validate --ledger ledger --json >/dev/null && node --check bin/wowbagger.js"},"_npmUser":{"name":"lee-stutzman","email":"lstutzman@gmail.com"},"_resolved":"/tmp/wowbagger-0.1.0-alpha.1.tgz","_integrity":"sha512-i/5x58cDdQOgUw6OHUH++DPEy6VLqaE4Vf/M40xSviuNpi9FSgN12ui8FL44RvBRsXJcOR29RhbwktUxj/TBfA==","deprecated":"Unsupported: this build predates the current core contract. Install the current stable release with `npm install -g wowbagger@latest`. The bundled skill pins one exact core distribution version and refuses any other, so upgrade the skill and the core together.","repository":{"url":"git+https://github.com/lstutzman/wowbagger.git","type":"git"},"_npmVersion":"11.18.0","description":"Plain-Markdown, Git-native work ledger for coordinating agents — validate, ready-select, and mutate a task ledger from the CLI.","directories":{},"_nodeVersion":"26.6.0","dependencies":{"yaml":"^2.9.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/wowbagger_0.1.0-alpha.1_1786534457500_0.8545221466524264","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-alpha.2":{"name":"wowbagger","version":"0.1.0-alpha.2","keywords":["ledger","task-management","backlog","coordination","agent","markdown","git","cli"],"author":{"name":"Lee Stutzman"},"license":"MIT","_id":"wowbagger@0.1.0-alpha.2","maintainers":[{"name":"lee-stutzman","email":"lstutzman@gmail.com"}],"homepage":"https://github.com/lstutzman/wowbagger","bugs":{"url":"https://github.com/lstutzman/wowbagger/issues"},"bin":{"wowbagger":"bin/wowbagger.js"},"dist":{"shasum":"8736f55cb92287f992325c45de19237855b0e67b","tarball":"https://registry.npmjs.org/wowbagger/-/wowbagger-0.1.0-alpha.2.tgz","fileCount":49,"integrity":"sha512-ST5PNjEgC/QkqV94s39+Y+9ri4CzpZyr/Yt6KvAdesYPtd6SWbo3PDD5r65LC5vqwzezYUENDyYujbcvB33DRg==","signatures":[{"sig":"MEUCIQDdqQi7oG5LM5SSCvMCIpX363dFjGtOAkGgf+vALK7MUgIgVEu2URwPgQVVPxMPjq94p/G66eiNZyfLLmkMIAY34q4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":486887},"type":"module","engines":{"node":">=20"},"gitHead":"ae53e5d19439191ca4715079dd61def7e33bfbc2","scripts":{"test":"node --test test/*.test.js","check":"npm test && git diff --check && git diff --cached --check","prepublishOnly":"node bin/wowbagger.js validate --ledger ledger --json >/dev/null && node --check bin/wowbagger.js && node scripts/verify-release-tag.js"},"_npmUser":{"name":"lee-stutzman","email":"lstutzman@gmail.com"},"repository":{"url":"git+https://github.com/lstutzman/wowbagger.git","type":"git"},"_npmVersion":"11.18.0","description":"Plain-Markdown, Git-native work ledger for coordinating agents — validate, ready-select, and mutate a task ledger from the CLI.","directories":{},"_nodeVersion":"26.6.0","dependencies":{"yaml":"^2.9.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","_npmOperationalInternal":{"tmp":"tmp/wowbagger_0.1.0-alpha.2_1786573746785_0.995470079624466","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-alpha.3":{"name":"wowbagger","version":"0.1.0-alpha.3","keywords":["ledger","task-management","backlog","coordination","agent","markdown","git","cli"],"author":{"name":"Lee Stutzman"},"license":"MIT","_id":"wowbagger@0.1.0-alpha.3","maintainers":[{"name":"lee-stutzman","email":"lstutzman@gmail.com"}],"homepage":"https://github.com/lstutzman/wowbagger","bugs":{"url":"https://github.com/lstutzman/wowbagger/issues"},"bin":{"wowbagger":"bin/wowbagger.js"},"dist":{"shasum":"ce634ac54d19202ff296993348423b81978954d5","tarball":"https://registry.npmjs.org/wowbagger/-/wowbagger-0.1.0-alpha.3.tgz","fileCount":49,"integrity":"sha512-bFcwfCMqy+9IoVtU4yjL1V5mb/u227pSXUIhbuX/EtNSIf4LjTJedOaZwCi5aP99ctHDfOGjD3svs0741jJzhA==","signatures":[{"sig":"MEQCIGnonjbWnojDFz2Pf6Abp4+YYO0ISm+ZG1TZvOwwdQA3AiA5saFsfUaa5c2HUakAZDUSThQSKZcLCimE9jnBT6P7Aw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":488008},"type":"module","engines":{"node":">=20"},"gitHead":"5c1b0745b11a52953f10a46be0fdd8cf71f8fa48","scripts":{"test":"node --test test/*.test.js","check":"npm test && git diff --check && git diff --cached --check","prepublishOnly":"node bin/wowbagger.js validate --ledger ledger --json >/dev/null && node --check bin/wowbagger.js && node scripts/verify-release-tag.js"},"_npmUser":{"name":"lee-stutzman","email":"lstutzman@gmail.com"},"repository":{"url":"git+https://github.com/lstutzman/wowbagger.git","type":"git"},"_npmVersion":"11.18.0","description":"Plain-Markdown, Git-native work ledger for coordinating agents — validate, ready-select, and mutate a task ledger from the CLI.","directories":{},"_nodeVersion":"26.6.0","dependencies":{"yaml":"^2.9.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","_npmOperationalInternal":{"tmp":"tmp/wowbagger_0.1.0-alpha.3_1786575989643_0.9603039955809134","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-alpha.4":{"name":"wowbagger","version":"0.1.0-alpha.4","keywords":["ledger","task-management","backlog","coordination","agent","markdown","git","cli"],"author":{"name":"Lee Stutzman"},"license":"MIT","_id":"wowbagger@0.1.0-alpha.4","maintainers":[{"name":"lee-stutzman","email":"lstutzman@gmail.com"}],"homepage":"https://github.com/lstutzman/wowbagger","bugs":{"url":"https://github.com/lstutzman/wowbagger/issues"},"bin":{"wowbagger":"bin/wowbagger.js"},"dist":{"shasum":"9837d56f0f23d37acdea701e4bcdac2b45156714","tarball":"https://registry.npmjs.org/wowbagger/-/wowbagger-0.1.0-alpha.4.tgz","fileCount":53,"integrity":"sha512-UorglaHmp027EtgLK5KUeiGobur2YyM4vwyfrJVW1BqFWjGD1qk4qS6beN6wT2jeDkdpnrvoHeZv7kJ6MTOJgg==","signatures":[{"sig":"MEYCIQDxERAQ66ieKQ2ms9zVJ4ORo/admGChc2ki2M+BYIwhuQIhANZoAa6bNAltKaJkXsd04C17SizjFXHuvzc4wWSv5u5W","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":612119},"type":"module","engines":{"node":">=20"},"gitHead":"a893b15f2c36d5a8b3e2bcb18e40067ad62a75b0","scripts":{"test":"node --test test/*.test.js","check":"npm test && git diff --check && git diff --cached --check","report":"node bin/wowbagger.js report --ledger ledger --json","prepublishOnly":"node bin/wowbagger.js validate --ledger ledger --json >/dev/null && node --check bin/wowbagger.js && node scripts/verify-release-tag.js"},"_npmUser":{"name":"lee-stutzman","email":"lstutzman@gmail.com"},"repository":{"url":"git+https://github.com/lstutzman/wowbagger.git","type":"git"},"_npmVersion":"11.18.0","description":"Plain-Markdown, Git-native work ledger for coordinating agents — validate, ready-select, and mutate a task ledger from the CLI.","directories":{},"_nodeVersion":"26.6.0","dependencies":{"yaml":"^2.9.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","_npmOperationalInternal":{"tmp":"tmp/wowbagger_0.1.0-alpha.4_1786796314051_0.9836691613012234","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-alpha.5":{"name":"wowbagger","version":"0.1.0-alpha.5","keywords":["ledger","task-management","backlog","coordination","agent","markdown","git","cli"],"author":{"name":"Lee Stutzman"},"license":"MIT","_id":"wowbagger@0.1.0-alpha.5","maintainers":[{"name":"lee-stutzman","email":"lstutzman@gmail.com"}],"homepage":"https://github.com/lstutzman/wowbagger","bugs":{"url":"https://github.com/lstutzman/wowbagger/issues"},"bin":{"wowbagger":"bin/wowbagger.js"},"dist":{"shasum":"22a5846d98bdc8b44794d22ed35b5e2dc3fec1fe","tarball":"https://registry.npmjs.org/wowbagger/-/wowbagger-0.1.0-alpha.5.tgz","fileCount":61,"integrity":"sha512-Tu+g5EohKdUUtBBBVrryXZVIVN2wWMSV6qhSyRxgkReI//OrVPf7pPZiG0GzzU4oF9zIEvSsCuoPX1W3lS7zsQ==","signatures":[{"sig":"MEQCIDQGV370lDgxKZ+rDJ9jeNa0qaLWQnWBZ3TkYpbYRL7rAiAtj5465yAFRoUrszCw0wiKYBpxxmySmi3jOm5m2ejKMQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2121722},"type":"module","engines":{"node":">=20"},"gitHead":"115799e044b1e24587d9182af80029bd587c05ed","scripts":{"test":"node --test test/*.test.js","check":"npm test && git diff --check && git diff --cached --check","report":"node bin/wowbagger.js report --ledger ledger --json","prepublishOnly":"node bin/wowbagger.js validate --ledger ledger --json >/dev/null && node --check bin/wowbagger.js && node scripts/verify-release-tag.js"},"_npmUser":{"name":"lee-stutzman","email":"lstutzman@gmail.com"},"repository":{"url":"git+https://github.com/lstutzman/wowbagger.git","type":"git"},"_npmVersion":"11.18.0","description":"Plain-Markdown, Git-native work ledger for coordinating agents — validate, ready-select, and mutate a task ledger from the CLI.","directories":{},"_nodeVersion":"26.6.0","dependencies":{"yaml":"^2.9.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","_npmOperationalInternal":{"tmp":"tmp/wowbagger_0.1.0-alpha.5_1786958765301_0.6359256297415739","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-alpha.6":{"name":"wowbagger","version":"0.1.0-alpha.6","keywords":["ledger","task-management","backlog","coordination","agent","markdown","git","cli"],"author":{"name":"Lee Stutzman"},"license":"MIT","_id":"wowbagger@0.1.0-alpha.6","maintainers":[{"name":"lee-stutzman","email":"lstutzman@gmail.com"}],"homepage":"https://github.com/lstutzman/wowbagger","bugs":{"url":"https://github.com/lstutzman/wowbagger/issues"},"bin":{"wowbagger":"bin/wowbagger.js"},"dist":{"shasum":"6ea53972a6028eb3de417f797d0dc4eebe0d0f7e","tarball":"https://registry.npmjs.org/wowbagger/-/wowbagger-0.1.0-alpha.6.tgz","fileCount":62,"integrity":"sha512-8q11Pmz1FU5lEx0/f2bIlaZ+nkx6crNBM9IbLEL4zkKzFpq5QOPl0J3DKlISaQmZHAqDSHG4VDmozabn2GY3yQ==","signatures":[{"sig":"MEYCIQCJBgO33Ta+SSo7+QDKGU/S7Q4f3eSY/rEqAMGEWosANgIhAIyNX6o/sVSwbxgR79NsUdf6l1nv+1pfVEmckolCLDIl","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2225205},"type":"module","engines":{"node":">=20"},"gitHead":"26369efffb36a2a2a393671437ddfa05f154b623","scripts":{"test":"node --test test/*.test.js","check":"npm test && git diff --check && git diff --cached --check","report":"node bin/wowbagger.js report --ledger ledger --json","prepublishOnly":"node bin/wowbagger.js validate --ledger ledger --json >/dev/null && node --check bin/wowbagger.js && node scripts/verify-release-tag.js"},"_npmUser":{"name":"lee-stutzman","email":"lstutzman@gmail.com"},"repository":{"url":"git+https://github.com/lstutzman/wowbagger.git","type":"git"},"_npmVersion":"11.18.0","description":"Plain-Markdown, Git-native work ledger for coordinating agents — validate, ready-select, and mutate a task ledger from the CLI.","directories":{},"_nodeVersion":"26.6.0","dependencies":{"yaml":"^2.9.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","_npmOperationalInternal":{"tmp":"tmp/wowbagger_0.1.0-alpha.6_1786974871992_0.9748883031312405","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-alpha.7":{"name":"wowbagger","version":"0.1.0-alpha.7","keywords":["ledger","task-management","backlog","coordination","agent","markdown","git","cli"],"author":{"name":"Lee Stutzman"},"license":"MIT","_id":"wowbagger@0.1.0-alpha.7","maintainers":[{"name":"lee-stutzman","email":"lstutzman@gmail.com"}],"homepage":"https://github.com/lstutzman/wowbagger","bugs":{"url":"https://github.com/lstutzman/wowbagger/issues"},"bin":{"wowbagger":"bin/wowbagger.js"},"dist":{"shasum":"c356ba38c0f0f1a06205a0107837a4cf0b607c17","tarball":"https://registry.npmjs.org/wowbagger/-/wowbagger-0.1.0-alpha.7.tgz","fileCount":65,"integrity":"sha512-bwfsVYkGNx6dwRlvllTaKyOiEqWUV6RASQr5ggNulCpgVdY/jrpqltLe+1E60nHklJ3CPFZCTW9Y2BWUnfq7Fw==","signatures":[{"sig":"MEQCIDz1/+NcIJJszsPkyCo2touUthvrc4qp8iCs8Dz6aMNnAiB41BUiWt8JmTr3Buh2MJwjaSy0x0JJkr7ZlHGifb+ydQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2334300},"type":"module","engines":{"node":">=20"},"gitHead":"e87a7eacf978dced7edc8fe93a0615c78b47da8f","scripts":{"test":"node --test test/*.test.js","check":"npm test && git diff --check && git diff --cached --check","report":"node bin/wowbagger.js report --ledger ledger --json","release:cut":"node scripts/cut-release.js","prepublishOnly":"node bin/wowbagger.js validate --ledger ledger --json >/dev/null && node --check bin/wowbagger.js && node scripts/verify-release-tag.js","release:channels":"node scripts/release-channels.js"},"_npmUser":{"name":"lee-stutzman","email":"lstutzman@gmail.com"},"repository":{"url":"git+https://github.com/lstutzman/wowbagger.git","type":"git"},"_npmVersion":"11.18.0","description":"Plain-Markdown, Git-native work ledger for coordinating agents — validate, ready-select, and mutate a task ledger from the CLI.","directories":{},"_nodeVersion":"26.6.0","dependencies":{"yaml":"^2.9.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","_npmOperationalInternal":{"tmp":"tmp/wowbagger_0.1.0-alpha.7_1787043486546_0.6772483274212218","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-alpha.8":{"name":"wowbagger","version":"0.1.0-alpha.8","keywords":["ledger","task-management","backlog","coordination","agent","markdown","git","cli"],"author":{"name":"Lee Stutzman"},"license":"MIT","_id":"wowbagger@0.1.0-alpha.8","maintainers":[{"name":"lee-stutzman","email":"lstutzman@gmail.com"}],"homepage":"https://github.com/lstutzman/wowbagger","bugs":{"url":"https://github.com/lstutzman/wowbagger/issues"},"bin":{"wowbagger":"bin/wowbagger.js"},"dist":{"shasum":"45a4f3e5ad15a3445f47d58cabd46830d777b5d8","tarball":"https://registry.npmjs.org/wowbagger/-/wowbagger-0.1.0-alpha.8.tgz","fileCount":93,"integrity":"sha512-TilEl4239VBcy2FIPfXDSkZ2VcBg5PNiorhmZxOfakK4EKTAhelVZw3s4wlbF8Amc3Om1zgowu1bjAmc00EqrQ==","signatures":[{"sig":"MEYCIQDoc9paRoBdAC9/1ZGLcLFi9m/g9TejwBK9euK4fECC4gIhAJanGsZOnSdF8+AsCiljJAlsTLaqVfL1b9eMFaZgyKq+","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2625499},"type":"module","engines":{"node":">=20"},"exports":{".":"./src/launch.js","./*":"./*","./launch":"./src/launch.js","./package.json":"./package.json","./wowbagger.js":"./bin/wowbagger.js","./schemas/*.json":"./schemas/*.json"},"gitHead":"b60ecf54832e07996e6d7a4a85f44637825b30f7","scripts":{"test":"node --test test/*.test.js","check":"npm test && git diff --check && git diff --cached --check","report":"node bin/wowbagger.js report --ledger ledger --json","release:cut":"node scripts/cut-release.js","prepublishOnly":"node bin/wowbagger.js validate --ledger ledger --json >/dev/null && node --check bin/wowbagger.js && node scripts/verify-release-tag.js","release:channels":"node scripts/release-channels.js"},"_npmUser":{"name":"lee-stutzman","email":"lstutzman@gmail.com"},"repository":{"url":"git+https://github.com/lstutzman/wowbagger.git","type":"git"},"_npmVersion":"11.18.0","description":"Plain-Markdown, Git-native work ledger for coordinating agents — validate, ready-select, and mutate a task ledger from the CLI.","directories":{},"_nodeVersion":"26.6.0","dependencies":{"yaml":"^2.9.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"ajv":"^8.20.0"},"_npmOperationalInternal":{"tmp":"tmp/wowbagger_0.1.0-alpha.8_1787489447574_0.9456011061509886","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-alpha.9":{"name":"wowbagger","version":"0.1.0-alpha.9","keywords":["ledger","task-management","backlog","coordination","agent","multi-agent","reports","work-claims","compare-and-swap","markdown","git","cli"],"author":{"name":"Lee Stutzman"},"license":"MIT","_id":"wowbagger@0.1.0-alpha.9","maintainers":[{"name":"lee-stutzman","email":"lstutzman@gmail.com"}],"homepage":"https://github.com/lstutzman/wowbagger","bugs":{"url":"https://github.com/lstutzman/wowbagger/issues"},"bin":{"wowbagger":"bin/wowbagger.js"},"dist":{"shasum":"4241e32baf678e79432321820d22affcde711258","tarball":"https://registry.npmjs.org/wowbagger/-/wowbagger-0.1.0-alpha.9.tgz","fileCount":98,"integrity":"sha512-Y50c9VtHOTgqd/agEeYaWwNGDkj5VzsaXIRzcF0PpYNYhwJwF1LVmizGX0daTUAQLJ+QGw1BrAv4FAEkPzHpNQ==","signatures":[{"sig":"MEUCIQDrjUVdi5ixvPFF5rfDTERnSsDDciNVXfA7OYmq6HIVyAIgc5MB39yOuaXhz3pbTLA+f45aeTlzUpcDw5FF9y4H7v4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3940738},"type":"module","engines":{"node":">=20"},"exports":{".":"./src/launch.js","./*":"./*","./launch":"./src/launch.js","./package.json":"./package.json","./wowbagger.js":"./bin/wowbagger.js","./schemas/*.json":"./schemas/*.json"},"gitHead":"da49db69634aba60b1d2a184a22a8d53f9d5a97d","scripts":{"test":"node --test test/*.test.js","check":"npm test && git diff --check && git diff --cached --check","report":"node bin/wowbagger.js report --ledger ledger --json","release:cut":"node scripts/cut-release.js","prepublishOnly":"node bin/wowbagger.js validate --ledger ledger --json >/dev/null && node --check bin/wowbagger.js && node scripts/verify-release-tag.js","release:channels":"node scripts/release-channels.js"},"_npmUser":{"name":"lee-stutzman","email":"lstutzman@gmail.com"},"repository":{"url":"git+https://github.com/lstutzman/wowbagger.git","type":"git"},"_npmVersion":"11.18.0","description":"Git-native work ledger for coding agents: deterministic ready queues, guarded CAS mutations, claims and fencing, and self-contained HTML reports.","directories":{},"_nodeVersion":"26.6.0","dependencies":{"yaml":"^2.9.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"ajv":"^8.20.0"},"_npmOperationalInternal":{"tmp":"tmp/wowbagger_0.1.0-alpha.9_1787494871821_0.8218814537344608","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-alpha.11":{"name":"wowbagger","version":"0.1.0-alpha.11","keywords":["ledger","task-management","backlog","coordination","agent","multi-agent","reports","work-claims","compare-and-swap","markdown","git","cli"],"author":{"name":"Lee Stutzman"},"license":"MIT","_id":"wowbagger@0.1.0-alpha.11","maintainers":[{"name":"lee-stutzman","email":"lstutzman@gmail.com"}],"homepage":"https://github.com/lstutzman/wowbagger","bugs":{"url":"https://github.com/lstutzman/wowbagger/issues"},"bin":{"wowbagger":"bin/wowbagger.js"},"dist":{"shasum":"44ea3a61ec430f59a54516000a37b8808d8da378","tarball":"https://registry.npmjs.org/wowbagger/-/wowbagger-0.1.0-alpha.11.tgz","fileCount":98,"integrity":"sha512-+Ub2+Z3tzugdQRVu4gpDkHn7p0fpRD5o/vTUESkY3Fkita8eKjsUpqhLbl0/Q/shKFkgjdSpIQZIiaoU5lAxOQ==","signatures":[{"sig":"MEUCIBnF7pEbm840xIsE9Jl3FmHMj+deM8ACOPDxB4oscCGvAiEAoSwBlSjHWoCrh2ZA3tjUVhJljmhwTWjweeUiRbFnn2g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3971276},"type":"module","engines":{"node":">=20"},"exports":{".":"./src/launch.js","./*":"./*","./launch":"./src/launch.js","./package.json":"./package.json","./wowbagger.js":"./bin/wowbagger.js","./schemas/*.json":"./schemas/*.json"},"scripts":{"test":"node --test test/*.test.js","check":"npm test && git diff --check && git diff --cached --check","report":"node bin/wowbagger.js report --ledger ledger --json","release:cut":"node scripts/cut-release.js","prepublishOnly":"node bin/wowbagger.js validate --ledger ledger --json >/dev/null && node --check bin/wowbagger.js && node scripts/verify-release-tag.js","release:channels":"node scripts/release-channels.js"},"_npmUser":{"name":"lee-stutzman","email":"lstutzman@gmail.com"},"repository":{"url":"git+https://github.com/lstutzman/wowbagger.git","type":"git"},"_npmVersion":"11.18.0","description":"Git-native work ledger for coding agents: deterministic ready queues, guarded CAS mutations, claims and fencing, and self-contained HTML reports.","directories":{},"_nodeVersion":"26.6.0","dependencies":{"yaml":"^2.9.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"ajv":"^8.20.0"},"_npmOperationalInternal":{"tmp":"tmp/wowbagger_0.1.0-alpha.11_1787906031190_0.11121295668277575","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-alpha.12":{"name":"wowbagger","version":"0.1.0-alpha.12","keywords":["ledger","task-management","backlog","coordination","agent","multi-agent","reports","work-claims","compare-and-swap","markdown","git","cli"],"author":{"name":"Lee Stutzman"},"license":"MIT","_id":"wowbagger@0.1.0-alpha.12","maintainers":[{"name":"lee-stutzman","email":"lstutzman@gmail.com"}],"homepage":"https://github.com/lstutzman/wowbagger","bugs":{"url":"https://github.com/lstutzman/wowbagger/issues"},"bin":{"wowbagger":"bin/wowbagger.js"},"dist":{"shasum":"1f8921994d2e89fa57e3c8324e1568c89ecbac01","tarball":"https://registry.npmjs.org/wowbagger/-/wowbagger-0.1.0-alpha.12.tgz","fileCount":98,"integrity":"sha512-e6PJKtoz7CeGs137Ngh6HsXZKW3CeugKBk1+WkXscGqUJShymJCI/DXCqHvKVjCyIDqXIl5ggPrEPpywW9LaJQ==","signatures":[{"sig":"MEUCIQCFbnKxK7KxlLYDmblk6pKughFOtD69SjtOroO5Y/bo1AIgObD44i5x/zCNh4i4rs9mYadz5gQ5AIo+Y4494JcQ794=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3973233},"type":"module","engines":{"node":">=20"},"exports":{".":"./src/launch.js","./*":"./*","./launch":"./src/launch.js","./package.json":"./package.json","./wowbagger.js":"./bin/wowbagger.js","./schemas/*.json":"./schemas/*.json"},"scripts":{"test":"node --test test/*.test.js","check":"npm test && git diff --check && git diff --cached --check","report":"node bin/wowbagger.js report --ledger ledger --json","release:cut":"node scripts/cut-release.js","prepublishOnly":"node bin/wowbagger.js validate --ledger ledger --json >/dev/null && node --check bin/wowbagger.js && node scripts/verify-release-tag.js","release:channels":"node scripts/release-channels.js"},"_npmUser":{"name":"lee-stutzman","email":"lstutzman@gmail.com"},"repository":{"url":"git+https://github.com/lstutzman/wowbagger.git","type":"git"},"_npmVersion":"11.18.0","description":"Git-native work ledger for coding agents: deterministic ready queues, guarded CAS mutations, claims and fencing, and self-contained HTML reports.","directories":{},"_nodeVersion":"26.6.0","dependencies":{"yaml":"^2.9.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"ajv":"^8.20.0"},"_npmOperationalInternal":{"tmp":"tmp/wowbagger_0.1.0-alpha.12_1787920427092_0.46786663686544805","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-alpha.13":{"name":"wowbagger","version":"0.1.0-alpha.13","keywords":["ledger","task-management","backlog","coordination","agent","multi-agent","reports","work-claims","compare-and-swap","markdown","git","cli"],"author":{"name":"Lee Stutzman"},"license":"MIT","_id":"wowbagger@0.1.0-alpha.13","maintainers":[{"name":"lee-stutzman","email":"lstutzman@gmail.com"}],"homepage":"https://github.com/lstutzman/wowbagger","bugs":{"url":"https://github.com/lstutzman/wowbagger/issues"},"bin":{"wowbagger":"bin/wowbagger.js"},"dist":{"shasum":"8dedfc938f2591b55befa2be00fd4185f44f4380","tarball":"https://registry.npmjs.org/wowbagger/-/wowbagger-0.1.0-alpha.13.tgz","fileCount":100,"integrity":"sha512-slme0qbxySwJxaGLAA3SLt+VWpaJpMFZQf8ZAMf8cXw4UoCteuXw5Txl+NE0uHTLRXaTLDOglFuL9E1jYKRuAg==","signatures":[{"sig":"MEUCIGC81N+DJhzdensEdyrb5VPFhQWma82jXhPm8uL1DO90AiEAwrnUSkHFPHQ5WH+yZHBSaAqnmJpgDoHIULbR4H+cODs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4002745},"type":"module","engines":{"node":">=20"},"exports":{".":"./src/launch.js","./*":"./*","./launch":"./src/launch.js","./package.json":"./package.json","./wowbagger.js":"./bin/wowbagger.js","./schemas/*.json":"./schemas/*.json"},"scripts":{"test":"node --test test/*.test.js","check":"npm test && git diff --check && git diff --cached --check","report":"node bin/wowbagger.js report --ledger ledger --json","release:cut":"node scripts/cut-release.js","prepublishOnly":"node bin/wowbagger.js validate --ledger ledger --json >/dev/null && node --check bin/wowbagger.js && node scripts/verify-release-tag.js","release:channels":"node scripts/release-channels.js"},"_npmUser":{"name":"lee-stutzman","email":"lstutzman@gmail.com"},"repository":{"url":"git+https://github.com/lstutzman/wowbagger.git","type":"git"},"_npmVersion":"11.18.0","description":"Git-native work ledger for coding agents: deterministic ready queues, guarded CAS mutations, claims and fencing, and self-contained HTML reports.","directories":{},"_nodeVersion":"26.6.0","dependencies":{"yaml":"^2.9.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"ajv":"^8.20.0"},"_npmOperationalInternal":{"tmp":"tmp/wowbagger_0.1.0-alpha.13_1788015691553_0.7833230451848121","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-alpha.14":{"name":"wowbagger","version":"0.1.0-alpha.14","keywords":["ledger","task-management","backlog","coordination","agent","multi-agent","reports","work-claims","compare-and-swap","markdown","git","cli"],"author":{"name":"Lee Stutzman"},"license":"MIT","_id":"wowbagger@0.1.0-alpha.14","maintainers":[{"name":"lee-stutzman","email":"lstutzman@gmail.com"}],"homepage":"https://github.com/lstutzman/wowbagger","bugs":{"url":"https://github.com/lstutzman/wowbagger/issues"},"bin":{"wowbagger":"bin/wowbagger.js"},"dist":{"shasum":"32cef28697a87e34c03e48bae7a4b82a1bf9b987","tarball":"https://registry.npmjs.org/wowbagger/-/wowbagger-0.1.0-alpha.14.tgz","fileCount":101,"integrity":"sha512-1/2twvAewsH+4J+tToSDBVZNW7BVylsPmOYkZKQasXt/mDjdYqrndDffb4SngSU+py+o47CG68q50vc+vuGPtw==","signatures":[{"sig":"MEYCIQCM8trfiSMUnmTySVJfS64R8XlOT1mAfyJ6tsNZK7jwcQIhAOpX8Q7zAUlQgvr62U9POGThEQxlL8JoMEfgO2o0LNgP","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4052616},"type":"module","engines":{"node":">=20"},"exports":{".":"./src/launch.js","./*":"./*","./launch":"./src/launch.js","./package.json":"./package.json","./wowbagger.js":"./bin/wowbagger.js","./schemas/*.json":"./schemas/*.json"},"scripts":{"test":"node --test test/*.test.js","check":"npm test && git diff --check && git diff --cached --check","report":"node bin/wowbagger.js report --ledger ledger --json","release:cut":"node scripts/cut-release.js","prepublishOnly":"node bin/wowbagger.js validate --ledger ledger --json >/dev/null && node --check bin/wowbagger.js && node scripts/verify-release-tag.js","release:channels":"node scripts/release-channels.js"},"_npmUser":{"name":"lee-stutzman","email":"lstutzman@gmail.com"},"repository":{"url":"git+https://github.com/lstutzman/wowbagger.git","type":"git"},"_npmVersion":"11.18.0","description":"Git-native work ledger for coding agents: deterministic ready queues, guarded CAS mutations, claims and fencing, and self-contained HTML reports.","directories":{},"_nodeVersion":"26.6.0","dependencies":{"yaml":"^2.9.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"ajv":"^8.20.0"},"_npmOperationalInternal":{"tmp":"tmp/wowbagger_0.1.0-alpha.14_1788088951081_0.3850459630869165","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-alpha.17":{"name":"wowbagger","version":"0.1.0-alpha.17","keywords":["ledger","task-management","backlog","coordination","agent","multi-agent","reports","work-claims","compare-and-swap","markdown","git","cli"],"author":{"name":"Lee Stutzman"},"license":"MIT","_id":"wowbagger@0.1.0-alpha.17","maintainers":[{"name":"lee-stutzman","email":"lstutzman@gmail.com"}],"homepage":"https://github.com/lstutzman/wowbagger","bugs":{"url":"https://github.com/lstutzman/wowbagger/issues"},"bin":{"wowbagger":"bin/wowbagger.js"},"dist":{"shasum":"4df99e62b7e980440271b262198bd7f13ee751fb","tarball":"https://registry.npmjs.org/wowbagger/-/wowbagger-0.1.0-alpha.17.tgz","fileCount":106,"integrity":"sha512-Mt0NVnUqdaG1RKdqXh5jgcKoEbNiEX+vzIx/et7z8obLx3Tk8DAtpet8Pj5G9Kb7DO55y2pCGJh+2KHishXkpQ==","signatures":[{"sig":"MEUCICybMZGTxiPq+IbkWvKCjbFQ8kZgcZUvcez524UPexVmAiEA61AMkcZUNMfO44PRGFir7j5esjDSrftvhMMulXC/M8A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4123442},"type":"module","engines":{"node":">=24"},"exports":{".":"./src/launch.js","./*":"./*","./launch":"./src/launch.js","./package.json":"./package.json","./wowbagger.js":"./bin/wowbagger.js","./schemas/*.json":"./schemas/*.json"},"scripts":{"test":"node --test test/*.test.js","check":"npm test && git diff --check && git diff --cached --check","report":"node bin/wowbagger.js report --ledger ledger --json","release:cut":"node scripts/cut-release.js","prepublishOnly":"node bin/wowbagger.js validate --ledger ledger --json >/dev/null && node --check bin/wowbagger.js && node scripts/verify-release-tag.js","release:channels":"node scripts/release-channels.js"},"_npmUser":{"name":"lee-stutzman","email":"lstutzman@gmail.com"},"repository":{"url":"git+https://github.com/lstutzman/wowbagger.git","type":"git"},"_npmVersion":"11.19.0","description":"Git-native work ledger for coding agents: deterministic ready queues, guarded CAS mutations, claims and fencing, and self-contained HTML reports.","directories":{},"_nodeVersion":"26.6.0","dependencies":{"yaml":"^2.9.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"ajv":"^8.20.0"},"_npmOperationalInternal":{"tmp":"tmp/wowbagger_0.1.0-alpha.17_1788107016668_0.014639618767458229","host":"s3://npm-registry-packages-npm-production"}},"0.5.0-beta.0":{"name":"wowbagger","version":"0.5.0-beta.0","keywords":["ledger","task-management","backlog","coordination","agent","multi-agent","reports","work-claims","compare-and-swap","markdown","git","cli"],"author":{"name":"Lee Stutzman"},"license":"MIT","_id":"wowbagger@0.5.0-beta.0","maintainers":[{"name":"lee-stutzman","email":"lstutzman@gmail.com"}],"homepage":"https://github.com/lstutzman/wowbagger","bugs":{"url":"https://github.com/lstutzman/wowbagger/issues"},"bin":{"wowbagger":"bin/wowbagger.js"},"dist":{"shasum":"1f54c6755133df2e25a12c0d9bc4cb782c31c1fb","tarball":"https://registry.npmjs.org/wowbagger/-/wowbagger-0.5.0-beta.0.tgz","fileCount":106,"integrity":"sha512-yGvjYDll3fVK35w+dJXaLErlYAK0UIU1CIbxy14ij85mYKoaeVE5K3KJsl4i968i2Tzxexo/01ffZ069yrWjcA==","signatures":[{"sig":"MEUCIHuVMM2jQ7tg9QLgCP02Cr5Qu8mEEosjClDiL1nuAez5AiEAqtLbIgHKekFZOilTIhIWird6Sqr64LHsN48kwKXby/8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4139641},"type":"module","engines":{"node":">=24"},"exports":{".":"./src/launch.js","./*":"./*","./launch":"./src/launch.js","./package.json":"./package.json","./wowbagger.js":"./bin/wowbagger.js","./schemas/*.json":"./schemas/*.json"},"gitHead":"6ca221d1cfed7a30a7ed29a32d842d44fdfda05c","scripts":{"test":"node --test test/*.test.js","check":"npm test && git diff --check && git diff --cached --check","report":"node bin/wowbagger.js report --ledger ledger --json","release:cut":"node scripts/cut-release.js","prepublishOnly":"node bin/wowbagger.js validate --ledger ledger --json >/dev/null && node --check bin/wowbagger.js && node scripts/verify-release-tag.js","release:channels":"node scripts/release-channels.js"},"_npmUser":{"name":"lee-stutzman","email":"lstutzman@gmail.com"},"repository":{"url":"git+https://github.com/lstutzman/wowbagger.git","type":"git"},"_npmVersion":"11.19.0","description":"Git-native work ledger for coding agents: deterministic ready queues, guarded CAS mutations, claims and fencing, and self-contained HTML reports.","directories":{},"_nodeVersion":"26.6.0","dependencies":{"yaml":"^2.9.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"ajv":"^8.20.0"},"_npmOperationalInternal":{"tmp":"tmp/wowbagger_0.5.0-beta.0_1788122761640_0.6728789389544623","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"wowbagger","version":"0.5.0","keywords":["ledger","task-management","backlog","coordination","agent","multi-agent","reports","work-claims","compare-and-swap","markdown","git","cli"],"author":{"name":"Lee Stutzman"},"license":"MIT","_id":"wowbagger@0.5.0","maintainers":[{"name":"lee-stutzman","email":"lstutzman@gmail.com"}],"homepage":"https://github.com/lstutzman/wowbagger","bugs":{"url":"https://github.com/lstutzman/wowbagger/issues"},"bin":{"wowbagger":"bin/wowbagger.js"},"dist":{"shasum":"db562b94bf2b2fc0b566e1b1b7e41379f75e51d2","tarball":"https://registry.npmjs.org/wowbagger/-/wowbagger-0.5.0.tgz","fileCount":108,"integrity":"sha512-Hic/0nB3fdsZhkGMSd07ncv3qML797Y5KUCR88RxpFAsToh5AGunPKG/q74/0Clv9ed6T9yd1IyiYnuiou406A==","signatures":[{"sig":"MEQCID2Ar9lNVCuUCNdOt3cfLSqd0dcDDsUciCuDNS8/JuwMAiBt3SefjlLWsW58OjII+3h+8zhtiNGwjzFQyfSVYYFBeg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4217115},"type":"module","engines":{"node":">=24"},"exports":{".":"./src/launch.js","./*":"./*","./launch":"./src/launch.js","./package.json":"./package.json","./wowbagger.js":"./bin/wowbagger.js","./schemas/*.json":"./schemas/*.json"},"gitHead":"79303d7de79a9518d25b2ae38f8f8c6f020e4840","scripts":{"test":"node --test test/*.test.js","check":"npm test && git diff --check && git diff --cached --check","report":"node bin/wowbagger.js report --ledger ledger --json","release:cut":"node scripts/cut-release.js","prepublishOnly":"node bin/wowbagger.js validate --ledger ledger --json >/dev/null && node --check bin/wowbagger.js && node scripts/verify-release-tag.js","release:channels":"node scripts/release-channels.js"},"_npmUser":{"name":"lee-stutzman","email":"lstutzman@gmail.com"},"repository":{"url":"git+https://github.com/lstutzman/wowbagger.git","type":"git"},"_npmVersion":"11.19.0","description":"Git-native work ledger for coding agents: deterministic ready queues, guarded CAS mutations, claims and fencing, and self-contained HTML reports.","directories":{},"_nodeVersion":"26.6.0","dependencies":{"yaml":"^2.9.0"},"_hasShrinkwrap":false,"devDependencies":{"ajv":"^8.20.0"},"_npmOperationalInternal":{"tmp":"tmp/wowbagger_0.5.0_1788634967189_0.24417566548197822","host":"s3://npm-registry-packages-npm-production"}}},"time":{"created":"2026-08-12T11:34:17.293Z","modified":"2026-09-05T19:28:17.307Z","0.1.0-alpha.1":"2026-08-12T11:34:17.662Z","0.1.0-alpha.2":"2026-08-12T22:29:06.946Z","0.1.0-alpha.3":"2026-08-12T23:06:29.801Z","0.1.0-alpha.4":"2026-08-15T12:18:34.180Z","0.1.0-alpha.5":"2026-08-17T09:26:05.446Z","0.1.0-alpha.6":"2026-08-17T13:54:32.196Z","0.1.0-alpha.7":"2026-08-18T08:58:06.719Z","0.1.0-alpha.8":"2026-08-23T12:50:47.777Z","0.1.0-alpha.9":"2026-08-23T14:21:12.036Z","0.1.0-alpha.11":"2026-08-28T08:33:51.407Z","0.1.0-alpha.12":"2026-08-28T12:33:47.238Z","0.1.0-alpha.13":"2026-08-29T15:01:31.767Z","0.1.0-alpha.14":"2026-08-30T11:22:31.284Z","0.1.0-alpha.17":"2026-08-30T16:23:36.857Z","0.5.0-beta.0":"2026-08-30T20:46:01.831Z","0.5.0":"2026-09-05T19:02:47.413Z"},"bugs":{"url":"https://github.com/lstutzman/wowbagger/issues"},"author":{"name":"Lee Stutzman"},"license":"MIT","homepage":"https://github.com/lstutzman/wowbagger","keywords":["ledger","task-management","backlog","coordination","agent","multi-agent","reports","work-claims","compare-and-swap","markdown","git","cli"],"repository":{"url":"git+https://github.com/lstutzman/wowbagger.git","type":"git"},"description":"Git-native work ledger for coding agents: deterministic ready queues, guarded CAS mutations, claims and fencing, and self-contained HTML reports.","maintainers":[{"name":"lee-stutzman","email":"lstutzman@gmail.com"}],"readme":"# wowbagger\n\n**The backlog may be infinite. The next item should not be ambiguous.**\n\n<p align=\"center\">\n  <img src=\"https://raw.githubusercontent.com/lstutzman/wowbagger/main/assets/wowbagger-v5-typing-cats-circuit-staff.jpg\" alt=\"Bowerick Wowbagger directing robotic agent cats typing at consoles with a circuit-lit shepherd's staff\">\n</p>\n\n**Don't Panic!** The books that helped shape my childhood taught me to meet\nabsurd systems with curiosity, humor, and a reliable way to find the next\nstep. [Douglas Adams's Hitchhiker's Guide creations](https://douglasadams.com/creations/hhgg.html)\nare part of that inspiration; Wowbagger is an independent work, not an\nofficial or affiliated project.\n\nWowbagger is a work ledger for coding agents. Every backlog item is one\nMarkdown file in your repository; every lifecycle change is a reviewable Git\ndiff. There is no database, no hosted service, and no private agent memory to\nlose.\n\n**Who it is for.** Maintainers running one or more coding agents across\nworktrees, sessions, and models, who need the backlog to survive a compaction, a\nrestart, or a change of harness — and who want the agent's writes guarded rather\nthan trusted.\n\n**What you get.** A deterministic ready queue that answers \"what is actionable\ntoday\". Guarded single-item writes with exact-byte compare-and-swap, so an agent\ncannot silently clobber your edit. Honest capability discovery, so a tool can\ntell what this core will and will not promise. A shipped skill that teaches an\nagent to use those guarantees instead of hand-editing your Markdown.\n\n**Start here:** [install the core and set up a ledger](#start-here).\n\n> **Status: published and self-hosted.** `0.5.0` is published on npm and has\n> a matching repository tag. It is the version this repository runs its own\n> backlog on. The API is stable at core contract version 5.\n>\n> **Channels.** A stable release sets both `latest` and `next` to the stable\n> version and publishes with `npm publish --tag latest`. A later prerelease\n> moves only `next` and publishes with `npm publish --tag next`, so `latest`\n> stays on the stable release. While every published release is a prerelease,\n> `latest` mirrors `next`: install the prerelease explicitly with\n> `wowbagger@next`. After the first stable release, a bare install resolves\n> to the stable release.\n>\n> **What is proved.** Contract version **5** validates the complete Markdown\n> ledger, selects a deterministic ready queue, exposes bounded `list` and\n> lossless `inspect` projections, and publishes guarded `create`, `transition`,\n> `patch`, `parent-migrate`, and `snooze` mutations. Mutations use exact-byte\n> compare-and-swap, atomic no-clobber publication, and explicit reconciliation\n> when a response is lost. Claims, fencing, adoption, prospective merge\n> verification, and publication finalization coordinate cooperating writers\n> without pretending to be an exclusive dispatch lock.\n>\n> `report` is a self-contained decision workspace: one scoped item browser with\n> **Work next** and other quick views, an area/status matrix, scoped attention\n> actions, dependency impact, interactive Flow charts, and a 3D dependency\n> graph that all share one scope. Version 2 report configurations add named\n> custom views whose statistics, readiness, attention, flow, graph, and impact\n> all describe one filtered subset. Reports remain derived output, not mirrored\n> ledger state.\n>\n> The core ships Claude Code, Codex, and OpenCode adapter packages on one shared\n> engine. Read `capabilities --json` before relying on a target-specific claim;\n> platform support is evidence-based, not inferred from whether a CLI starts.\n>\n> **What is not a lock.** A work claim is not an exclusive dispatch lease. On a\n> provisioned Git-backed ledger, claims coordinate cooperating agents through a\n> durable journal in Git's shared common directory: `claim acquire` uses\n> observed-state compare-and-swap, `publish-claimed` fences one item against the\n> active owner generation and expected revision, and `claim-verify` reconciles\n> response-loss and post-merge outcomes. Capability discovery therefore reports\n> `mode: \"merge-coordinated\"` and `safe_exclusive_dispatch: false`. Direct\n> filesystem writes, hostile processes, other clones, and non-claim-aware tools\n> still bypass the protocol.\n\n## TL;DR for agents\n\nWowbagger is the core authority for a Git-native work ledger. Use it instead\nof editing ledger Markdown by hand.\n\n```sh\nwowbagger --version                 # require 0.5.0\nwowbagger capabilities --json       # require contract_version: 5\nwowbagger validate --ledger ledger --json\nwowbagger ready --ledger ledger --as-of YYYY-MM-DD --json\nwowbagger inspect --ledger ledger --number N --json\n```\n\nFor a write, inspect immediately before dispatch, send the returned exact-byte\nrevision as the compare-and-swap witness, use the explicit core mutation, and\nvalidate again. On a provisioned ledger, commit each `create`, `transition`,\n`parent-migrate`, `snooze`, `patch`, or `publish-claimed` mutation before the\nnext mutating command. Never replay a lost write: reconnect, re-read current\nstate, and treat the outcome as unknown until the core or a human resolves it.\nNumbers are the human-facing item identity; `wb_...` ULIDs are internal\nidentities.\n\nThe core owns validation, ready selection, projections, lifecycle, CAS,\npublication, claims, fencing, and reconciliation. The harness or host owns\ndispatch, process safety, routing, and human approval. Claims coordinate\ncooperating writers; they are not exclusive locks.\n\n## Start here\n\nInstall the core CLI, then verify it. The supported runtime is Node.js 24; Node\n26 remains excluded because of the separate Vitest incompatibility:\n\n```sh\nnpm install -g wowbagger@latest   # stable release\nnpm install -g wowbagger@0.5.0   # exact plugin-matched release\n# or, from this release's Git tag:\n# npm install -g github:lstutzman/wowbagger#v0.5.0\nwowbagger --version         # 0.5.0\nwowbagger capabilities --json              # must report contract_version: 5\n```\n\nIn Claude Code, install the managed plugin:\n\n```sh\nclaude plugins install wowbagger\n```\n\nOr, from inside a Claude Code session:\n\n```\n/plugin install wowbagger\n```\n\nThis route is available after Wowbagger is listed in Claude Code's official\nmarketplace. Until then, or when installing a fork or unreleased revision, use\nthe direct repository marketplace:\n\n```\n/plugin marketplace add lstutzman/wowbagger\n/plugin install wowbagger@wowbagger\n```\n\nFor Codex and other agents, install the editable skill with `skills`:\n\n```sh\nnpx skills@latest add lstutzman/wowbagger --skill wowbagger\n```\n\nChoose one route. Do not install both the managed Claude plugin and the\neditable skill, or the skill will be loaded twice.\n\nThe plugin and `skills` installer drive the separately installed core rather\nthan bundling one, so a mismatch is detectable instead of silent. The skill\nreads `wowbagger --version` and `capabilities`; it requires the same\ndistribution version as the plugin and core `contract_version: 5`. It refuses\nan absent or incompatible core. It will not fall back to editing ledger files\nby hand, because that would bypass validation and atomic publication.\n\nNeither installer adds an MCP server, remote service, hook, or background\nprocess. The plugin and skill operate on the ledger through the installed core.\n\n### Set the ledger up before the first item\n\nDecide where items live **before your first `create`**. A ledger publishes items\nto `<ledger>/<id>.md` unless a committed `<ledger>/.wowbagger/layout.json` binds\na subdirectory:\n\n```sh\nmkdir -p path/to/ledger/.wowbagger path/to/ledger/items\necho '{\"layout_version\":1,\"items_directory\":\"items\"}' > path/to/ledger/.wowbagger/layout.json\n```\n\n`layout_version` must be `1` and `items_directory` names the committed item\ndirectory. `create` then publishes atomically to `<items_directory>/<id>.md`,\nand validation rejects parsed items outside it. Commit the directory the file\nnames — `create` publishes into an existing directory and does not make one.\nNothing is renamed after a create. This repository dogfoods that binding: its\nown items live in [`ledger/items/`](ledger/items/).\n\nIf your items will mirror an external tracker and carry consumer-owned fields,\ndeclare those fields **before the first item**. The declaration makes each\nnamed extension member patchable:\n\n```sh\necho '{\"extensions_version\":1,\"members\":{\"external_id\":\"string\"}}' \\\n  > path/to/ledger/.wowbagger/extensions.json\n```\n\nEach member declares one value type: `string`, `integer`, `boolean`, or\n`string-list`. A ledger without the file has no patchable extension member,\nand `set.extensions` refuses the missing declaration by name. The declaration\nauthorizes writes; it does not define item validity, so `validate` does not\nread it. Commit the declaration with the other ledger setup.\n\nIf an existing ledger already carries extension values, do not create the\ndeclaration by hand. Select every member and type explicitly in a request,\nreview a dry run, then publish the same proposal:\n\n```json\n{\"members\":{\"tags\":\"string-list\"}}\n```\n\n```sh\nwowbagger extensions-provision --ledger path/to/ledger \\\n  --input declaration.json --json --dry-run\nwowbagger extensions-provision --ledger path/to/ledger \\\n  --input declaration.json --json\ngit add path/to/ledger/.wowbagger/extensions.json\ngit commit -m \"Declare patchable ledger extensions\"\n```\n\nThe command first requires a valid complete ledger. It validates every\noccurrence of each selected member, reports occurrence counts, changes no item\nbytes, and publishes one canonical declaration without overwriting a different\none. Commit that file before the first corresponding `patch`, inspect the\ntarget for its current revision, then use `set.extensions.tags`. An item that\nwrites the selected member with a YAML anchor or alias remains\n`extension-anchored` and requires a reviewed hand-edit.\n\nCores at `0.1.0-alpha.4` and earlier ignore the layout file and publish every\nitem at the ledger root.\n\nOn such a core, relocating an item by hand has a trap. `create` writes an\nuntracked file, so `git mv` refuses the path it just published; an unchecked\nbatch then runs `git add -A` and commits the item at the ledger root, where it\nsilently stays. Use plain `mv`, then `git add` both paths, and check the exit\ncode of every command before the commit:\n\n```sh\nmv path/to/ledger/<id>.md path/to/ledger/items/<id>.md || exit 1\ngit add path/to/ledger || exit 1\n```\n\nA committed item outside the configured items directory then fails validation\nand refuses every read and every guarded mutation on that ledger, including\nones that never touch it. The refusal names the expected path and the\nrelocation that repairs it.\n\n### File the first item\n\nEvery command below takes `--json` and writes exactly one JSON object to\nstandard output. `mint-id` prints a canonical ID so no caller writes base32 by\nhand:\n\n```sh\nwowbagger mint-id --json                     # -> result.id\ncat > request.json <<'JSON'\n{\n  \"id\": \"wb_...\",\n  \"item\": {\n    \"title\": \"Map the fictional route\",\n    \"kind\": \"task\",\n    \"priority\": 2,\n    \"provenance\": { \"source\": \"user-request\", \"recorded_at\": \"2030-01-10T12:34:56.789Z\" },\n    \"depends_on\": [],\n    \"related\": []\n  },\n  \"body\": \"\\n# Problem\\n\\nWhat is wrong.\\n\\n# Acceptance criteria\\n\\n1. ...\\n\"\n}\nJSON\nwowbagger create --ledger path/to/ledger --input request.json --json\n```\n\nThe item lands in `triage` with a core-assigned `number` — the integer handle\nyou say out loud. `create` does not accept a `number` and does not accept a\n`status`. Move it into the backlog with an explicit accepting transition, then\nask what is workable:\n\n```sh\nwowbagger inspect    --ledger path/to/ledger --number 1 --json   # -> revision\nwowbagger transition --ledger path/to/ledger --input accept.json --json\nwowbagger ready      --ledger path/to/ledger --as-of YYYY-MM-DD\n```\n\n`transition` fences on the `expected_revision` that `inspect` just returned, so\ninspect immediately before you transition. On a provisioned ledger, commit each\nmutation before running the next one — see\n[Commit each mutation before the next one](#commit-each-mutation-before-the-next-one).\n\nFor an isolated consumer pilot, create or select the disposable worktree before\nthe agent starts. Then launch a new session with that worktree as its project\nroot. Follow the [isolated dogfood pilot runbook](docs/isolated-dogfood-pilot.md);\ndo not try to drive a sibling worktree from an already-running agent session.\n\nTo use the core directly from a clone instead, see\n[Core commands](#core-commands).\n\n## Why the name?\n\nWowbagger the Infinitely Prolonged is a Douglas Adams character faced with an\nabsurdly large, strictly ordered list and the prospect of working through it\none entry at a time.\n\nThat is also a fair description of software maintenance.\n\nThe project is an independent literary nod and is not affiliated with or\nendorsed by Douglas Adams' estate.\n\n## Why adopt the skill instead of editing Markdown by hand\n\nThe ledger is plain Markdown, so an agent *can* edit it with a text editor. The\nskill exists because four things break when it does.\n\n- **Validation is whole-ledger and fail-closed.** One malformed item refuses\n  every read and every guarded mutation on that ledger, including commands that\n  never touch it. A hand-edit finds that out later, and usually in someone\n  else's session. `create`, `transition`, `parent-migrate`, `snooze`, and\n  `patch` validate the complete candidate ledger *before* publishing anything,\n  and refuse `unchanged`.\n- **A hand-edit has no lost-update guard.** Every guarded write takes the exact\n  SHA-256 revision `inspect` returned and refuses if the bytes moved. An editor\n  writes over whatever is there.\n- **Publication is atomic and no-clobber.** A guarded write either lands whole\n  or does not land. A half-written item from an interrupted editor is a broken\n  ledger.\n- **On a provisioned ledger, a hand-edit is a stale write.** The claim journal\n  validates recorded mutations against Git `HEAD`. An out-of-protocol edit makes\n  the next mutation refuse exit 6 `unauthorized-revision`, and every later\n  mutation stays blocked until an operator rules on it. The protocol used to\n  force that edit for a wrong title; it no longer does — `patch` covers it.\n\nWhat the skill adds on top of the CLI is the part an agent gets wrong unaided:\nit checks the core version before the first command, it says **#N** to people\nand ULIDs to the tool, it reads acceptance criteria out of the item body rather\nthan the metadata, it derives an epic's progress from its children instead of\nits status, and it tells the user before a batch that filing ten items means ten\ncommits, not one.\n\nIt also refuses to fall back. If the core is absent or the contract version is\nnot 3, the skill stops and says so. It does not quietly start editing files.\n\n## Core, adapter, skill, plugin\n\nFour separate things, deliberately:\n\n| Piece | What it is | Where it lives |\n|---|---|---|\n| **core** | The `wowbagger` CLI. Harness-neutral; it knows no vendor. | `src/`, `bin/`, npm package `wowbagger` |\n| **adapter** | Per-harness machinery that lets an agent drive the core safely: negotiation, capability checks, forwarding, honest outcome mapping. It owns no lifecycle logic. | [`adapters/`](adapters/) |\n| **skill** | Harness-native instructions telling an agent *when* and *how* to use the core. | [`skills/wowbagger/SKILL.md`](skills/wowbagger/SKILL.md) |\n| **plugin** | The Claude Code distribution wrapper: marketplace entry, skill, adapter. Self-hosted from this repository. | [`.claude-plugin/`](.claude-plugin/) |\n\nThe core and the plugin install independently and must carry matching\ndistribution versions. The core contract version and the adapter contract\nversion are separate domains: the core is at **5**, the adapter is at **2**, and\nthe legacy work-claim, ledger-publication, and ledger-mutation envelopes stay at\n**1**.\n\n## Installation, compatibility, and security\n\n### Installation routes\n\nWowbagger ships as an npm package with a single `wowbagger` binary. There are\ntwo supported install routes:\n\n- **npm registry** — `npm install -g wowbagger` installs the stable release\n  once it exists; `npm install -g wowbagger@next` installs the newest\n  prerelease. While every published release is a prerelease, `latest` mirrors\n  `next`, so a bare install resolves to the same bytes. After the first\n  stable release, `latest` stays on stable and only `next` follows later\n  prereleases.\n- **git tag** —\n  `npm install -g github:lstutzman/wowbagger#v0.5.0` installs this\n  release. Installing at a ref installs the core and every adapter that ref\n  carries.\n\nEither route installs the core and the `wowbagger` command. The Claude Code\nplugin is a separate artifact (see [Start here](#start-here)).\n\n### Compatibility\n\nThe contract version is top-level `contract_version`, reported by\n`wowbagger capabilities --json`. Contracts change it; refactors do not. The\nnpm/Git distribution version names release bytes. General API consumers\nnegotiate the contract version. The shipped plugin skill additionally requires\nthe exact core distribution version that shipped with it, because its\ninstructions can depend on additive behavior from that release.\n\nA widening inside one contract version does not move it, so the version field\ncannot answer every question. `set.body_append` and `set.extensions` both\nshipped after `0.1.0-alpha.5` published `contract_version: 3`. Probe for them by\nsending the request and reading the refusal — an `unknown-member` issue at\n`/set/body_append` means the core predates the append — or pin the distribution\nversion.\n\n- **Node.js:** 24 and later. The release gate runs the full suite on Node\n  24.20.0 with the strict deprecation gate; Node 26 stays excluded because of\n  the separate Vitest incompatibility.\n- **Platforms:** the core runs wherever Node.js runs. The Claude Code adapter\n  declares Darwin, Linux, and Windows `supported` from native common-vector\n  evidence. Every other shipped adapter target remains `unverified`.\n- **Other tooling:** `wowbagger` manages a Git-tracked Markdown ledger. It\n  needs an accessible Git checkout for work-claim and namespace operations.\n  Before `provision`, run\n  `wowbagger claim capabilities --ledger <dir> --json` and require\n  `result.operations.work_claim.supported: true`.\n\n### Security\n\n- **Read-only by default.** `validate`, `ready`, `report`, `inspect`, `list`,\n  `capabilities`, and `mint-id` never modify anything. Every item mutation\n  (`create`, `transition`, `parent-migrate`, `snooze`, `patch`, and\n  `publish-claimed`) is an explicit, reviewable write.\n- **Lock is not a claim.** A short mutation lock serializes writers during one\n  operation. It does not grant a work claim.\n- **Claims are merge-coordinated, not exclusive.** `claim acquire` uses\n  compare-and-swap against the observed claim state. `publish-claimed` checks\n  the active owner generation and expected ledger revision before it writes\n  one item. `claim-verify` records the final Git outcome and detects later\n  revision drift. Legacy `create` and `transition` refuse claim conflicts.\n- **Adopting a revision is an operator ruling, not an escape hatch.**\n  `claim-adopt` moves the authorized revision to one named committed revision\n  and stops. It writes no item byte, it is per item and per revision explicit,\n  there is no adopt-all, and the next out-of-protocol edit refuses again.\n- **Local authority only.** The protocol protects cooperating worktrees in one\n  Git repository. It does not stop direct filesystem writes, hostile\n  processes, other clones, or alternate write paths. Capability discovery\n  therefore reports `mode: \"merge-coordinated\"` and\n  `safe_exclusive_dispatch: false`.\n- **Supply chain.** Install only from the npm registry or this repository's\n  git tags, and verify the `contract_version` your adapter or script requires.\n\nThis README is documentation, not a substitute for the contracts. The machinery\nbehind these properties is specified in the documents listed under\n[Where the contracts live](#where-the-contracts-live).\n\n## Upgrading from an earlier wowbagger\n\nThis section is written for agents as much as humans: if you already drive a\nwowbagger core, this is how you move forward safely.\n\nUpgrade the pieces you installed:\n\n```sh\nnpm install -g wowbagger@latest                  # public npm registry\nnpm install -g github:lstutzman/wowbagger#v0.5.0  # immutable Git release\ngit pull && npm ci                            # or: a direct checkout\n```\n\nIn Claude Code, update the plugin the same way it was installed:\n\n```\n/plugin marketplace update wowbagger\n/plugin update wowbagger@wowbagger\n```\n\n```sh\nwowbagger --version\nwowbagger capabilities --json\n```\n\nThe plugin requires its exact core distribution version and top-level core\n`contract_version: 5`. Direct API consumers must check the contract version\nthey support; installed plugin users must also keep the plugin and core\ndistribution versions equal.\n\nThe shipped adapter selects only adapter contract version 2 and requires core\ncontract version 5. The adapter contract and the core contract are separate\nversion domains: the adapter stays at 2 while the core is at 5. A v1-only\nconsumer receives `unsupported-adapter-contract-version`; it does not receive v2\nbehavior. The schema-2 transport is available. Ledger migration remains a\nseparate quiesced maintenance operation. The\n[schema-2 migration runbook](docs/schema-2-migration.md) documents the required\nbackup, dry run, explicit `--apply`, lock refusal, and recovery procedure. The\ntool is dry-run-only by default:\n\n```sh\nTMPDIR=/tmp node scripts/migrate-schema-2.js --ledger path/to/ledger\n```\n\nBehaviour changes are recorded in [CHANGELOG.md](CHANGELOG.md) — read its\nUnreleased section on every upgrade. If you automated against an earlier\ncore, these are the changes most likely to touch you:\n\n- **Stop hand-editing frontmatter.** `wowbagger patch` now covers `title`,\n  `priority`, `depends_on`, `related`, the body, and every extension member the\n  ledger declares, all under the same per-ID lock and revision\n  compare-and-swap as `transition`. Hand-edits bypass validation and atomic\n  publication, and on a provisioned ledger they block the next mutation.\n- **`number` is not yours.** On schema version 2 the core assigns the number at\n  `create` and refuses a caller-supplied one; `patch` refuses it because it is\n  immutable identity. Keep a legacy identifier in a declared extension member or\n  in the item body.\n\n- **Repair duplicate numbers through `ledger-repair` version 1.** Generate a\n  read-only proposal with `number-repair-proposal`, review every\n  `expected_revision` and `replacement_number`, then apply the complete mapping\n  with `number-repair`. The command preserves ULID identities and relations and\n  does not change core contract version 5.\n\n- **Run `version-drift --json` before mutation.** It compares the installed\n  skill pin, required core contract, and running core, and names the stale\n  package, plugin cache, or linked checkout with remediation.\n- **Delete your local ULID generator.** `wowbagger mint-id --json` prints a\n  canonical ID; `--date YYYY-MM-DD` selects the creation date the ID must\n  encode.\n- **Read `core.number` and `core.priority` from results** instead of decoding\n  `source_base64`. Every frontmatter field lives under `item.core`; `item.id`\n  is the one deliberate duplicate.\n- **`ready` without `--json` is for you to read**: `#number pri=priority\n  title` per line, in ready order. Machine consumers keep `ready --json`,\n  which is byte-stable.\n- **A claim request with an own `__proto__` member is now refused** as\n  `invalid-request` instead of silently losing the member.\n- **`create` tells you where the item landed**: results report\n  `core.status: \"triage\"`, and the refusal for a caller-supplied `status`\n  names the accepting transition (triage to backlog) that makes an item\n  ready.\n- **Bind a subdirectory layout in the ledger, not in each runner.** Commit\n  `<ledger>/.wowbagger/layout.json` with\n  `{\"layout_version\":1,\"items_directory\":\"items\"}`. `create` then derives\n  `<ledger>/items/<id>.md`; validation rejects parsed items outside `items/`.\n  Without the file, the compatible layout remains `<ledger>/<id>.md`.\n- **A date refusal now carries the item's own dates.** `date-before-created`\n  and `date-before-updated` both carry `item_created` and `item_updated`, so\n  correcting the request costs no `inspect` round-trip. Item dates derive from\n  the ULID timestamp, which is UTC: an item minted just after midnight UTC\n  carries tomorrow's date for anyone west of UTC.\n\n## The problem\n\nCoding agents lose context. They are restarted, compacted, moved between\nworktrees, or replaced by a different model. A useful backlog therefore cannot\nlive only in one conversation or one harness's private state.\n\nWowbagger makes the repository the durable coordination boundary:\n\n- One inspectable Markdown file per backlog item.\n- YAML metadata for lifecycle, priority, dependencies, and structured provenance.\n- Git history as the audit log and recovery mechanism.\n- Dependency-aware ready queues so an agent can ask what is actionable now.\n- Guarded one-item creation, patching, and lifecycle transitions with\n  exact-byte revisions, cooperative locks, and explicit refusal when a change\n  needs a multi-item transaction.\n- A documented adapter boundary for tool-capable agent harnesses, without\n  coupling the core to one vendor.\n- Mechanical validation and derived reports instead of duplicated status data.\n\n## Harness-neutral by design\n\nClaude Code is an adapter, not the architecture. The core schema and command\ninterface will not depend on Claude-specific hooks, slash commands, paths, or\nenvironment variables.\n\n```mermaid\nflowchart TD\n    Claude[Claude Code adapter] --> Core[Wowbagger core]\n    Codex[Codex adapter] --> Core\n    OpenCode[OpenCode adapter] --> Core\n    Other[Kimi and other tool-capable agents] --> Core\n    Core --> Markdown[Markdown and YAML backlog]\n    Core --> Git[Git audit and history]\n```\n\nThe documented compatibility targets are:\n\n- Claude Code\n- OpenAI Codex\n- OpenCode\n- Kimi and other OpenAI-compatible model APIs hosted in agent harnesses that\n  provide repository filesystem and command-execution tools\n\nAn OpenAI-compatible API describes model transport; it does not by itself\nprovide agent tools. The [adapter contract](docs/adapter-contract.md) records\nthe required host capabilities and refusal rules, and\n[the integration guide](docs/openai-compatible-integration.md) states what a\nKimi or other OpenAI-compatible host can do today — driving the core CLI\ndirectly — versus what a verifiable compatibility claim requires. Neither\nclaims that API compatibility alone makes a harness compatible.\n\nThis checkout ships three adapter packages on one shared entrypoint runtime:\n[`adapters/claude-code/`](adapters/claude-code/), [`adapters/codex/`](adapters/codex/),\nand [`adapters/opencode/`](adapters/opencode/). Each answers the bootstrap wire\nwith its own identity and honest host declaration. Invocation forwarding, path\nand limit guards, approval, and context all enter through the shared shipped\nengine. Run the conformance suite to see the evidence:\n\n```sh\nTMPDIR=/tmp node spec/run-adapter-implementation.js                     # claude-code\nTMPDIR=/tmp node spec/run-adapter-implementation.js --target codex\nTMPDIR=/tmp node spec/run-adapter-implementation.js --target opencode\n```\n\nThe native Darwin and Linux Claude Code reports each pass all 212 assertions across all 16\ncases and report `\"status\": \"pass\"`. Codex and OpenCode execute the same 212\nassertions through the same engine, but both target reports remain `\"fail\"`\npending target-specific evidence, and every platform declaration on those two\nmanifests stays `unverified`. The Kimi and OpenAI-compatible harness adapters\nare not written.\n\n**All three shipped packages are read-only as they stand, and say so.** None\nwires a consumer approval source, so each declares no trusted approval and\nrefuses `create`, `transition`, and `patch` with `capability-unavailable`\nnaming the missing capability, before any core process starts. Mutation\nauthority is a runtime dependency a host supplies in code: a process that\nembeds `runAdapterEntrypoint` passes `hostRuntime` — the approval source, the\nclock, the redeemed-nonce store, and the core executable identity it attests —\nand its describe result then advertises trusted approval truthfully. The\napproval never rides the bootstrap request, which the model controls;\n`docs/adapter-contract.md` section 5.1 states the mechanism and its rules.\n\n## Core commands\n\nThe current core requires Node.js 24. Node 26 is not in the supported matrix.\nFrom a Wowbagger checkout,\n`./bin/wowbagger.js --help` prints the full command inventory,\n`./bin/wowbagger.js <command> --help` prints that command's usage, and\n`./bin/wowbagger.js --version` prints the installed package version. The\ncommands below are the current inventory:\n\n```sh\nnpm ci\n./bin/wowbagger.js validate --ledger path/to/ledger --json\n./bin/wowbagger.js ready --ledger path/to/ledger --as-of 2030-01-15 --json\n./bin/wowbagger.js ready --ledger path/to/ledger --as-of 2030-01-15\n./bin/wowbagger.js report --ledger path/to/ledger --as-of 2030-01-15 --json\n./bin/wowbagger.js capabilities --json\n./bin/wowbagger.js inspect --ledger path/to/ledger --id wb_... --json\n./bin/wowbagger.js inspect --ledger path/to/ledger --number 30 --json\n./bin/wowbagger.js list --ledger path/to/ledger --input query.json --json\n./bin/wowbagger.js create --ledger path/to/ledger --input request.json --json\n./bin/wowbagger.js transition --ledger path/to/ledger --input request.json --json\n./bin/wowbagger.js parent-migrate --ledger path/to/ledger --input request.json --json\n./bin/wowbagger.js snooze --ledger path/to/ledger --input request.json --json\n./bin/wowbagger.js patch --ledger path/to/ledger --input request.json --json\n./bin/wowbagger.js extensions-provision --ledger path/to/ledger --input declaration.json --json\n./bin/wowbagger.js mint-id --json\n./bin/wowbagger.js publish-claimed --ledger path/to/ledger --input request.json --json\n./bin/wowbagger.js claim-merge-verify --ledger path/to/ledger --base main --head feature --json\n./bin/wowbagger.js claim-sync --ledger path/to/ledger --json\n./bin/wowbagger.js claim-adopt --ledger path/to/ledger --input request.json --json\n./bin/wowbagger.js mutation-finalize --ledger path/to/ledger --recovery-token token --json\n./bin/wowbagger.js provision --ledger path/to/ledger --json\n./bin/wowbagger.js claim capabilities --ledger path/to/ledger --json\n./bin/wowbagger.js claim acquire --ledger path/to/ledger --input request.json --json\n./bin/wowbagger.js claim read --ledger path/to/ledger --input request.json --json\n./bin/wowbagger.js claim renew --ledger path/to/ledger --input request.json --json\n./bin/wowbagger.js claim release --ledger path/to/ledger --input request.json --json\n./bin/wowbagger.js claim-verify --ledger path/to/ledger [--id wb_...] --json\n```\n\n`validate` writes exactly one JSON result to standard output. A valid ledger\nreturns:\n\n```json\n{\"valid\":true,\"errors\":[]}\n```\n\n`ready` validates first, then returns only the normative ready result:\n\n```json\n{\"as_of\":\"2030-01-15\",\"valid\":true,\"ready\":[\"wb_...\"]}\n```\n\n`validate` and `ready` require `--ledger`; `ready` also requires an ISO\ncalendar `--as-of` date. Without `--json`, `ready` prints a human queue —\n`#number pri=priority title` per ready item — while `ready --json` stays\nbyte-stable for machine consumers. Invalid ledgers return the validation JSON and\nexit nonzero. The core rejects invalid UTF-8, symbolic-link entries, unreadable\npaths, and `.md` special files rather than returning a partial view. Real\ndirectories ending in `.md` remain containers and are traversed. These checks\nprovide deterministic read hygiene; they are not a sandbox against a privileged\nprocess racing filesystem changes.\n\n`inspect` returns a lossless raw-byte snapshot and its SHA-256 revision, by\n`--id` or by `--number`. `create` publishes only a caller-supplied canonical ID\nthrough atomic no-clobber publication — `mint-id` prints one, so no consumer\nwrites base32 by hand. `transition` compares the inspected revision while\ncooperative per-ID locks are held, then changes one lifecycle item or refuses\nthe request if dependent cleanup or child disposition would require changing\nanother item.\n\n### What `patch` may change\n\n`patch` re-scopes an existing item in band, under the same per-ID lock,\nexact-byte compare-and-swap, candidate whole-ledger validation, and atomic\npublication as `transition`. The patchable set is exactly:\n\n| `set` member | Rule |\n|---|---|\n| `title` | Non-empty string, replaced whole. |\n| `priority` | Non-negative integer; `null` removes it. |\n| `depends_on` | Whole relation list, replaced. `[]` clears it. |\n| `related` | Whole relation list, replaced; `null` removes it. |\n| `body` | Whole body replaced. `\"\"` empties it. **Never merges.** |\n| `body_append` | Written after the current body. Mutually exclusive with `body`. |\n| `extensions` | Container naming declared extension members; each value replaces that member whole, `null` removes it. |\n\nA `set` member outside that list is an `invalid-request` issue at its `/set`\npointer — a typo becomes a refusal, never a new frontmatter member. `number`,\n`kind`, and `provenance` are refused deliberately.\n\nTwo traps are worth carrying here rather than leaving to discovery. **A body\npatch replaces and never merges:** a consumer mirroring an external source MUST\nread-modify-write from the body `inspect` just returned and MUST never\nregenerate from the source alone, because `expected_revision` is a byte-level\nlost-update guard with no semantic safety at all. Use `set.body_append` when the\nchange is an addition. And **extension members are patchable only where the\nledger declares them** — see [Set the ledger up before the first\nitem](#set-the-ledger-up-before-the-first-item).\n\nWhich members you own at all is a four-way split — core-owned,\nconsumer-editable through `patch`, mutable through a dedicated command, and\ncreate-once — stated member by member in the mutation contract's\n**frontmatter ownership** table. Use `parent-migrate` to repoint an existing\nitem to or from an epic, and `snooze` to set or clear `snoozed_until`. Read the\ntable; do not send a patch and interpret the refusal.\n\n### An epic's progress is derived, never stored\n\nAn epic stores no progress and has no `backlog -> in-progress` edge. Its\nprogress is the **terminal ratio**: direct children whose status is `done` or\n`killed`, over all direct children. That is one definition with three surfaces —\nthe mutation contract, the epic completion rollup, and the report's\nepic-enablement factor all read the same set. A terminal date is not the test: an\narchived or deferred child is work postponed, not work retired, and does not\ncount.\n\n### Diagnosing an invalid ledger\n\nOne invalid item refuses every read and every guarded mutation on that ledger,\nincluding commands that never touch it. That refusal is the diagnosis, and no\ncommand asks you to parse the Markdown by hand:\n\n- `validate --json` lists every error. An error whose repair the validator can\n  derive also carries `expected_path` and a `remediation` naming the repair.\n- `inspect` still refuses with exit 3 `ledger-invalid` — a revision from an\n  unjudged ledger must never look like a mutation precondition — but the\n  refusal carries `error.details.item`, the complete snapshot of the item you\n  asked for, whenever no validation error names that item's path. A faulted\n  item is withheld; `validate` already names its repair.\n- `claim-verify --json` reports `result.ledger_validation`. Bare verification\n  is strict repository-wide mode; `--id <item>` keeps all findings visible but\n  fails only for that item and global barriers. Exit 0 with an invalid\n  `ledger_validation` still means claim state is clean but validation blocks\n  mutation.\n\n### Work claims\n\n`provision` binds one ledger namespace to the repository. `claim` manages\ndurable acquire, read, renew, and release decisions. `publish-claimed` accepts\nthe exact candidate item bytes and fences their publication against the active\nowner generation and expected revision. `claim-verify` reconciles pending\npublication outcomes against the working tree and Git `HEAD`; run it after a\nclaimed publication is committed or merged, and before the next fenced\noperation. `claim-adopt` is the non-destructive remedy described below.\n\nCore and work-claim versions use distinct negotiation fields. Read the\ntop-level `contract_version` from core `capabilities`. Read\n`result.operations.work_claim.api_version` from\n`claim capabilities --ledger <dir> --json`. A claim response's top-level\n`contract_version` is the legacy claim-envelope marker; do not compare it with\nthe core version. A contract consumer that receives an unsupported version\nrefuses rather than guessing. The shipped plugin skill also requires its exact\ncore distribution version. Direct checkout use — `./bin/wowbagger.js` from a\nclone — remains supported and is what this repository's own ledger uses.\n\n## Commit each mutation before the next one\n\nOn a **provisioned** ledger — one where `provision` has bound a namespace and\n`claim capabilities` reports `mode: \"merge-coordinated\"` — there is one\noperating rule:\n\n**Commit each mutation to Git before running the next mutating command.**\n\nThe durable claim store reconciles every recorded mutation with Git `HEAD` and\nthe working tree. The next mutation refuses when that reconciliation finds an\n`unauthorized-revision`, requires Git finalization, or requires synchronization\nfor the item the command targets. A synchronization finding on an unrelated\nitem remains visible to `claim-verify` but does not block the command.\n\nAn existing item's latest authorized working-tree bytes and an earlier\nauthorized revision at `HEAD` form an authorized predecessor/successor window.\nThat window produces no finding, so another mutation can run before the first\none is committed. Acceptance of the later mutation does not make either change\ndurable. Commit each mutation anyway, then run `claim-verify`.\n\nThe loop that works:\n\n```sh\n./bin/wowbagger.js create --ledger path/to/ledger --input request.json --json\ngit add path/to/ledger && git commit -m \"Record the mutation\"\n./bin/wowbagger.js claim-verify --ledger path/to/ledger --id wb_... --json\n./bin/wowbagger.js transition --ledger path/to/ledger --input next.json --json\n```\n\nFor example, an authorized new item that is still absent from `HEAD` makes the\nnext command return exit 6:\n\n```json\n{\"ok\":false,\"namespace\":\"ledger-mutation\",\"command\":\"create-v1\",\"contract_version\":1,\n \"state\":\"unchanged\",\"error\":{\"code\":\"claim-store-unavailable\",\n \"message\":\"The durable claim store is unavailable.\",\n \"details\":{\"reason\":\"publication-reconciliation-required\",\"findings\":[{\n   \"code\":\"stale-write-detected\",\"reason\":\"git-finalization-required\",\n   \"expected_path\":\"wb_....md\",\n   \"remediation\":\"Commit wb_....md in Git, then run claim-verify.\"}]}}}\n```\n\n`state: \"unchanged\"` is exact — nothing was written. **`claim-verify` is the\nreconciliation procedure.** Read `details.findings`, do what each\n`remediation` string says, run `claim-verify` until it returns exit 0, then\nrepeat the refused command. A `worktree-synchronization-required` finding on an\nunrelated item does not block the requested mutation. The same finding on the\ntarget item, and every `unauthorized-revision` finding, remains blocking.\n\nBatch work is where this bites. Filing ten items means ten serial\n`create --auto-commit` calls and ten commits, not one batch commit. Wowbagger\npermanently rejects batch create for the direct-Markdown architecture:\n`limits.multi_item_atomicity` remains `false`, request order is the supported\nbulk order, and each create must finish or recover before the next begins. See\nthe [batch-create decision](docs/design/2026-08-30-batch-create.md).\n\n### Or fold the commit into the mutation\n\n`--auto-commit` performs that whole loop inside one invocation, on a provisioned\nledger only:\n\n```sh\n./bin/wowbagger.js transition --ledger path/to/ledger --input next.json --json --auto-commit\n```\n\nIt is opt-in per invocation. There is no configuration setting or environment\ndefault, because a hidden default would make existing automation create Git\ncommits unexpectedly. The flag is accepted on `create`, `transition`,\n`parent-migrate`, `snooze`, `patch`, and `publish-claimed`.\n\nWhat one flagged invocation does: refuse if anything is staged anywhere or any\nforeign path under the ledger is dirty; reconcile; run the mutation unchanged;\ncommit exactly the changed item and at most one\n`.wowbagger/reconcile-<namespace>.md` with a fixed subject such as\n`wowbagger: transition item #7`; verify the commit; then run `claim-verify`\nbefore it answers. A command that owns the claim journal may rebuild only its\nderived reconciliation log during preflight. `create` remains strict, and\nevery other dirty ledger path still refuses. On success the result gains\n`git_commit`, `commit_paths`, and `claim_verified`.\n\nIf claim verification refuses, auto-commit preserves its code and reason in\n`claim_verify_code` and `claim_verify_reason`. Only\n`claim_verify_reason: \"claim-store-locked\"` is retryable; unresolved\nreconciliation is not.\n\nUnstaged and untracked files **outside** the ledger are left alone. Hooks and\nsigning are honoured; `--no-verify` is never passed. Nothing is pushed.\n\nA refused mutation never commits. When the item is published but the commit\nfails, the answer is exit 6 `git-commit-failed` with a recovery token, and one\nidempotent command finishes the job:\n\n```sh\n./bin/wowbagger.js mutation-finalize --ledger path/to/ledger --recovery-token <token> --json\n```\n\nRepeating it creates no second commit, so a lost response and a failed commit\nrecover the same way. [docs/mutation-contract.md](docs/mutation-contract.md)\nsection 13 is the full contract.\n\n### When the response is lost\n\nA mutation you dispatched can lose its response: the process is signalled or\ntimes out, a stream arrives truncated, or the transport to the machine that owns\nthe ledger drops. None of that observes the ledger, so none of it says whether\nthe write applied.\n\nOnly a complete observed result establishes an outcome. Exit 0 with state\n`committed` is a success; a complete refusal with state `unchanged` is a proven\nnon-write; exit 6 `post-commit-recovery-required` says the item is published and\ncleanup remains; exit 6 `write-outcome-unknown` says publication was attempted\nand the visible bytes are indeterminate. Anything else — signal, timeout,\ntruncated output, no envelope, no response at all — is unresolved.\n\nUnresolved is answered by one sequence, never a retry: Dispatch once, never\nreplay, invalidate the inspected revision, reconnect, then re-read the ledger.\nRe-reading is `validate` plus `inspect` of the ID you already know, compared\nagainst what you observed before you dispatched. What you read back is current\nledger state; it never proves that the lost dispatch caused it. A person reviews\nthat comparison before any new mutation, and the new mutation is built on the\ncurrent revision, not resent.\n\nExit 4 is not response loss. A `revision-conflict` proves the write did not run;\nre-inspect and decide again.\n\nThere is no operation ID and no replay endpoint, because nothing replays.\n[docs/mutation-contract.md](docs/mutation-contract.md) section 10 is the full\ncontract.\n\n### When the item was changed outside the protocol\n\nAn `unauthorized-revision` finding means someone edited the item without going\nthrough a guarded verb. There are **two** remedies, and choosing between them is\nan operator's decision, not the agent's:\n\n- **Restore** the authorized revision, commit, and run `claim-verify`. This\n  discards the edit.\n- **Adopt** the committed revision with `claim-adopt`, then run `claim-verify`.\n  This keeps the edit and moves the authorized revision to it.\n\n```sh\n./bin/wowbagger.js claim-adopt --ledger path/to/ledger --input adopt.json --json\n```\n\nAdoption is per item and per revision explicit — the request names the item, the\nrevision it believes is authorized, the revision being adopted, and who is\nruling. There is no adopt-all. It writes no item byte, so `updated` and the body\nsurvive exactly, and it appends one `revision-adoption` journal entry so the\naudit trail records the ruling. It refuses a stale witness, an unexpired claim on\nthe item, a revision that is not at Git `HEAD` and in the caller's own working\ntree, and a ledger that would not validate. Adoption is not a fence hole: the\nnext out-of-protocol edit refuses again, measured against the adopted revision.\n\nFull rules, the other blocking finding codes, and why validating against\nworking-tree bytes was rejected are in\n[the mutation contract](docs/mutation-contract.md) section 12 and\n[the work-claim contract](docs/work-claim-contract.md) sections 3.2 and 3.3.\n\n## The HTML report\n\n`report` validates the complete ledger, reads `.wowbagger/report.json`, and\natomically publishes one self-contained HTML file. The output must be outside\nthe ledger. Relative configured output paths resolve from `.wowbagger/`;\nrelative `--out` overrides resolve from the caller's working directory.\n\n```json\n{\n  \"report_version\": 1,\n  \"repository\": { \"name\": \"Example repository\", \"logo\": \"logo.svg\" },\n  \"title\": \"Ledger report\",\n  \"output\": \"../../ledger-report.html\",\n  \"fields\": {\n    \"area\": \"/priority_area\",\n    \"complexity\": \"/complexity\",\n    \"rank\": \"/priority_rank\",\n    \"class\": \"/class\",\n    \"due\": \"/due\",\n    \"tags\": \"/tags\"\n  },\n  \"swarm\": { \"eligible_complexities\": [\"small\", \"medium\"] }\n}\n```\n`repository.logo`, `fields`, and `swarm` are optional. Field values resolve\nfrom parsed frontmatter with RFC 6901 JSON Pointers. A swarm requires mapped\n`area` and `complexity` fields. The report fetches nothing at view time.\n\n`tags` is the one multi-value mapped field. It accepts a nonempty string or an\narray holding only nonempty strings: a scalar reads as a one-tag set, exact\nduplicates collapse, and values sort deterministically. The mapping never\nsplits commas, lowercases values, coerces objects, or partially accepts a\nmixed-type array. An empty array counts as missing; any other rejected value\nis omitted from the item and counted as invalid metadata. `area` stays scalar.\nThe model carries `fieldCoverage`, one entry per configured field plus `area`\nand `tags` when unmapped, ordered by field name with `present`, `missing`, and\n`invalid` counts over the retained report population. An unmapped field counts\nevery retained item as missing, and a visible missing-mapping notice tells an\nunconfigured mapping apart from missing item values. Missing metadata never\nmatches a filter value: there is no `Unclassified` bucket, so a filter for a\nliteral `Unclassified` tag matches only items really carrying that tag.\n\nThe report is a **decision-focused workspace**, not a state snapshot. It has\nthree sections behind accessible view navigation: **Items** (the default),\n**Flow**, and **Dependencies**. Only the selected section is visible when\nscripting runs; without scripting, every section stays readable through its\nanchor and native `details` elements, and the artifact states its fixed scope.\n\nItems opens with the state counts, then a sticky control strip: search, five\nquick views (**Work next**, **In progress**, **Blocked**, **Needs triage**, and\n**All open**), and the display controls (grouping, sorting, Basic/Standard/\nDetailed, Show history, Expand all, Collapse all). Below 1100px the display\ncontrols fold behind a **Display** toggle so search and quick views stay in\nreach. Search and the facet groups form the **scope**; the scope narrows the\nsummaries, Flow, and Dependencies alike. Quick views and Show history change\nonly the list. Work next keeps its recommended order and prints the reasons\nbeside each row; any other sort presents itself as that sort.\n\nThere is one list and one canonical detail per retained item. Desktop widths\nuse a list/detail split; narrower widths show the selected detail inline.\nOpening a detail never clears the search, the facets, or the list position, and\na detail opened from Flow or Dependencies returns to Items with the scope\nintact. Expand all acts on visible rows only.\n\nThe **filters** are facet groups: Readiness, Status, Kind, Priority, and one\ngroup for every configured mapped field, each a fieldset of checkbox chips\nbehind a collapsed **Filters** control. Values inside a group are alternatives\nand groups narrow each other; the search box is one more condition on the same\nanswer. Every chip carries the count it would leave, measured against the\nsearch and the other groups but never against its own. Missing metadata is its\nown **Missing** chip, distinct from a literal `Unclassified` value. The result\ncount states how much of the retained set is showing, and **Clear filters**\ngives every selection back.\n\nAbove the list sit scoped summaries that open exact contributing items through\na labelled drilldown pill: attention actions (in progress, blocked, needs\ntriage, oldest, and started work past this ledger's own 85th-percentile cycle\ntime), an **area/status matrix** with count and blocked count per cell, and\n**Scoped members of existing batches**, which intersects the area-diverse\nbatches with the scoped ready set and omits empty batches. Each item detail\nstates its **downstream reach** (transitive dependents in the report) and,\nseparately, the items that become **ready if done**; neither alters core\nreadiness or the recommended order.\n\n### Flow\n\nFlow recomputes from the scoped open and terminal population in the browser:\ncumulative flow, weekly arrivals against closures with done counted\nseparately, throughput with a four-week mean, current aging by status,\nacceptance-to-completion samples, and the closure forecast. Inclusive **From**\nand **To** controls default to the twelve-week window; a start after the end,\nor an end after the report date, is refused with a visible error while the last\nvalid charts stay. Weekly buckets, aging cells, completion samples, and\ncumulative date/band selections each drill into the exact contributing items,\nand the accessible tables offer the same actions. The forecast is computed only\nwhen Flow first opens and cached by cohort and range. Missing acceptance history\nis stated as reconstruction uncertainty; an item killed straight from triage is\ncomplete history, not a gap. The fixed server-rendered charts remain for\nreaders without scripting, each with `role=\"img\"` and an aria-label that states\nits finding in words.\n\n### The ledger graph\n\nDependencies draws the scoped items as a force-directed 3D graph. Every item is\na node, labelled `#N`, coloured by readiness for open items and by terminal\nstatus for closed ones, and sized by the same transitive unblocking leverage the\nrecommended order uses. Edges run from a prerequisite or a parent to the item\nit releases: a `depends_on` edge is straight and arrowed, a `parent` edge is\ncurved and unarrowed. Hovering a node opens a card with its number, title,\nstatus, age, leverage, and reasons; clicking it, or a roster row, opens the\ncanonical detail in Items. Downstream and ready-if-done actions on the roster\ndrill into the same sets the detail names.\n\nThe graph has no filter of its own: it follows the shared scope, so a scope\nchange drops nodes, every link that touched one of them, and their labels\ntogether, then reheats the layout in place. A hidden blocker never turns a\nretained item ready, because readiness is projected over the complete ledger\nbefore any view narrows it. The graph starts only when Dependencies first\nopens, pauses while another section is shown, and an empty scope draws an\nempty graph that says so.\n\nThe renderer is [`3d-force-graph`](https://github.com/vasturiano/3d-force-graph)\nover Three.js, vendored into `vendor/3d-force-graph/` at a pinned version\n`1.80.0` with its upstream SHA-256 recorded in\n[`vendor/3d-force-graph/VERSIONS.json`](vendor/3d-force-graph/VERSIONS.json) and\npinned by a test. It is inlined into the report at generation time. Nothing is\nfetched from a CDN, at generation time or at view time, and the report's content\nsecurity policy forbids every remote load, `connect-src` included. The bundle\ncosts roughly 1.3 MB of the report's size; the report stays one self-contained\nfile you can attach, open offline, and share.\n\nWithout WebGL the graph section says so and expands its own roster instead: one\nrow per node, carrying that node's number, title, status, age, leverage, and\nreasons. No decision-relevant content exists only in the 3D view.\n\nThe recommended order is a report-layer derivation. It is recomputed from\nledger bytes at render time, never persisted, never a mutation, and it does not\nchange `ready`: the core still selects and sorts by priority, created date,\nthen ID. Ordering runs as separate, visible steps rather than one opaque score\n— expedite class, then due proximity, then transitive unblocking leverage over\n`depends_on`, then epic enablement from `parent`, then priority, then age, then\nthe mapped `complexity` as a WSJF-style size denominator — and every step that\nplaced an entry is printed beside it.\n\nTwo mapped fields carry the value dimensions the schema deliberately does not:\n\n- **`class`** — a class of service, one of `expedite`, `fixed-date`,\n  `standard`, or `intangible`. `expedite` lifts an item above every other ready\n  item. An absent value means `standard`. An unrecognised value is ranked as\n  standard and reported by number in the report, never silently dropped.\n- **`due`** — an ISO calendar date. The nearest due date sorts first and an\n  overdue one sorts first of all; an item with no due date sorts behind every\n  dated one at that step.\n\nBoth ride the ordinary extension-member channel, so the core neither reads nor\nvalidates them. `complexity` weighs `xs`/`s`/`small` as 1, `m`/`medium` as 2,\n`l`/`large` as 3, and `xl`/`extra-large` as 5; any other value carries no\nweight and is shown as written.\n\n### Named custom report views\n\nA named custom view is a second self-contained report generated from the same\ncomplete ledger. Every section of it — statistics, **Work next** and the other\nquick views, the **Attention** summaries and area/status matrix, dependency\nimpact, Flow, the graph, the drill-down pill, terminal history, and the\nswarm batches — describes one configured subset, so the file is honest to\nshare as a scoped report. Excluded items are absent from the bytes rather than\nhidden by a stylesheet. The base report stays available and unchanged.\n\nReport configuration `report_version: 2` accepts every version 1 member and adds\none more, `views`. A version 1 configuration keeps generating its base report\nunchanged, and a version 2 configuration with no view selected publishes the\nsame base report from its inherited base members:\n\n```json\n{\n  \"report_version\": 2,\n  \"repository\": { \"name\": \"Example repository\" },\n  \"title\": \"Ledger report\",\n  \"output\": \"../../ledger-report.html\",\n  \"fields\": {\n    \"area\": \"/priority_area\",\n    \"complexity\": \"/complexity\",\n    \"class\": \"/class\",\n    \"security\": \"/security\"\n  },\n  \"views\": {\n    \"security-blockers\": {\n      \"title\": \"Security blockers\",\n      \"output\": \"../../reports/security-blockers.html\",\n      \"filters\": {\n        \"readiness\": [\"blocked\"],\n        \"status\": [\"backlog\", \"in-progress\"],\n        \"kind\": [\"task\"],\n        \"fields\": {\n          \"class\": [\"bug\"],\n          \"security\": [\"high\", \"critical\"]\n        }\n      }\n    }\n  }\n}\n```\n\nGenerate one view by name:\n\n```sh\nwowbagger report --ledger <dir> --view <name> --as-of YYYY-MM-DD --json\n```\n\nOne invocation generates one artifact; no flag generates them all. `--out <file>`\noverrides the selected output for that invocation, view or base alike, and the\nconfigured paths are still validated when it is present.\n\nA view name is a portable identifier matching `^[a-z][a-z0-9-]{0,63}$`. Names are\ncase-sensitive and `views` holds at most 64 views. Each view takes exactly\n`title`, `output`, and `filters`. Unknown members fail closed.\n\n`filters` takes exactly `readiness`, `status`, `kind`, and `fields`, and at least\none of `readiness`, `status`, `kind`, or `fields` must be present. The semantics\nare the drill-down's: **OR within one filter group; AND across groups**, so\n`readiness: [\"blocked\"]` with `class: [\"bug\"]` means blocked bugs. `readiness`\ntakes `ready`, `blocked`, or `ineligible`; `status` takes `triage`, `backlog`,\n`in-progress`, `done`, `killed`, `archived`, or `deferred`; `kind` takes `task`\nor `epic`.\n\nA `fields` key must also be a configured report field. Each field filter is a\nnon-empty array of unique JSON strings, finite numbers, or booleans, and matching\npreserves JSON scalar type and value: stringification is not equality, so a\nmapped `2` does not answer a filter for `\"2\"`. An item carrying no mapped value\nfor a field matches no value selected for that field. A `tags` filter uses\nany-member matching, so one item carrying two tags answers either tag. No\ntitle-text inference, regular expression, arbitrary JSON pointer, or body\nsearch belongs in a view filter.\n\nWowbagger validates the complete ledger and computes readiness against the\ncomplete ledger before it filters, so excluding a blocker never makes blocked\nwork read as ready. What a view derives from its retained set does change:\nstatistics, ranking leverage, epic enablement, evidence, attention, graph\nmembership, and the swarm batches are all view-scoped, so the same item can\nreport smaller numbers here than in the base report. That is why the artifact\nnames its view and its fixed criteria at the top. A retained item that names an\nexcluded dependency, parent, blocker, or related item still prints that item's\nnumber instead of a raw ULID, and the excluded item gets no row, no graph node,\nno history entry, and no hidden payload.\n\nInside the file, the interactive facets and the graph status chips narrow the\nretained subset further and can never reveal an excluded item. **Clear filters**\nrestores the complete custom-view subset, never the base ledger.\n\nThe base output and every view output must be pairwise distinct after path\nresolution, and each must resolve outside the ledger under the same no-follow\ncontainment rule the base output already obeys. A colliding or contained output\nis `report-config-invalid` before anything is rendered, `--out` present or not.\n\nA named success adds exactly one member to the existing report result,\n`result.view`, and its `item_count` and `ready_count` describe the filtered\nsubset. A base report's result gains no `view` member:\n\n```json\n{\n  \"ok\": true,\n  \"command\": \"report\",\n  \"contract_version\": 5,\n  \"result\": {\n    \"report_version\": 2,\n    \"as_of\": \"2026-08-21\",\n    \"output\": \"/absolute/reports/security-blockers.html\",\n    \"item_count\": 12,\n    \"ready_count\": 0,\n    \"view\": \"security-blockers\"\n  }\n}\n```\n\n`--view` requires `report_version: 2`. A missing or unknown name is\n`report-view-not-found` at exit 2 and leaves every existing output untouched. An\ninvalid filter value, an unmapped `fields` key, and a colliding output are\n`report-config-invalid` at exit 2. An empty matched subset is not a failure: it\npublishes a valid report with zero items and explicit empty-state copy. Failed\npublication preserves the prior artifact, so never read an existing output as\nfresh. `wowbagger capabilities --json` advertises the whole surface at\n`result.operations.report`, so no consumer has to probe by generating a file.\n\nA custom view is scoped output and **not a security boundary**: it applies no\nredaction and no access control, and the artifact states plainly that it is a\nfiltered subset of the named repository ledger. Automation reads the JSON result,\nnever the generated HTML and never human output.\n\nThis repository keeps its report configuration in\n`ledger/.wowbagger/report.json`. Generate the ignored local report with the\ncurrent UTC date:\n\n```sh\nnpm run report -- --as-of YYYY-MM-DD\n```\n\nIf you verify the report in a browser from a checkout, generate a deterministic\nsynthetic report through the real pipeline:\n\n```sh\nnode scripts/report-design-demo.js --out /private/tmp/wowbagger-report-demo.html --items 40\n```\n\nThat output is synthetic and checkout-only: it describes fixed demo data,\nnever this repository's ledger.\n\n## Where the contracts live\n\nThe README is the map. These are the territory, and they are normative where\nthey disagree with anything above:\n\n| Document | What it rules |\n|---|---|\n| [SPEC.md](SPEC.md) | The ledger schema, validation rules, and ready selection. |\n| [docs/mutation-contract.md](docs/mutation-contract.md) | Response domains and dispatch, capabilities, inspect, create, transition, patch, the extension declaration, the frontmatter ownership table, errors and recovery, and commit-per-mutation. |\n| [docs/work-claim-contract.md](docs/work-claim-contract.md) | Provisioning, claim CAS rules, claimed publication, reconciliation, revision adoption, and the difference between strict fenced and merge-coordinated backends. |\n| [docs/adapter-contract.md](docs/adapter-contract.md) | The harness adapter boundary: negotiation, forwarding, guards, approval, and honest outcome mapping. |\n| [docs/host-contract.md](docs/host-contract.md) | The direct-core host boundary: package resolution, the shell-free process tuple, bounded transport, owning-host paths, response dispatch, advertised limits, and the packaged JSON Schemas. |\n| [docs/openai-compatible-integration.md](docs/openai-compatible-integration.md) | What an OpenAI-compatible host can do today, and what a compatibility claim would require. |\n| [docs/schema-2-migration.md](docs/schema-2-migration.md) | The quiesced schema version 1 to 2 migration runbook. |\n| [skills/wowbagger/SKILL.md](skills/wowbagger/SKILL.md) | The shipped agent instructions. |\n\nWhere contract prose and a fixture disagree, **the fixture is normative**.\n\n## Working on wowbagger\n\nThis section is the contributor's route from \"I want to help\" to a merged\nchange.\n\n### The ledger is the backlog\n\nThere is no separate issue tracker. The repository's real backlog is\n[`ledger/`](ledger/), and it is driven with the tool itself:\n\n```sh\nnpm ci\n./bin/wowbagger.js validate --ledger ledger --json\n./bin/wowbagger.js ready --ledger ledger --as-of YYYY-MM-DD    # human queue\n./bin/wowbagger.js inspect --ledger ledger --number 30 --json  # the item you picked\n```\n\nReplace `YYYY-MM-DD` with the current UTC date. `ready` prints\n`#number pri=priority title` per line in ready order. **The acceptance criteria\nlive in the item body, not in the metadata** — `inspect` and read\n`result.item.body`.\n\nItems are created into `triage` and reach `backlog` only through an explicit\naccepting transition with a recorded decision. This repository dogfoods\n`layout.json`, so its items live in [`ledger/items/`](ledger/items/).\n\n### Which contributions are useful now\n\n- **Reproducible defects.** A failing command, its exact JSON envelope, the exit\n  status, and the smallest ledger that shows it.\n- **Dogfood friction.** Anything the tool made harder than doing it by hand. That\n  is a defect worth recording, not a personality flaw of the user.\n- **Documentation drift.** A claim in this README, a contract, or the skill that\n  HEAD does not support. Name the claim and the source that refutes it.\n- **Platform evidence.** A native conformance run on Linux or Windows is what\n  moves an adapter platform declaration off `unverified`. Attach the report.\n- **Portability and coordination requirements.** Concrete constraints from a real\n  harness beat speculative API surface.\n\nPrefer an adapter to a core change when a requirement is harness-specific. File\nthe finding as a ledger item rather than leaving it in a transcript.\n\n### The verification gate\n\nFour commands. All four must pass, and the test commands run on **Node 24.20.0**:\n\n```sh\nTMPDIR=/tmp /opt/homebrew/opt/node@24/bin/node --test test/*.test.js\nTMPDIR=/tmp /opt/homebrew/opt/node@24/bin/node --pending-deprecation --throw-deprecation --test test/*.test.js\nTMPDIR=/tmp /opt/homebrew/opt/node@24/bin/node spec/run-adapter-implementation.js\nTMPDIR=/tmp /opt/homebrew/opt/node@24/bin/node bin/wowbagger.js validate --ledger ledger --json\n```\n\n`TMPDIR=/tmp` is not optional: the default macOS temporary path makes the claim\nlock socket path too long. Use an explicit Node 24.20.0 binary path.\n\nThe supported runtime matrix is Node 24.20.0. Node 26 remains excluded until\nthe separate Vitest incompatibility reported by Lee is resolved.\n\n`npm test`, `npm audit --omit=dev`, and `git diff --check` are useful alongside\nit; they are not a substitute for the four commands above.\n\n### The rules that are not negotiable\n\n- **The oracles are independent.** [`spec/adapter-reference.js`](spec/adapter-reference.js)\n  and [`test/work-claim-reference.js`](test/work-claim-reference.js) are separate\n  re-implementations that conformance tests compare against. `src/adapter/`\n  deliberately re-implements the first rather than importing it, and\n  `src/claim-request.js` has the same arrangement with the second. Never import\n  an oracle into `src/`, and never change an oracle to match an implementation.\n  Collapsing either pair into a shared implementation would make its conformance\n  tests p","readmeFilename":"README.md"}