Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,8 @@ jobs:
# bilingual structure · every stated contrast ratio recomputed from its own hex pair.
- run: node scripts/surface-check.mjs
# The one robots.txt comparison rule the post-deploy check applies (it cannot run here: it needs the live site).
- run: node --test scripts/robots-edge.test.mjs
# And the legal-state switch's tests: the Thai 7-day clause is in TERMS.md only while legal/legal-state.json says a trigger is met.
- run: node --test scripts/robots-edge.test.mjs scripts/legal-state.test.mjs

reply-language:
name: reply language (LWK-131)
Expand Down
29 changes: 25 additions & 4 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,27 @@ the pointer to it.

### Added

- `legal/`: the switch for the Thai 7-day cancellation clause. `legal/legal-state.json` records the seller type and the
dates on which a legal trigger was met (incorporation, direct-marketing registration, or annual revenue above
1,800,000 baht), and only that: its keys and values are fixed to null or a calendar date, so a registration number,
a tax identification number, a revenue figure or any owner identifier cannot be stored in this public repository.
The clause text (English and Thai) is `legal/thai-7day-clause.md`. `TERMS.md` holds one marked block that is empty
while no trigger has been met and holds the dated clause once one has; `node scripts/legal-state.mjs --write` renders
it and is the only way to flip the clause, and `node scripts/legal-state.mjs` (or rule 19 of the surface check)
refuses a `TERMS.md` that disagrees with the record. Its tests run in CI. The revenue trigger is written as a design
in `legal/README.md`; no billing system measures it yet. The record ships inactive, so the clause is absent from
`TERMS.md` today.
- The enforcement process in `TERMS.md` now has its numbers, in English and in a new Thai version: 14 business days to answer
a notice, a written decision 7 business days after the answer, 30 business days to file the one appeal through the
appeals role address, an answer within 14 business days, the key's clock stopped for the whole case, a ceiling of 90
calendar days from the notice, and a missed deadline on Kolwen's side lifting the suspension. A business day is a normal
working day in Thailand, Monday to Friday, without the public holidays announced in the Royal Gazette. The Thai
7-day clause (kept in `legal/`, see below) names the support role address as its cancellation channel. All of it stays under the pending-legal-review
marker and unlinked.
- The open-weights plan is now written in the future tense in `README.md`, `LICENSE`, `py/LICENSE` and `SECURITY.md`:
planned, not released, no release date set, nothing on sale, each release to carry its own license, and no claim about
the model's quality or performance. The free-weights-first intent stays; nothing was removed. No test or gate held the
old wording.
- The pricing page is now `/pricing` (`web/pricing.html`), and `/plans`, `/plans/` and `/plans.html` answer a 301
to it from the new `web/_redirects`, because the old address is the one given to the payment provider. The sitemap
lists `/pricing`. Rule 18 of `scripts/surface-check.mjs` holds the redirect file (valid lines, same-site destinations that are
Expand All @@ -184,10 +205,10 @@ the pointer to it.
`TERMS.md`.
- `TERMS.md` also carries the enforcement process for a customer's fault as due process (notice, suspension rather
than termination, a window to answer, a written decision, one appeal to a human, a register of cases; a chargeback
suspends and is restored or terminated by how the dispute closes, on Paddle's track). The day counts and the appeal
channel are placeholders. The Thai 7-day cancellation right is written in both languages as a dormant clause that
takes effect on incorporation, direct-marketing registration or revenue above 1,800,000 baht a year; until then the
refunds above are the live rule. Nothing flips the switch yet.
suspends and is restored or terminated by how the dispute closes, on Paddle's track). The Thai 7-day cancellation right is
written in both languages in `legal/thai-7day-clause.md`, outside `TERMS.md`; it appears in `TERMS.md` only when
`legal/legal-state.json` says a trigger has been met (see the `legal/` bullet below). Until then the refunds above are
the live rule.
- `PRIVACY.md` names Cloudflare Web Analytics (aggregate statistics only: page, referrer, country, browser; no one
identified; counts run low behind an ad-blocker) and adds a short Age section. Its sentence about an injected
bot-detection script is replaced, because the zone's JavaScript Detections were switched off on 2026-10-07 and a
Expand Down
5 changes: 3 additions & 2 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,12 +38,13 @@ nothing here needs an `npm install` to run.
```bash
node scripts/surface-check.mjs # the room's own laws: claims, leakage, orthography, contrast, the tracker claim, production noindex
node scripts/secret-gate.mjs # the house secret scan over the tracked tree (the hooks also scan what a commit or push adds)
node --test scripts/secret-scan.test.mjs scripts/secret-gate.test.mjs # the scanner's and the gate's own tests
node --test scripts/secret-scan.test.mjs scripts/secret-gate.test.mjs scripts/legal-state.test.mjs # the scanner's, the gate's and the legal-state switch's own tests
node scripts/legal-state.mjs # check TERMS.md against legal/legal-state.json; --write renders it, and is the only way to flip the Thai 7-day clause
node brand/make-brand.mjs # regenerate every brand asset; must leave git clean
node scripts/post-deploy-check.mjs # compare the live site to what is committed (needs network); --origin <url> checks one host
```

The surface check, the brand byte-identity check and the secret gate (with its two test files) run in CI on every push and must pass. The post-deploy check runs after a deploy.
The surface check, the brand byte-identity check and the secret gate (with its test files) run in CI on every push and must pass. The post-deploy check runs after a deploy.

The repository also ships a `pre-commit` and a `pre-push` hook in `.githooks/` that run the secret scan, then the surface check. `pre-commit` scans the working-tree copy of each tracked file, not what is staged, so a key that is staged and then removed from the working copy passes it; `pre-push` scans the added lines, commit messages and tags of every pushed commit, and CI scans the tree, so that key is caught there. They run only in a clone that ran `git config core.hooksPath .githooks`, and `git push --no-verify` bypasses them; GitHub's server-side secret scanning and push protection stay this repository's other wall.

Expand Down
13 changes: 7 additions & 6 deletions LICENSE
Original file line number Diff line number Diff line change
Expand Up @@ -9,17 +9,18 @@ modify, distribute, sublicense, sell, or create derivative works from this
repository's contents, except as permitted by applicable law (fair use /
quotation with attribution).

MODEL WEIGHTS ARE LICENSED SEPARATELY. Any Kolwen model weights are released
under their own license, stated in and shipped with each release. Nothing in
this file grants or restricts rights to model weights.
MODEL WEIGHTS WILL BE LICENSED SEPARATELY. No Kolwen model weights have been
released yet and no release date is set. If and when any are released, each
release will carry its own license, stated in and shipped with that release.
Nothing in this file grants or restricts rights to model weights.

No trademark rights are granted. "Kolwen", "โคลเวน", "Kolwen Peat",
"Kolwen Lignite", "Kolwen Anthracite", "Bankfire", and "TheColliery" are
names claimed by the copyright holder.

Kolwen models are built on Qwen (Alibaba Cloud) base models; the specific
base model used for each release is Apache-2.0, and base-model attribution
plus the Apache-2.0 notice ship with every weights release.
Kolwen models are planned to be built on Qwen (Alibaba Cloud) base models; the
base model for each release is expected to be Apache-2.0, and base-model
attribution plus the Apache-2.0 notice will ship with every weights release.

THE CONTENTS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND. IN NO EVENT
SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES, OR OTHER
Expand Down
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ downloadable yet, as the Status section says.

| model | intended seat |
|---|---|
| **Kolwen** | the free model—open weights, run it yourself |
| **Kolwen** | planned: a free model with open weights to run yourself; not released, no date set, nothing on sale |
| **Kolwen Peat** | smallest of the fired line |
| **Kolwen Lignite** | the workhorse |
| **Kolwen Anthracite** | the top—highest-grade coal, hottest and cleanest burn |
Expand All @@ -24,8 +24,8 @@ is a named rank with no model behind it yet—reserved, not shipped.

**Pre-release.** Nothing is downloadable yet. This repository is the product's public face—documentation, releases, and community—in the same shape as [`anthropics/claude-code`](https://github.com/anthropics/claude-code): the kitchen is not here.

- Built on Qwen (Apache-2.0 base)—base attribution ships with every release.
- Model weights, when released, carry their own license per release.
- Planned to be built on Qwen (Apache-2.0 base)—base attribution will ship with every release.
- No model weights have been released and no release date is set. If and when weights are released, each release will carry its own license.
- Issues and pull requests are welcome now—see [CONTRIBUTING.md](CONTRIBUTING.md), which asks you
to open an issue first.

Expand All @@ -36,6 +36,6 @@ Bugs and feature discussion belong in Issues.

## License

Repository contents: all rights reserved—see [LICENSE](LICENSE). Released model weights carry their own per-release license.
Repository contents: all rights reserved—see [LICENSE](LICENSE). No model weights have been released; if and when they are, each release will carry its own license.

Portions generated with AI assistance, reviewed by the maintainer. Copyright (c) 2026 HetCreep—see [NOTICE](NOTICE).
5 changes: 3 additions & 2 deletions SECURITY.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,9 @@ This repository is the public face of Kolwen. What ships from it:
weakened path filter or config is as much a finding as a change to a workflow itself.

**Out of scope**
- **The model.** Kolwen is in development and no model, weights, or inference service has been
released. There is nothing here that runs a model.
- **The model.** Kolwen is in development. No model, weights, or inference service has been
released and no release date is set, so there is nothing here that runs a model. If and when
one is released, this scope will be updated.
- Vulnerabilities in third-party services this repo depends on—Cloudflare, GitHub, PyPI, npm,
Google Fonts. Report those to the vendor.
- The npm package `kolwen`, which is published from outside this repository. It is ours, so
Expand Down
Loading
Loading