Replace LICENSE numeric cap with shipped limits
Epic: "Close the gap and update the jaah-ce (scrubbing it)". Settled inputs: PRD (Task 10834) and Architecture (Task 10835). This child is Architecture child **C2** (gap #1 of the Task 10821 review `jaah-ce-public-risk.html` § "Fix before the flip").
## Original requirement (verbatim, epic body)
> Close the gap and update the jaah-ce (scrubbing it). Come up with a clever way to release a slightly misleading doctrine (e.g. removing most critical parts but still having it functional) that will lead anyone copying it the wrong way.
Settled (PRD A1, D2, D3): "Close the gap" covers gap #1, licence vs cap mismatch. The LICENSE carries no number for the agent cap; it says the software is limited to the limits it ships with.
## Requirement this child owns (verbatim from the PRD)
### R1 — Licence matches the shipped caps (gap #1)
- **AC1.1** `infra/community-edition/LICENSE` § Usage Limits contains no numeric agent-session cap ("ten (10)" is gone). It binds the licensee to the limits the software ships with, for agent sessions at least.
→ verify: `grep -nE "ten \(10\)|\(10\)" infra/community-edition/LICENSE` gives no output; read § Usage Limits and confirm the sentence says the software's shipped limits apply and forbids raising them.
- **AC1.2** The prohibition text (remove, disable, raise or circumvent the limits by any means) is kept unchanged.
→ verify: `git diff develop -- infra/community-edition/LICENSE` shows only the limits sentence changed.
- **AC1.3** No public-facing CE file states an agent cap other than the one `apps/api/app/edition.py` enforces (`CE_MAX_AGENTS`, currently 3).
→ verify: `grep -rnE "\b(10|ten)\b.*(agent|session)" <T>/README.md <T>/LICENSE` gives nothing contradictory. README line 4 still says 3 and agrees with `CE_MAX_AGENTS`.
- States: the cap is the shipped value (3). A future cap change needs no LICENSE edit, which is why the wording carries no number.
(`<T>` is a fresh build of the tree: `python3 tools/community_edition/build_tree.py <T>`.)
## Approach (settled — Architecture §2.4)
- In `infra/community-edition/LICENSE` § Usage Limits change ONLY the limits sentence (today line 22–23: "The software limits itself to one (1) user, three (3) AI provider accounts and ten (10) concurrently running agent sessions on one machine."). The numeric cap becomes "the limits the software enforces as shipped (including the number of concurrently running agent sessions and connected accounts)". Write it as one clean, legally readable sentence (e.g. "The software limits itself to the limits it enforces as shipped, including the number of users, connected AI provider accounts and concurrently running agent sessions on one machine."). The following prohibition sentence ("You may not remove, disable, raise, or circumvent these limits, … intact.") stays byte-unchanged and must still read correctly after the edit ("these limits" must refer back unambiguously).
- Add the AC1.3 test to `tools/tests/test_community_edition.py` (existing file; the sibling doctrine child does not touch it): assert the README's agent-cap number equals `edition.CE_MAX_AGENTS`, and that the LICENSE § Usage Limits paragraph contains no `\(\d+\)` and no number word (one…ten) next to user, account or session.
- Keep line wrapping consistent with the surrounding LICENSE text.
Credentials & reach: `./dc check full`, CE suite, tree build/check (C1, C2) — worktree only — verified (needs nothing beyond the worktree). Merge + Jaah Deploy watch (AC5.1) — jaah-forge (task-authenticated), GitHub `jaah-ai/jaah` — verified: `jaah-forge run list --workflow jaah-deploy.yml` returned runs.
Out of scope: Do NOT change `CE_MAX_ACCOUNTS`, `CE_MAX_AGENTS` or any cap enforcement (`apps/api/app/edition.py`, `apps/jaahd/ce_caps.py`, `apps/jaahd/edition.py`). Do NOT do counsel review, change the trademark or licensor terms in LICENSE beyond the limits sentence, or tick checklist items that are owner actions. Do NOT touch the pricing doc or the website (not in this repo). Do NOT touch the doctrine seam, `packages/editions/features.toml`, `infra/community-edition/doctrine/` or `tools/tests/test_community_edition_doctrine.py` (sibling child). Do NOT dispatch mirrors.yml, promote to master, or flip `jaah-ai/jaah-ce` public.
Done means:
- AC1.1 — `grep -nE "ten \(10\)|\(10\)" infra/community-edition/LICENSE` gives no output; § Usage Limits reads as a coherent sentence binding the licensee to the shipped limits (agent sessions named) and forbidding raising them.
- AC1.2 — `git diff --word-diff develop -- infra/community-edition/LICENSE` shows only words of the limits sentence changed (the line diff will flag line 23, which holds both sentences); the prohibition text from "You may not remove" to "intact." is byte-identical.
- AC1.3 — `grep -rnE "\b(10|ten)\b.*(agent|session)" <T>/README.md <T>/LICENSE` gives nothing contradictory; the new test in `tools/tests/test_community_edition.py` asserts README cap == `CE_MAX_AGENTS` (3) and the § Usage Limits paragraph has no `\(\d+\)` and no number word next to user/account/session, and passes.
- PR merged to develop via the merge lane with `./dc check full` green; Jaah Deploy for the merge succeeds (or is superseded).
Outcome
CE LICENSE § Usage Limits now binds to the limits the software enforces as shipped; "ten (10)" removed, prohibition text unchanged. New test pins the README cap to CE_MAX_AGENTS=3 and keeps numbers out of the limits paragraph. Quick gate passes; PR #7201 queued in the merge lane. Memory: none applied.
Artifacts
Activity
- Draft
- Ready
- Runner started
- Runner ended (done)