Skip to content

docs: offer SolidSyslog under three alternative licences - #761

Merged
DavidCozens merged 5 commits into
mainfrom
chore/licensing-three-licences
Aug 12, 2026
Merged

docs: offer SolidSyslog under three alternative licences#761
DavidCozens merged 5 commits into
mainfrom
chore/licensing-three-licences

Conversation

@DavidCozens

@DavidCozens DavidCozens commented Aug 12, 2026

Copy link
Copy Markdown
Collaborator

Purpose

SolidSyslog moves from a single PolyForm Noncommercial licence to three
alternative licences, ahead of cutting 0.1.0.

The commercial gate becomes distribution rather than commercial identity. The
Noncommercial-only licence did not permit a commercial organisation to evaluate
the library at all, which was blocking prospects. PolyForm Internal Use 1.0.0
closes that: free, no time limit, for evaluation, porting, integration and
testing on target inside any organisation.

No issue — a licensing change with no acceptance criteria to agree.

Change Description

The three licences

  1. PolyForm Internal Use 1.0.0 — free, no time limit, internal business
    operations of any organisation. Does not permit distribution.
  2. PolyForm Noncommercial 1.0.0 — unchanged, and still permits redistribution.
  3. COSOSO Commercial Licence — required to ship. Referenced by contact link;
    not yet drafted.

Licence texts are verbatim. LICENSES/ holds both, byte-identical to the
PolyForm project repo at 76a278c
(3a4a1539… and c0ea4a89…). No reformatting, and no licensor substitution
the canonical text has no placeholder for it, so the licensor is identified by the
Required Notice: line in LICENSE.md, which is the mechanism PolyForm intends.
Editing the text would break licence-scanner matching for no gain.

Worth noting for review: the LICENSE.md being replaced was not canonical
PolyForm text. It had the Definitions compressed to a bullet list (losing the
definition of Control), the bold-italic dropped from the warranty disclaimer
along with its closing clause, and the Required Notice: example and canonical
URL removed. Replacing it with a pristine copy is a net correction.

Continuity is now stated once. LICENSE.md is the single home;
SECURITY.md and the triage runbook link it instead of restating it in
different words.

Consequential updates

  • sbom/sbom.cdx.json.templatelicenses[0].license.id becomes an SPDX
    expression. CRA/SBOM-minded readers would notice a mismatch here.
  • .github/workflows/sbom.ymlLICENSES/ added to the signed content-tree
    hash scope, matching the existing rationale for LICENSE.md.
  • .markdownlint-cli2.jsonc — ignore moves from LICENSE.md to LICENSES/**.
    The verbatim texts must not be reformatted; LICENSE.md is now our own prose
    and should be linted.
  • hooks/root_pages.py, mkdocs.yml, hooks/page_descriptions.py — both
    licence texts are published to the docs site. Without this the LICENSES/
    links on the published license.md page resolve inside the docs tree,
    source_links.py leaves them alone, and mkdocs build --strict fails.
  • CONTRIBUTING.md, SECURITY.md, docs/security/sbom.md,
    docs/security/release-verification.md, docs/release-process.md,
    docs/local-checks.md — statements that said "dual-licensed",
    "noncommercial tier", or listed the hash scope.

Test Evidence

No production code, so no TDD cycle. Gates run locally against the pinned CI
images:

  • mkdocs build --strict in the mkdocs-mkdoxy image — clean, no warnings.
    Verified the published license.md links resolve to ../licenses/… and the
    three pages render.
  • Docs build hooks — 99 tests, all pass.
  • scripts/check_platform_docs.py — pass.
  • markdownlint-cli2 v0.22.1 over the whole tree (required, since the config
    changed) — 64 files, 0 errors.
  • Rendered SBOM validated against the CycloneDX 1.5 JSON schema — valid;
    the expression form is schema-legal. cyclonedx-cli runs on release.
  • Confirmed against SPDX list data: PolyForm-Noncommercial-1.0.0 is listed,
    PolyForm-Internal-Use is not — so the LicenseRef- is correct.

GitHub licence detection: the repo API already reports NOASSERTION /
"Other" today, because the existing LICENSE.md was a modified PolyForm text.
This change causes no regression there. A three-way chooser cannot be
auto-detected.

Areas Affected

Repository metadata and documentation only. No Core/, Platform/, Tests/ or
Bdd/ source is touched, and no build behaviour changes.

Derived projects:

  • solid-syslog-example-makethird_party/README.md states "SolidSyslog is
    PolyForm Noncommercial 1.0.0" and will be stale. It carries the library as a
    submodule, so LICENSE.md and LICENSES/ travel with the pin; only the prose
    needs a human.
  • solid-syslog-example — makes no statement about the SolidSyslog licence at
    all, so nothing is stale. Arguably a gap worth filling separately.

Follow-up

In-source SPDX-License-Identifier headers are deliberately not in this PR.
The tree carries none today outside the vendored Apache-2.0 driver, and adding
them across Core/ and Platform/ needs a clang-format reflow and a
misra_renumber.py pass — enough mechanical churn to bury this change. Separate
PR so both get a genuine review.

Summary by CodeRabbit

  • Documentation
    • Updated licensing information with Internal Use, Noncommercial and COSOSO Commercial options.
    • Added complete PolyForm Internal Use and PolyForm Noncommercial licence texts.
    • Clarified evaluation, distribution, commercial-use and continuity terms.
    • Updated contribution, security, release-verification and linting guidance.
  • Site Updates
    • Added licence documents to published documentation and Compliance navigation.
    • Added legal and company information to the site footer.
  • Release Information
    • Expanded SBOM and source-tree verification coverage to include LICENSES/.
    • Updated licence metadata to represent all available licensing terms.

Also in this PR: UK trading disclosures in the docs footer

Rolled in deliberately rather than split out, because it lands in the same
review pass.

docs.cososo.co.uk is a separate website trading under the same brand as
cososo.co.uk, so it owes the same particulars under the Companies (Trading
Disclosures) Regulations and the Electronic Commerce (EC Directive) Regulations
2002. The cososo.co.uk footer is being updated in parallel, outside this repo.

The footer now reads:

2026 © Cozens Software Solutions Limited, trading as COSOSO
Registered in England and Wales: 09856828. VAT: GB 226 5336 15.
Registered office: Cawley Priory, South Pallant, Chichester, West Sussex, PO19 1SY.
Privacy Policy
  • overrides/partials/copyright.html — the disclosure as its own element. The
    particulars are byte-identical to the Companies House record for 09856828 and
    to the wording going onto cososo.co.uk; they are legal particulars, not house
    style, and must not be reflowed or abbreviated. The partial says so.
  • mkdocs.ymlcopyright: gains the trading name. The year is not written
    here
    : the partial renders build_date_utc.year, so it tracks the build and
    cannot go stale the way a literal in a static site would.
  • docs/assets/stylesheets/brand.css.ss-footer-legal sets margin and
    line-height only. It declares no colour, size or family, so it inherits
    .md-copyright and cannot drift into a second typeface in a short footer.

Decisions worth a reviewer's attention:

  • Privacy Policy link included; Contact and Security not. The docs site runs
    Plausible and has no privacy page of its own, so that was the real gap.
    Contact is already reachable from LICENSE.md and SUPPORT.md, and the
    security policy is already a Compliance nav page.
  • No email address. One is likely still owed under the e-commerce
    regulations — a contact form alone is generally held not to satisfy "direct
    and effective communication" — but a dedicated address is being set up first,
    and a placeholder would be worse than the gap. Follow-up.
  • The site is light-only by design (mkdocs.yml sets a single scheme, to
    match cososo.co.uk), so there is no dark palette to check the block against.

Verified: mkdocs build --strict clean, and the three lines render byte-exact.

PolyForm Internal Use 1.0.0 joins PolyForm Noncommercial 1.0.0 and a COSOSO
commercial licence. The commercial gate moves to distribution, so a commercial
organisation can evaluate, port and test on target at no cost.

Both PolyForm texts are byte-identical to upstream (polyformproject.org repo at
76a278c) and carry no licensor substitution - there is no placeholder in the
canonical text, and the licensor is identified by the Required Notice line in
LICENSE.md instead.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Warning

Review limit reached

You’ve reached a temporary PR review limit under our Fair Usage Limits Policy.

Your recent review volume is higher than typical usage, so adaptive limits are currently applied.

Next review available in: 5 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 29c63337-70c8-4f40-a646-c38872977ce9

📥 Commits

Reviewing files that changed from the base of the PR and between be3ca24 and 16a69ae.

📒 Files selected for processing (2)
  • README.md
  • overrides/partials/copyright.html

Walkthrough

The project now presents three licensing options, adds two complete PolyForm licence texts, publishes them in the documentation site, and updates SBOM and source-tree hash scopes to include LICENSES/.

Changes

Licensing and release metadata

Layer / File(s) Summary
Licence terms and project policy
LICENSE.md, LICENSES/*, CONTRIBUTING.md, README.md, SECURITY.md, docs/security/triage-runbook.md
The project now documents PolyForm Internal Use, PolyForm Noncommercial, and COSOSO Commercial licensing. The complete PolyForm texts are stored under LICENSES/.
Licence site publication
hooks/page_descriptions.py, hooks/root_pages.py, mkdocs.yml, overrides/partials/copyright.html
The two PolyForm licence documents now have generated page mappings, descriptions, Compliance navigation entries, and updated footer legal information.
SBOM and provenance scope
sbom/sbom.cdx.json.template, .github/workflows/sbom.yml, docs/release-process.md, docs/security/release-verification.md, docs/security/sbom.md
SBOM metadata and source-tree hash procedures now include LICENSES/ and the combined SPDX licence expression.
Licence text linting
.markdownlint-cli2.jsonc, docs/local-checks.md
Markdown linting now excludes verbatim licence files under LICENSES/ while retaining linting for LICENSE.md.

Estimated code review effort: 2 (Simple) | ~15 minutes

Mergeability Score: 🔵 Low · up to be3ca

The PR updates licensing documentation and publication paths, but the footer should separately validate the VAT number and the README’s duplicated licence summary may drift from the canonical terms. It is mergeable with explicit owner awareness and follow-up on these bounded documentation and provenance risks.

Possibly related PRs

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description check ✅ Passed The description covers purpose, changes, test evidence and affected areas, with clear licensing and documentation details.
Title check ✅ Passed The title is concise, uses Conventional Commits format and accurately summarises the licensing change.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch chore/licensing-three-licences

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@CONTRIBUTING.md`:
- Around line 20-24: In CONTRIBUTING.md lines 20-24, preserve the local
contribution/licensing context but remove the duplicated three-licence summary
and link readers to LICENSE.md for licence choices and obligations. In
docs/security/sbom.md lines 21-24, retain the SBOM scope rationale while
replacing repeated licence choices and text inventory with a link to
../../LICENSE.md.

In `@LICENSE.md`:
- Around line 23-24: Update the licence 2 wording to explicitly state that it
permits noncommercial redistribution, while directing commercial
redistribution—including distribution as part of a product, firmware image, or
device—to licence 3.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: c4ce2fb3-b680-4d62-be2a-ac4681767e3b

📥 Commits

Reviewing files that changed from the base of the PR and between 63043cf and cd56c4d.

📒 Files selected for processing (17)
  • .github/workflows/sbom.yml
  • .markdownlint-cli2.jsonc
  • CONTRIBUTING.md
  • LICENSE.md
  • LICENSES/PolyForm-Internal-Use-1.0.0.md
  • LICENSES/PolyForm-Noncommercial-1.0.0.md
  • README.md
  • SECURITY.md
  • docs/local-checks.md
  • docs/release-process.md
  • docs/security/release-verification.md
  • docs/security/sbom.md
  • docs/security/triage-runbook.md
  • hooks/page_descriptions.py
  • hooks/root_pages.py
  • mkdocs.yml
  • sbom/sbom.cdx.json.template

Comment thread CONTRIBUTING.md Outdated
Comment thread LICENSE.md Outdated
Licence 2 grants a Distribution License for any noncommercial purpose, so a
charity or university shipping hardware with SolidSyslog inside is covered by
licence 2, not licence 3. LICENSE.md read as though distribution and commerce
were the same event, in four places.

Also states licence 2's Notices obligation on a redistributor, adds an ask-us
line for the grey cases, and stops CONTRIBUTING.md and the SBOM scope note
restating the licence model instead of linking it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🔇 Additional comments (5)
LICENSE.md (2)

1-14: LGTM!

Also applies to: 15-29, 30-44, 45-56, 57-70, 81-86


74-79: 🗄️ Data Integrity & Integration

Make the custom licence references resolvable across the licensing documents and SBOM.

The same LicenseRef- identifiers appear in both documents. Confirm that the generated SBOM maps each identifier to stable licence information.

  • LICENSE.md#L74-L79: define or link the corresponding Internal Use and Commercial licence information.
  • docs/security/sbom.md#L82-L82: document the generated-BOM mapping or attached licence text for both references.

Source: MCP tools

CONTRIBUTING.md (1)

20-23: LGTM!

docs/security/sbom.md (2)

21-23: LGTM!


83-83: 🗄️ Data Integrity & Integration

⚠️ Unverified finding
Sandbox verification was unavailable.

Keep the documented hash scope identical to the generator.

This line states that LICENSES/ is included in source-tree-sha256. Verify that the workflow, the release-verification instructions, and the hash command use the same path set and ordering. Otherwise, signature verification can cover a hash that omits the licence texts.

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@README.md`:
- Around line 131-132: Update the README licensing section to remove the
detailed commercial-licence summary and direct readers to LICENSE.md for the
three licence choices and permitted purposes. Keep LICENSE.md as the sole
authoritative source so the commercial boundary includes shipping, supplying, or
distributing commercial products, devices, firmware, and services.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 7db5c2ee-e01b-420d-9239-1fac16255180

📥 Commits

Reviewing files that changed from the base of the PR and between cd56c4d and 876886d.

📒 Files selected for processing (4)
  • CONTRIBUTING.md
  • LICENSE.md
  • README.md
  • docs/security/sbom.md

Comment thread README.md Outdated
DavidCozens and others added 2 commits August 12, 2026 23:59
The bullet said "ship a commercial product", but licence 3 also covers
supplying a commercial device, firmware or service. The README was narrower
than the licence it summarises, which is the wrong direction to be imprecise
in - a commercial service reader would have concluded they needed nothing.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
docs.cososo.co.uk is a separate website trading under the same brand as
cososo.co.uk, so it owes the same particulars under the Companies (Trading
Disclosures) Regulations and the Electronic Commerce (EC Directive)
Regulations 2002: registered name and trading name, company number, VAT
number and registered office.

The year comes from build_date_utc rather than a literal, so it cannot go
stale. The block declares no colour, size or family, so it inherits
.md-copyright and cannot drift into a second typeface.

No email address yet - one is likely still owed under the e-commerce
regulations, and a dedicated address is being set up first.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@overrides/partials/copyright.html`:
- Around line 9-10: Update the footer attribution text around the Companies
House statement so only the registered name, company number, and registered
office are attributed to Companies House for 09856828. Separately validate VAT
number GB 226 5336 15 with HMRC, and publish it in the footer only after that
validation.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: b6d24c67-d2a4-4c97-bd8f-248c2ab3b120

📥 Commits

Reviewing files that changed from the base of the PR and between 876886d and be3ca24.

⛔ Files ignored due to path filters (1)
  • docs/assets/stylesheets/brand.css is excluded by !docs/assets/**
📒 Files selected for processing (3)
  • README.md
  • mkdocs.yml
  • overrides/partials/copyright.html

Comment thread overrides/partials/copyright.html Outdated
Companies House does not hold VAT numbers - VAT registration is HMRC's - so
the partial's comment pointed a future maintainer at a register that cannot
confirm one of the four particulars. Comment only; the rendered footer is
unchanged.

The README bullet omitted "or otherwise make available", so it was still
narrower than the licence 3 trigger it summarises. The two now read the same.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

☀️   Quality Summary

   JUnit   build-linux-gcc (Whole Project): ✅ successful — 1531 passed
   JUnit   build-freertos-host-tdd-plustcp (Whole Project): ✅ successful — 1883 passed
   JUnit   build-linux-clang (Whole Project): ✅ successful — 1462 passed
   JUnit   sanitize-linux-gcc (Whole Project): ✅ successful — 1462 passed
   JUnit   integration-linux-openssl (Whole Project): ✅ successful — 16 passed
   JUnit   integration-linux-mbedtls (Whole Project): ✅ successful — 14 passed
   JUnit   integration-windows-openssl (Whole Project): ✅ successful — 16 passed
   JUnit   bdd-linux-syslog-ng (Whole Project): ✅ successful — 49 passed, 3 skipped
   JUnit   bdd-windows-otel (Whole Project): ✅ successful — 46 passed, 6 skipped
   JUnit   bdd-freertos-qemu-plustcp (Whole Project): ✅ successful — 45 passed, 7 skipped
   JUnit   bdd-freertos-qemu-lwip (Whole Project): ✅ successful — 45 passed, 7 skipped
   JUnit   build-windows-msvc (Whole Project): ✅ successful — 1304 passed
   JUnit   build-linux-tunable-override (Whole Project): ✅ successful — 1462 passed
   ⚠️   Clang-Tidy (Whole Project): No warnings
   ⚠️   CPPCheck (Whole Project): No warnings


Created by Quality Monitor v4.15.0 (#82d77af). More details are shown in the GitHub Checks Result.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant