# Tasks — relicense AGPL-3.0 → MIT Four units. A/B/C are disjoint files (parallelizable); D is the join (runs after A/B/C). The shared `node-html-markdown` dependency swap + `pnpm install` is done before A so the parallel agents don't race on `apps/server/package.json`. ## Pre: dependency swap (done by coordinator) - [ ] Add `node-html-markdown` to `apps/server/package.json` dependencies; remove `parse5` (only html-to-md consumed it). - [ ] `pnpm install`. ## A — html-to-md → node-html-markdown - [ ] Replace `apps/server/src/services/web/html-to-md.ts` with a thin MIT wrapper exporting `htmlToMarkdown(sourceHtml: string): string` over `NodeHtmlMarkdown.translate`. - [ ] Drop the AGPL/Unsloth SPDX header. - [ ] Update `html-to-md.test.ts` to the new library's output (structure-level `.toContain` where whitespace differs; output feeds an LLM so exact format is not load-bearing). - [ ] Keep `web/index.ts` re-export and `web_fetch.ts` untouched. ## B — llama-args-validator → clean-room - [ ] Rewrite `apps/server/src/services/inference/llama-args-validator.ts`: re-derive the managed-flag denylist from the public llama-server README; keep the BooCode shadowing-flag logic. Same exports (`validateExtraArgs`, `isManagedFlag`, `stripShadowingFlags`, `StripOptions`). - [ ] Drop the AGPL/Unsloth SPDX header. - [ ] Keep `llama-args-validator.test.ts` green (it pins the contract). ## C — tool-call-parser → minimal clean (relicense-only) - [ ] Delete dead Unsloth-ported exports: `parseToolCallsFromText`, `scanBalancedBraces`, `OpenAiToolCall`, `hasToolSignal`, and the unused nudge constants (`DUPLICATE_CALL_NUDGE`, `TOOL_ERROR_NUDGE`, `TOOL_ERROR_PREFIXES`, `BUDGET_EXHAUSTED_NUDGE`). - [ ] Keep `extractToolCallBlocks` + streaming helpers + `stripToolMarkup` (re-derive its strip regexes from qwen's wire format). Drop the AGPL/Unsloth SPDX header. - [ ] Remove the now-dead tests from `tool-call-parser.test.ts`; keep streaming/strip tests. - [ ] Verify `stream-phase.ts` (`extractToolCallBlocks`) + `tool-phase.ts` / `error-handler.ts` (`stripToolMarkup`) still compile. ## D — license flip (join) - [ ] `LICENSE`: replace AGPL-3.0 text with MIT, `Copyright (c) 2026 indifferentketchup`. - [ ] Flip `"license"` to `"MIT"` in all 5 `package.json` (root, server, web, coder, booterm). - [ ] Confirm no `SPDX-License-Identifier: AGPL` header survives in the 3 files. - [ ] Roadmap `License-debt` batch: planned → shipped (note the decoupled-from-parser-retirement approach). Add a `## License` section to `README.md` (MIT). - [ ] Optional guard test: assert no `AGPL` SPDX header in `apps/**` and all 5 `package.json` are MIT. ## Verify - [ ] `pnpm -C apps/server test` - [ ] `pnpm -C apps/server build` - [ ] root `npx tsc --noEmit`