@3030-labs/wotw 0.8.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +312 -0
- package/LICENSE +36 -0
- package/LICENSE-NOTICES.md +199 -0
- package/README.md +147 -0
- package/SECURITY.md +181 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +14993 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/daemon/entry.d.ts +2 -0
- package/dist/daemon/entry.js +11544 -0
- package/dist/daemon/entry.js.map +1 -0
- package/dist/index.d.ts +617 -0
- package/dist/index.js +1290 -0
- package/dist/index.js.map +1 -0
- package/dist/wiki/templates/CLAUDE.md +87 -0
- package/dist/wiki/templates/getting-started.md +89 -0
- package/dist/wiki/templates/index.md +32 -0
- package/dist/wiki/templates/log.md +9 -0
- package/package.json +127 -0
- package/src/wiki/templates/CLAUDE.md +87 -0
- package/src/wiki/templates/getting-started.md +89 -0
- package/src/wiki/templates/index.md +32 -0
- package/src/wiki/templates/log.md +9 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable, user-visible changes to `@3030-labs/wotw` are documented in this
|
|
4
|
+
file. Internal closure documents (`PASS-*.md`, `SHIP-V*.md`, `REVIEW-*.md`)
|
|
5
|
+
are referenced for traceability but not enumerated here.
|
|
6
|
+
|
|
7
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/);
|
|
8
|
+
this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
9
|
+
Until 1.0, minor-version bumps may carry breaking changes; patch bumps are
|
|
10
|
+
always non-breaking.
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## [0.8.4] — 2026-05-26 — Public-launch readiness (PASS-023)
|
|
15
|
+
|
|
16
|
+
### Added
|
|
17
|
+
- **README rewrite** for first-time visitors: tagline, 5-line install,
|
|
18
|
+
30-second quickstart with concrete output. Deeper feature copy moved
|
|
19
|
+
to [`docs/`](docs/).
|
|
20
|
+
- **Install evidence on 4 platforms** committed under
|
|
21
|
+
[`docs/install-evidence/`](docs/install-evidence/): macOS arm64,
|
|
22
|
+
macOS amd64, Linux amd64, Windows amd64. Each carries a passing
|
|
23
|
+
terminal log of `npm install → wotw init → ingest → wiki update`.
|
|
24
|
+
- **`docs/self-hosted-byok.md`** — where the Anthropic / OpenAI / Gemini
|
|
25
|
+
key goes, failure modes (missing / invalid / rate-limited), rotation
|
|
26
|
+
procedure for self-hosted users.
|
|
27
|
+
- **`docs/llm-provider-auto-resolution.md`** — why Pass B fact extraction
|
|
28
|
+
defaults off under metered API providers (Anthropic / OpenAI / Gemini)
|
|
29
|
+
and on under cost-free runtimes (Claude Code CLI subscription / Ollama),
|
|
30
|
+
with the config override (`fact_extraction.force_enabled`).
|
|
31
|
+
- **`docs/pack-format-daemon.md`** — daemon-side wire format for the
|
|
32
|
+
Compliance Pack consumed by the customer-side
|
|
33
|
+
[`wotw-verify`](https://github.com/3030-Labs/wotw-verify) binary.
|
|
34
|
+
Marketplace semantics explicitly out of scope.
|
|
35
|
+
- **`docs/telemetry.md`** + opt-in BYO-DSN Sentry breadcrumbs on `wotw init`
|
|
36
|
+
failures. **Disabled by default.** No 3030 Labs DSN embedded; users
|
|
37
|
+
provide their own Sentry project via `WOTW_TELEMETRY_DSN`.
|
|
38
|
+
- **`LICENSE-NOTICES.md`** — AGPL-3.0 in plain English (derivative work,
|
|
39
|
+
network-use clause, wotw-cloud boundary, fork rules). Attorney-disclaimable.
|
|
40
|
+
- **`.github/ISSUE_TEMPLATE/*.yml`** — bug_report, feature_request, question
|
|
41
|
+
as GitHub issue forms. Security disclosures routed to `SECURITY.md`.
|
|
42
|
+
- **Error-message audit on 10 unhappy paths** — every one now emits a
|
|
43
|
+
loud, actionable error with the user's next step, not a stack trace.
|
|
44
|
+
Paths: missing `OBSIDIAN_VAULT_PATH`, malformed config, native-binding
|
|
45
|
+
load failure on `better-sqlite3`, invalid Anthropic key (401),
|
|
46
|
+
rate-limited Anthropic (429), missing wiki-dir permissions, locked
|
|
47
|
+
vault file, port conflict, daemon already running, `wotw init` against
|
|
48
|
+
a non-empty vault.
|
|
49
|
+
|
|
50
|
+
### Changed
|
|
51
|
+
- **`CONTRIBUTING.md`** rewritten to centre AGPL implications, the DCO
|
|
52
|
+
sign-off requirement (Developer Certificate of Origin), and the 7-gate
|
|
53
|
+
shipping discipline.
|
|
54
|
+
- **`SECURITY.md`** updated SLA (5 business days acknowledgment, 30
|
|
55
|
+
calendar days fix-or-disclosure for high-severity), and adds explicit
|
|
56
|
+
safe-harbor language for good-faith researchers.
|
|
57
|
+
- **`package.json`** metadata: homepage points to wotw.dev, keywords
|
|
58
|
+
expanded for npm discovery, `SECURITY.md` + `CHANGELOG.md` +
|
|
59
|
+
`LICENSE-NOTICES.md` now ship in the tarball.
|
|
60
|
+
|
|
61
|
+
### Fixed (operator dogfood batch)
|
|
62
|
+
- **`wotw status` provenance-record count** read 0 against a populated
|
|
63
|
+
chain (double-prefixed the already-absolute chain path). Now correct.
|
|
64
|
+
- **`wotw start --foreground`** ran a subsystem-less stub daemon; now
|
|
65
|
+
spawns the same fully-wired daemon as detached mode, with live logs
|
|
66
|
+
on the terminal.
|
|
67
|
+
- **Claude Code CLI 401** (not logged in) now surfaces a loud, actionable
|
|
68
|
+
"run `claude /login`" error instead of a silent skipped batch.
|
|
69
|
+
- **`wotw approve` / `wotw reject`** now accept a leading `candidates/`
|
|
70
|
+
path prefix (matches the `wotw candidates` + `wotw audit` display).
|
|
71
|
+
- **`wotw init`** no longer prints a misleading "Cancelled." when you
|
|
72
|
+
press Escape on the optional post-scaffold "Open in Obsidian?" prompt.
|
|
73
|
+
- **README + docs** corrected: candidates → approve → wiki flow made
|
|
74
|
+
explicit; from-source install uses `npm install -g .` (not the broken
|
|
75
|
+
`pnpm link --global`); init-walkthrough layout matches the real scaffold.
|
|
76
|
+
|
|
77
|
+
### Verification
|
|
78
|
+
- 7 build gates green at HEAD.
|
|
79
|
+
- **935 tests** across the unit / integration / e2e tiers.
|
|
80
|
+
- Operator dogfood (24 findings, 10 fixed this pass): see
|
|
81
|
+
`PASS-023-DOGFOOD-FINDINGS.md`.
|
|
82
|
+
- See `PASS-023-DAEMON-PUBLIC-READINESS.md` for the full closure trail.
|
|
83
|
+
|
|
84
|
+
> **Not yet on npm.** v0.8.4 is built + committed but publish is deferred
|
|
85
|
+
> to a follow-up pass gated on the DriftVane → 3030-Labs org migration.
|
|
86
|
+
> Install from source per the README until then.
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## [0.8.3] — 2026-05-25 — KEK rotation + DEK auto-archive
|
|
91
|
+
|
|
92
|
+
### Added
|
|
93
|
+
- **KEK rotation** (`wotw keys rotate-kek`): generates a new KEK,
|
|
94
|
+
re-wraps every active and rotating DEK, archives the previous KEK
|
|
95
|
+
metadata. Revoked DEKs are deliberately skipped (compliance: revoked
|
|
96
|
+
material stays revoked).
|
|
97
|
+
- **DEK auto-archive cron**: configurable schedule under
|
|
98
|
+
`keys.auto_archive` rolls DEKs from `rotating` → `archived` after a
|
|
99
|
+
retention window expires.
|
|
100
|
+
- **`docs/policies/dek-rotation.md`** — operator runbook for both
|
|
101
|
+
manual and scheduled rotation.
|
|
102
|
+
|
|
103
|
+
### Verification
|
|
104
|
+
- See `PASS-019-G5-COMPLETION.md`. CT1.01 (operationally complete) +
|
|
105
|
+
G5 substrate signoff.
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## [0.8.2] — 2026-05-24 — G5 end-to-end attestation substrate
|
|
110
|
+
|
|
111
|
+
### Added
|
|
112
|
+
- **Workspace-key substrate** (`workspace_keys.db`) under
|
|
113
|
+
`~/.wotw/<tenant>/keys.db`. Active + rotating + archived DEK lifecycle
|
|
114
|
+
states. Hex-encoded encrypted-DEK / nonce / auth-tag columns mirror
|
|
115
|
+
the daemon-cloud wire format.
|
|
116
|
+
- **HMAC-SHA256 attestation** field on provenance records: every chain
|
|
117
|
+
entry now carries (optionally) an HMAC under the active DEK,
|
|
118
|
+
enabling offline verification of (record content × key custody)
|
|
119
|
+
without disclosing the DEK itself.
|
|
120
|
+
- **`key_id` propagation** in ProvenanceRecord (canonical-payload
|
|
121
|
+
EXCLUDED — see [`docs/provenance.md`](docs/provenance.md)). New
|
|
122
|
+
optional field stored on record for verification routing, not in the
|
|
123
|
+
canonical id hash, preserving backward-compatibility with pre-G5
|
|
124
|
+
daemons.
|
|
125
|
+
|
|
126
|
+
### Security
|
|
127
|
+
- Tenant-managed DEKs never persist as plaintext beyond the
|
|
128
|
+
in-memory KeyStore window.
|
|
129
|
+
- KEK plaintext is never logged.
|
|
130
|
+
|
|
131
|
+
### Verification
|
|
132
|
+
- See `PASS-018-G5-CLOSURE.md`. Closes CT1.01 (partial → done) and
|
|
133
|
+
unblocks every downstream CT1.x – CT5.x checklist item.
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
## [0.8.1] — 2026-05-22 — better-sqlite3 native-binding fix
|
|
138
|
+
|
|
139
|
+
### Fixed
|
|
140
|
+
- **Docker image native-binding mismatch**: `better-sqlite3` was being
|
|
141
|
+
copied from a host build into the runtime image, leading to
|
|
142
|
+
`node-gyp` / glibc symbol mismatches at first DB-open. The Dockerfile
|
|
143
|
+
now runs `pnpm rebuild better-sqlite3` against the runtime base image
|
|
144
|
+
and exercises the resulting binding end-to-end as a build-time gate.
|
|
145
|
+
Closes the "first cloud-side spawn" failure pattern.
|
|
146
|
+
|
|
147
|
+
### Added
|
|
148
|
+
- **`scripts/docker-native-rebuild-verify.sh`** — invoked by the
|
|
149
|
+
Dockerfile build stage; refuses to ship if the binding fails to load.
|
|
150
|
+
|
|
151
|
+
### Verification
|
|
152
|
+
- See `SHIP-V0.8.1.md`.
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
## [0.8.0] — 2026-05-19 — Pass B fact-level retrieval + G5 scaffolding
|
|
157
|
+
|
|
158
|
+
This release bundled two substantive workstreams. Version skipped 0.5 –
|
|
159
|
+
0.7 to converge on a single shippable image; commits internally
|
|
160
|
+
identified Pass A as v0.7.0 and Pass B as v0.8.0.
|
|
161
|
+
|
|
162
|
+
### Added — Context-efficiency Pass B (fact-level retrieval)
|
|
163
|
+
- **`query_facts`** MCP tool: BM25-fused retrieval over atomic
|
|
164
|
+
`(entity, statement)` pairs + synthetic questions extracted at
|
|
165
|
+
ingestion. **80%+ token reduction** vs page-level retrieval on
|
|
166
|
+
atomic-question benchmark fixtures. See
|
|
167
|
+
[`docs/mcp-tools.md`](docs/mcp-tools.md) and
|
|
168
|
+
[`CONTEXT-EFFICIENCY-PASS-B.md`](CONTEXT-EFFICIENCY-PASS-B.md).
|
|
169
|
+
- **`source_layer`** response field on `define` / `relate` /
|
|
170
|
+
`cite_sources` — clients can see whether a hit came from the fact
|
|
171
|
+
layer or the page layer.
|
|
172
|
+
- **`fallback: "page-level"`** signal when the fact layer is disabled —
|
|
173
|
+
Pass-A clients route to `query_progressive` automatically without
|
|
174
|
+
manual config.
|
|
175
|
+
- **`wotw facts reindex`** — populate the fact layer over an existing
|
|
176
|
+
wiki. Budget-gated, idempotent.
|
|
177
|
+
- **`fact_extraction.force_enabled`** config knob — see
|
|
178
|
+
[`docs/llm-provider-auto-resolution.md`](docs/llm-provider-auto-resolution.md)
|
|
179
|
+
for the auto-resolution rationale.
|
|
180
|
+
|
|
181
|
+
### Added — Context-efficiency Pass A (progressive + structural retrieval)
|
|
182
|
+
- **`query_progressive`** MCP tool: smallest-viable-answer-first
|
|
183
|
+
retrieval. Tier-0 (top hit's lede) is ~100-300 tokens with a
|
|
184
|
+
continuation token for expand-on-signal. **86-99% token reduction**
|
|
185
|
+
vs the legacy `query` payload. See
|
|
186
|
+
[`CONTEXT-EFFICIENCY-PASS-A.md`](CONTEXT-EFFICIENCY-PASS-A.md).
|
|
187
|
+
- **`estimate_query_cost`** — pre-flight token estimate so clients
|
|
188
|
+
know what a retrieval will cost before committing.
|
|
189
|
+
- **`define` / `relate` / `cite_sources`** — narrow structural
|
|
190
|
+
retrieval primitives at 256 / 768 / 512 token caps.
|
|
191
|
+
|
|
192
|
+
### Added — G5 scaffolding
|
|
193
|
+
- Provenance-record HMAC field landed as optional (substrate-only,
|
|
194
|
+
not yet exercised end-to-end — that's v0.8.2). Forward/backward-
|
|
195
|
+
compatible canonical-payload-exclusion: old daemons compute identical
|
|
196
|
+
id+chain_hash with the new field present-but-ignored.
|
|
197
|
+
|
|
198
|
+
### Verification
|
|
199
|
+
- See `SHIP-V0.8.0.md`, `CONTEXT-EFFICIENCY-PASS-A.md`,
|
|
200
|
+
`CONTEXT-EFFICIENCY-PASS-B.md`.
|
|
201
|
+
|
|
202
|
+
---
|
|
203
|
+
|
|
204
|
+
## [0.4.0] — 2026-05-15 — Multi-LLM provider closure
|
|
205
|
+
|
|
206
|
+
### Added
|
|
207
|
+
- **Anthropic provider** (the existing built-in, formalized as a
|
|
208
|
+
pluggable provider with config-driven dispatch).
|
|
209
|
+
- **OpenAI provider** (Phase 007): GPT-4o + GPT-4o-mini, ingestion
|
|
210
|
+
+ query parity.
|
|
211
|
+
- **Gemini provider** (Phase 008): gemini-1.5-pro + gemini-1.5-flash,
|
|
212
|
+
ingestion + query parity.
|
|
213
|
+
- **Ollama provider** (Phase 009): local-model dispatch over HTTP,
|
|
214
|
+
free runtime tier.
|
|
215
|
+
- **Per-tenant provider config** (Phase 010): each tenant selects a
|
|
216
|
+
primary provider + optional fallback chain. `wotw.config.yaml`
|
|
217
|
+
carries `llm.providers[]` with role-typed entries.
|
|
218
|
+
|
|
219
|
+
### Changed
|
|
220
|
+
- **`queue.ts`** main ingestion path refactored to single-pass dispatch
|
|
221
|
+
(Phase 006) — highest-risk regression surface; full Phase A regression
|
|
222
|
+
suite green.
|
|
223
|
+
- **`heal-handlers`** likewise refactored to single-pass JSON-edit
|
|
224
|
+
pipeline (Phase 005).
|
|
225
|
+
|
|
226
|
+
### Verification
|
|
227
|
+
- See `MULTI-LLM-PHASE-A.md`, `FEATURE-PASS-005.md` through
|
|
228
|
+
`FEATURE-PASS-010.md`.
|
|
229
|
+
|
|
230
|
+
---
|
|
231
|
+
|
|
232
|
+
## [0.2.x] — 2026-04-12 to 2026-05-09 — Patch releases
|
|
233
|
+
|
|
234
|
+
Hosted-mode fixes, MCP entrypoint correction (`entry.js` vs
|
|
235
|
+
`wotw start --foreground`), Fly-registry caching workaround,
|
|
236
|
+
`pathToClaudeCodeExecutable` resolution. Tags: `v0.2.3` through
|
|
237
|
+
`v0.2.8`.
|
|
238
|
+
|
|
239
|
+
---
|
|
240
|
+
|
|
241
|
+
## [0.2.0] — 2026-04-12
|
|
242
|
+
|
|
243
|
+
### Features
|
|
244
|
+
- **Interactive init wizard** (`wotw init`): 7-step @clack/prompts
|
|
245
|
+
wizard with Obsidian vault auto-detection, overlay support, and
|
|
246
|
+
optional vault launch.
|
|
247
|
+
- **Knowledge health system**: 5-factor quality scoring (staleness,
|
|
248
|
+
source availability, link health, duplicate risk, contradiction risk)
|
|
249
|
+
with configurable weights and thresholds.
|
|
250
|
+
- **Auto-healing** (`wotw lint --fix`): 5 heal handlers (stale pages,
|
|
251
|
+
duplicates, broken links, missing backlinks, contradictions) with
|
|
252
|
+
budget pre-flight, per-run caps, and provenance records.
|
|
253
|
+
- **Deletion handling**: archive provenance type for removed source
|
|
254
|
+
files; orphaned wiki pages get `status: orphaned` frontmatter
|
|
255
|
+
instead of deletion.
|
|
256
|
+
- **Lint scheduler**: optional background lint runs via
|
|
257
|
+
`lint.schedule_enabled` config with configurable interval.
|
|
258
|
+
- **Dead-letter queue**: JSONL ledger for failed batches, surfaced
|
|
259
|
+
in `wotw status` and `get_stats` MCP tool.
|
|
260
|
+
- **`wotw logs` command**: tail daemon log with `-f`/`--follow` and
|
|
261
|
+
rotation detection.
|
|
262
|
+
- **Retrieval hardening**: LLM-powered query expansion, richer YAML
|
|
263
|
+
metadata extraction, query-performance metrics logging, and
|
|
264
|
+
consolidated search results.
|
|
265
|
+
- **Candidates workflow**: human review queue with `wotw approve`,
|
|
266
|
+
`wotw reject`, `wotw candidates`. Superseded-candidate detection
|
|
267
|
+
on re-ingestion.
|
|
268
|
+
|
|
269
|
+
### Security
|
|
270
|
+
- Timing-safe token comparison via `crypto.timingSafeEqual` for
|
|
271
|
+
legacy single-token auth.
|
|
272
|
+
- Canonical path validation (`resolveWikiPath`) rejects directory
|
|
273
|
+
traversal.
|
|
274
|
+
- No-auth safety rail refuses MCP server start on non-loopback host
|
|
275
|
+
without auth configured.
|
|
276
|
+
- Eager provenance hashing eliminates lazy end-of-batch race window.
|
|
277
|
+
- Credential redaction (9 patterns) applied to all wiki content
|
|
278
|
+
before storage.
|
|
279
|
+
|
|
280
|
+
### Quality
|
|
281
|
+
- 446 tests across 51 files (up from 192 across 16 in 0.1.0).
|
|
282
|
+
- Two independent adversarial audits all resolved.
|
|
283
|
+
|
|
284
|
+
---
|
|
285
|
+
|
|
286
|
+
## [0.1.0] — 2026-03-15 — Initial release
|
|
287
|
+
|
|
288
|
+
### Added
|
|
289
|
+
- **Daemon lifecycle:** `wotw init`, `wotw start`, `wotw stop`,
|
|
290
|
+
`wotw status` with detached-child process model, PID/lock file
|
|
291
|
+
management, graceful shutdown.
|
|
292
|
+
- **Watcher:** chokidar-backed file watcher with exponential backoff
|
|
293
|
+
debouncing.
|
|
294
|
+
- **Ingestion pipeline:** Claude agent runner, wiki-writer
|
|
295
|
+
reconciliation, bidirectional link repair, index rebuild, search
|
|
296
|
+
re-index, git commit per batch.
|
|
297
|
+
- **Wiki store:** categorized markdown pages with YAML frontmatter,
|
|
298
|
+
atomic writes, slug sanitization, path-safe IO.
|
|
299
|
+
- **Search:** minisearch BM25 with title/tag boost.
|
|
300
|
+
- **MCP server:** stateless streamable-HTTP exposing `search`,
|
|
301
|
+
`list_pages`, `read_page`, `query`, `get_index`, `get_stats`,
|
|
302
|
+
`related_pages`, `get_provenance_log`, `verify_provenance`,
|
|
303
|
+
`synthesize`. Rate limiting + bearer-token auth.
|
|
304
|
+
- **Cost tracking:** per-operation and daily dollar budgets, hard
|
|
305
|
+
caps enforced before every LLM call.
|
|
306
|
+
- **Provenance chain:** append-only SHA-256 chain of every
|
|
307
|
+
state-mutating operation. `wotw audit` walks the chain and reports
|
|
308
|
+
tampering.
|
|
309
|
+
- **Multi-user authentication:** optional per-user bearer tokens
|
|
310
|
+
managed by `wotw user add | list | revoke`.
|
|
311
|
+
- **Tests:** 192 across 16 files. **Docs:** README, architecture,
|
|
312
|
+
configuration, CLI, MCP, provenance, multi-user.
|
package/LICENSE
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
GNU AFFERO GENERAL PUBLIC LICENSE
|
|
2
|
+
Version 3, 19 November 2007
|
|
3
|
+
|
|
4
|
+
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
|
5
|
+
Everyone is permitted to copy and distribute verbatim copies
|
|
6
|
+
of this license document, but changing it is not allowed.
|
|
7
|
+
|
|
8
|
+
Preamble
|
|
9
|
+
|
|
10
|
+
The GNU Affero General Public License is a free, copyleft license for
|
|
11
|
+
software and other kinds of works, specifically designed to ensure
|
|
12
|
+
cooperation with the community in the case of network server software.
|
|
13
|
+
|
|
14
|
+
The licenses for most software and other practical works are designed
|
|
15
|
+
to take away your freedom to share and change the works. By contrast,
|
|
16
|
+
our General Public Licenses are intended to guarantee your freedom to
|
|
17
|
+
share and change all versions of a program--to make sure it remains free
|
|
18
|
+
software for all its users.
|
|
19
|
+
|
|
20
|
+
For the full license text, see:
|
|
21
|
+
https://www.gnu.org/licenses/agpl-3.0.txt
|
|
22
|
+
|
|
23
|
+
Copyright (C) 2026 3030 Labs LLC
|
|
24
|
+
|
|
25
|
+
This program is free software: you can redistribute it and/or modify
|
|
26
|
+
it under the terms of the GNU Affero General Public License as
|
|
27
|
+
published by the Free Software Foundation, either version 3 of the
|
|
28
|
+
License, or (at your option) any later version.
|
|
29
|
+
|
|
30
|
+
This program is distributed in the hope that it will be useful,
|
|
31
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
32
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
33
|
+
GNU Affero General Public License for more details.
|
|
34
|
+
|
|
35
|
+
You should have received a copy of the GNU Affero General Public License
|
|
36
|
+
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
# LICENSE-NOTICES
|
|
2
|
+
|
|
3
|
+
> **This document is a plain-English summary of the licence on `wotw`.
|
|
4
|
+
> It is NOT legal advice. The binding text is in [`LICENSE`](LICENSE).
|
|
5
|
+
> When the two disagree, `LICENSE` wins. If you need a confident answer
|
|
6
|
+
> for your situation, talk to an attorney who handles open-source licensing.**
|
|
7
|
+
|
|
8
|
+
## TL;DR
|
|
9
|
+
|
|
10
|
+
`watcher-on-the-wall` is licensed under **AGPL-3.0-or-later**.
|
|
11
|
+
|
|
12
|
+
| If you're... | You can... | You must... |
|
|
13
|
+
|---|---|---|
|
|
14
|
+
| Running `wotw` on your own laptop for your own notes | Anything. Modify, embed, fork. | Nothing extra. The AGPL doesn't trigger. |
|
|
15
|
+
| Running `wotw` inside your team / company as an internal tool | Anything. | Nothing extra. Internal use is not "distribution" or "remote interaction." |
|
|
16
|
+
| Modifying `wotw` and shipping the binary to other people | Distribute the modified source under AGPL-3.0-or-later. | Make the modified source available to your distributees on request. |
|
|
17
|
+
| Modifying `wotw` and offering it as a network service to outsiders | Run a modified version. | **Make the modified source available to every user who interacts with the service** (the AGPL §13 network-use clause). A download link in the UI is the minimum. |
|
|
18
|
+
| Building a closed-source SaaS that wraps `wotw` | Use it as-is, unmodified, in a way that's clearly composable rather than entangled. | Read §13 carefully, OR get a commercial licence from 3030 Labs. |
|
|
19
|
+
| Forking `wotw` for a competing product | Yes — that's what AGPL allows. | Keep it AGPL-3.0-or-later and ship source to your users. You may not relicense to MIT / BSD / proprietary. |
|
|
20
|
+
|
|
21
|
+
## What AGPL-3.0-or-later actually requires
|
|
22
|
+
|
|
23
|
+
The AGPL is the GPL plus one extra rule: **if you offer a modified
|
|
24
|
+
version of the program over a network, the people interacting with it
|
|
25
|
+
over that network are also entitled to receive the source code**.
|
|
26
|
+
|
|
27
|
+
In practice this means:
|
|
28
|
+
|
|
29
|
+
1. **Distribution triggers source-sharing.** If you give someone the
|
|
30
|
+
`wotw` binary (or a modified one), you must offer them the source,
|
|
31
|
+
under AGPL-3.0-or-later, on the same channel or by a clearly
|
|
32
|
+
advertised means (a public Git URL is fine).
|
|
33
|
+
2. **Network use triggers source-sharing too.** If your modified
|
|
34
|
+
`wotw` answers an HTTP / MCP request from anyone outside the
|
|
35
|
+
organisation running it, that "anyone outside" is a user, and you
|
|
36
|
+
owe them source. This is the §13 clause and is the meaningful
|
|
37
|
+
difference between AGPL and GPL.
|
|
38
|
+
3. **"At a distance" linking still triggers.** Loading `wotw` as a
|
|
39
|
+
library, importing it as a module, or calling into it via an
|
|
40
|
+
internal API does not let you escape the AGPL by claiming "we
|
|
41
|
+
only used the public interface." If your program's normal operation
|
|
42
|
+
requires `wotw` to function, the combined work is derivative.
|
|
43
|
+
4. **The licence is one-way ratchet.** Code derived from AGPL `wotw`
|
|
44
|
+
cannot be relicensed under a more permissive licence by anyone
|
|
45
|
+
except the copyright holder (3030 Labs LLC). A fork that strips
|
|
46
|
+
the licence is invalid and unenforceable against your
|
|
47
|
+
downstream users.
|
|
48
|
+
|
|
49
|
+
## What counts as a "derivative work"
|
|
50
|
+
|
|
51
|
+
The boring legal answer: courts decide on a case-by-case basis.
|
|
52
|
+
The practical answer:
|
|
53
|
+
|
|
54
|
+
- **Definitely derivative**: you patched `src/`, you replaced a module,
|
|
55
|
+
you rebuilt the daemon with different defaults, you forked the repo
|
|
56
|
+
and renamed it.
|
|
57
|
+
- **Definitely derivative**: you wrote a wrapper that statically
|
|
58
|
+
imports `@3030-labs/wotw` as an npm dependency and ships the result.
|
|
59
|
+
- **Likely derivative**: your service spawns the `wotw` binary as a
|
|
60
|
+
subprocess and depends on its specific output format, and you
|
|
61
|
+
modified that format.
|
|
62
|
+
- **Probably not derivative**: your service calls the unmodified
|
|
63
|
+
`wotw` MCP HTTP endpoint as one of many independent backend
|
|
64
|
+
services, the way you'd call any third-party API. Two arms-length
|
|
65
|
+
processes communicating over standard protocols are usually
|
|
66
|
+
separate works, but consult counsel if it matters.
|
|
67
|
+
|
|
68
|
+
When in doubt: the safer reading is that it IS derivative, and the
|
|
69
|
+
honourable thing is to ship source. If you don't want to ship source,
|
|
70
|
+
ask for a commercial licence.
|
|
71
|
+
|
|
72
|
+
## What counts as a "service"
|
|
73
|
+
|
|
74
|
+
AGPL §13's network-use clause kicks in when "you modify the Program,
|
|
75
|
+
your modified version must prominently offer all users interacting
|
|
76
|
+
with it remotely through a computer network ... an opportunity to
|
|
77
|
+
receive the Corresponding Source."
|
|
78
|
+
|
|
79
|
+
- **Internal corporate tools** running `wotw` for company employees
|
|
80
|
+
only: typically not a §13 trigger. The users are not "remote" in
|
|
81
|
+
the licence's sense; they're the same organisation that's running
|
|
82
|
+
the daemon.
|
|
83
|
+
- **Customer-facing SaaS** running `wotw` for paying customers: §13
|
|
84
|
+
triggers if you've modified `wotw`. Publish a source link on the
|
|
85
|
+
service's UI or in its docs.
|
|
86
|
+
- **Public-facing free tool** (no auth, anyone-on-the-internet) running
|
|
87
|
+
`wotw`: §13 triggers if you've modified `wotw`. Same source link
|
|
88
|
+
obligation.
|
|
89
|
+
- **An MCP endpoint serving your wiki to your own personal Claude
|
|
90
|
+
Code session**: not a §13 trigger. You're the only user, and you
|
|
91
|
+
have the source already.
|
|
92
|
+
|
|
93
|
+
## Relationship to `wotw-cloud`
|
|
94
|
+
|
|
95
|
+
3030 Labs also operates `wotw-cloud`, the control-plane service for
|
|
96
|
+
managed `wotw` deployments. **`wotw-cloud` is NOT a derivative work
|
|
97
|
+
of `wotw`** under our reading:
|
|
98
|
+
|
|
99
|
+
- The daemon and the cloud are separate codebases at separate
|
|
100
|
+
repositories with separate licences.
|
|
101
|
+
- The cloud calls the daemon over standard MCP / HTTP boundaries it
|
|
102
|
+
did not modify.
|
|
103
|
+
- The cloud does not statically link, embed, or contain `wotw` source.
|
|
104
|
+
- The two products are released independently and can be operated
|
|
105
|
+
independently.
|
|
106
|
+
|
|
107
|
+
We share types and the chain-hash algorithm via **CI-enforced
|
|
108
|
+
byte-identity vendoring** between repos so that the daemon's
|
|
109
|
+
provenance chain is byte-identical with what the cloud emits. This is
|
|
110
|
+
not a derivative-work relationship; it's a deliberate interface
|
|
111
|
+
contract.
|
|
112
|
+
|
|
113
|
+
If you fork `wotw` and want to build your own control plane, you
|
|
114
|
+
have AGPL-3.0-or-later authority to do that — you're not constrained
|
|
115
|
+
by 3030 Labs' commercial offering. The licence is symmetric.
|
|
116
|
+
|
|
117
|
+
## What competitors can and can't do
|
|
118
|
+
|
|
119
|
+
**You can:**
|
|
120
|
+
- Fork the repo, rebrand it, and run it for your own customers.
|
|
121
|
+
- Sell support / consulting / hosting on top of unmodified `wotw`.
|
|
122
|
+
- Build a commercial product that interoperates with `wotw` over
|
|
123
|
+
documented public interfaces (MCP, file-system contract,
|
|
124
|
+
provenance-chain format).
|
|
125
|
+
- Use the BM25 retrieval design, the Pass A / Pass B context-efficiency
|
|
126
|
+
architecture, or the G5 attestation scheme as inspiration — those
|
|
127
|
+
are technical ideas, not copyrightable expression.
|
|
128
|
+
|
|
129
|
+
**You can't:**
|
|
130
|
+
- Take the AGPL `wotw` source, ship it (modified or not) inside a
|
|
131
|
+
closed-source product without satisfying AGPL §13 / §5.
|
|
132
|
+
- Relicense `wotw` source to MIT / BSD / proprietary terms.
|
|
133
|
+
- Strip the AGPL notices from files you redistribute.
|
|
134
|
+
- Use the `wotw` or `watcher-on-the-wall` name, the wotw.dev
|
|
135
|
+
domain, or the `@3030-labs/wotw` npm scope to imply 3030 Labs
|
|
136
|
+
endorsement of your fork (trademark, not copyright — but the same
|
|
137
|
+
obligation applies).
|
|
138
|
+
|
|
139
|
+
## Commercial licence
|
|
140
|
+
|
|
141
|
+
If AGPL's network-use clause is incompatible with your business
|
|
142
|
+
model, 3030 Labs offers commercial licences that remove the §13
|
|
143
|
+
obligation in exchange for an annual fee. Contact
|
|
144
|
+
`licensing@3030labs.io`. Common reasons customers ask:
|
|
145
|
+
|
|
146
|
+
- Embedding `wotw` inside a closed-source SaaS without publishing
|
|
147
|
+
the modifications upstream.
|
|
148
|
+
- Operating a fork as a managed service without exposing the fork's
|
|
149
|
+
internal patches.
|
|
150
|
+
- Including `wotw` in a customer-deliverable binary that the customer
|
|
151
|
+
cannot legally redistribute to compete.
|
|
152
|
+
|
|
153
|
+
We do not offer "AGPL with a one-time fee" — the licence is the
|
|
154
|
+
licence. The commercial option is a separate, parallel licence that
|
|
155
|
+
co-exists with AGPL for users who choose it.
|
|
156
|
+
|
|
157
|
+
## Third-party dependencies
|
|
158
|
+
|
|
159
|
+
`wotw` depends on a number of MIT / Apache 2.0 / BSD-licenced npm
|
|
160
|
+
packages (see `package.json` for the full list). Those licences travel
|
|
161
|
+
with the binary in `node_modules/`; redistributing the `wotw` binary
|
|
162
|
+
satisfies them. None of those upstream licences are GPL-incompatible
|
|
163
|
+
with AGPL-3.0-or-later, but if you find one that is, please report it
|
|
164
|
+
to `legal@3030labs.io`.
|
|
165
|
+
|
|
166
|
+
The exception is `better-sqlite3`, which is MIT and bundles SQLite
|
|
167
|
+
itself (public domain). No additional restriction.
|
|
168
|
+
|
|
169
|
+
## Patents
|
|
170
|
+
|
|
171
|
+
3030 Labs LLC has not asserted patents over the `wotw` code. The AGPL
|
|
172
|
+
includes an express patent grant from contributors to users (§11). If
|
|
173
|
+
you contribute code, you grant the same patent licence on contributed
|
|
174
|
+
material to all downstream `wotw` users. This is normal for AGPL
|
|
175
|
+
contributions and is enforced by the DCO sign-off in
|
|
176
|
+
[`CONTRIBUTING.md`](CONTRIBUTING.md).
|
|
177
|
+
|
|
178
|
+
## Trademark
|
|
179
|
+
|
|
180
|
+
"watcher-on-the-wall", "wotw", "wotw-cloud", "wotw-verify",
|
|
181
|
+
"3030 Labs", the wotw.dev domain, and any associated logos are
|
|
182
|
+
trademarks of 3030 Labs LLC. The AGPL covers the code, not the
|
|
183
|
+
trademark. You may identify your fork ("based on watcher-on-the-wall"),
|
|
184
|
+
but you may not call your fork "watcher-on-the-wall" or use the
|
|
185
|
+
name in a way that implies 3030 Labs endorsement.
|
|
186
|
+
|
|
187
|
+
## Where to ask
|
|
188
|
+
|
|
189
|
+
- General licensing questions: `licensing@3030labs.io`
|
|
190
|
+
- Commercial-licence inquiries: `licensing@3030labs.io`
|
|
191
|
+
- Trademark inquiries: `legal@3030labs.io`
|
|
192
|
+
- Security disclosures: `security@3030labs.io` (see [`SECURITY.md`](SECURITY.md))
|
|
193
|
+
|
|
194
|
+
---
|
|
195
|
+
|
|
196
|
+
**Final reminder:** the above is a plain-English summary intended to
|
|
197
|
+
help you understand the AGPL in context. It is not legal advice and
|
|
198
|
+
does not constitute an attorney-client relationship. If your business
|
|
199
|
+
depends on the answer, hire an attorney.
|