Files
boocode/openspec/changes/license-debt-mit/proposal.md
indifferentketchup a8bfde8f8d feat: relicense AGPL-3.0 → MIT (v2.7.0)
Clear the 3 Unsloth-Studio-derived AGPL files and flip LICENSE + 5
package.json from AGPL-3.0-only to MIT.

- html-to-md.ts → MIT node-html-markdown (parse5 dropped)
- llama-args-validator.ts → clean-room (flag denylist = facts)
- tool-call-parser.ts → delete dead Unsloth-ported code; keep
  extractToolCallBlocks/stripToolMarkup byte-identical (no behavior change)
- LICENSE → MIT (Copyright (c) 2026 indifferentketchup); 5 package.json → MIT;
  AGPL SPDX headers removed; README License section; license-mit guard test
- roadmap License-debt batch marked shipped; openspec/changes/license-debt-mit

Decouples the relicense from the native-parsing retirement (the ported parser
was dead code). Server suite 519 passing; build + coder typecheck clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-01 08:16:03 +00:00

2.9 KiB

License-debt — relicense AGPL-3.0 → MIT

Status: in progress (started 2026-06-01) Decision: Sam, 2026-05-31 — relicense BooCode back to MIT. Source: boocode_code_review_v2.md §1 #1, §5k; roadmap ## License-debt batch.

Why

The tree is currently AGPL-3.0 — root LICENSE is GNU Affero GPL v3 and all five package.json declare "license": "AGPL-3.0-only". Cause: the v2.4.0/v2.4.1 Unsloth-Studio lifts pulled in three AGPL-3.0-only files. BooCode is network-served, so AGPL §13 network-copyleft is a live liability. Clearing the three files makes the MIT flip valid; nothing else AGPL remains once they are gone.

Core insight (supersedes the roadmap's staged steps)

The roadmap entangled the relicense with retiring tool-call-parser.ts behind a live qwen3.6 validation window. That is not necessary: the Unsloth-ported algorithm (parseToolCallsFromText / scanBalancedBraces + unused constants) is dead code — no production consumer imports it (verified: only the file and its test reference it). The load-bearing parser (extractToolCallBlocks, under the file's own "BooCode streaming helpers" banner) and stripToolMarkup are BooCode-authored. So the relicense strips provenance, not capability — zero behavior change, no validation gate. The native-llama-server-parsing retirement remains a separate, optional future optimization.

The three AGPL-3.0-only files to clear

  1. apps/server/src/services/web/html-to-md.ts (← _html_to_md.py) — swap to node-html-markdown (MIT). A different third-party library, not a rewrite-from-memory (which would still be a derivative). Consumed by web_fetch via web/index.ts; htmlToMarkdown(html): string signature preserved.
  2. apps/server/src/services/inference/llama-args-validator.ts (← llama_server_args.py) — clean-room re-derive the flag denylist from the public llama-server README (CLI flag names are facts, not copyrightable); the shadowing logic is already BooCode's own.
  3. apps/server/src/services/inference/tool-call-parser.ts (← tool_call_parser.py) — delete the dead Unsloth-ported code; keep BooCode's streaming helpers + stripToolMarkup (re-derive its strip regexes from qwen's wire format); drop the header. No change to the live tool-call path.

Decisions (Sam, 2026-06-01)

  • html-to-md library: node-html-markdown (single MIT dep, GFM tables built-in).
  • tool-call-parser: relicense-only — defer native-parsing retirement.
  • MIT copyright line: Copyright (c) 2026 indifferentketchup.
  • Leave boocode_code_review*.md (point-in-time snapshots) untouched; update the roadmap batch (planned → shipped) and add a README License section.

Out of scope

  • Retiring tool-call-parser patterns 1 & 2 in favour of native llama-server parsing.
  • Bumping the stale README "Latest release" line / AGENTS.md pointer.