From b12c47ad8acc1c4bae7eb507a26a79eabbb93df2 Mon Sep 17 00:00:00 2001 From: Tiberiu Socaci Date: Fri, 6 Nov 2026 20:15:33 +0200 Subject: [PATCH] fix(docs): ship the handbook favicon Signed-off-by: Tiberiu Socaci --- CHANGELOG.md | 2 ++ FEATURES.md | 3 +++ TEST-PLAN.md | 8 ++++++++ documentation/public/favicon.svg | 1 + documentation/scripts/check-output.mjs | 4 ++++ 5 files changed, 18 insertions(+) create mode 100644 documentation/public/favicon.svg diff --git a/CHANGELOG.md b/CHANGELOG.md index 55e9e25e..b06986fa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,8 @@ release gates. Stable promotion and publication require approval of the exact te ### Beta development notes +- Ship the documentation favicon so handbook pages no longer request a missing asset. + - Revoke pending identity-link proofs for a recovered administrator, preventing an older proof from replacing the new recovery enrollment link. Other administrators' proofs remain valid. diff --git a/FEATURES.md b/FEATURES.md index a5ef819a..cc6b9bbb 100644 --- a/FEATURES.md +++ b/FEATURES.md @@ -1,5 +1,8 @@ # ChannelGate — Features +The documentation handbook includes its branded favicon in standalone builds and website exports. +The build validator checks that every handbook page references the shipped SVG asset. + ## Organization policy licensing Mandatory organization skill grants and organization-wide agent instructions require Enterprise to add or change. All HTTP, MCP and raw settings writers share the settings boundary. Saved policies continue applying after downgrade; admins can explicitly remove grants or clear instructions. Existing Lean-mode exclusions still apply; these policies do not override Lean mode. Personal/channel grants, skill content maintenance, channel instructions and core safety rules remain available on every tier. diff --git a/TEST-PLAN.md b/TEST-PLAN.md index 95906a2a..dd358306 100644 --- a/TEST-PLAN.md +++ b/TEST-PLAN.md @@ -1,5 +1,13 @@ # ChannelGate — Test Plan +## Documentation favicon + +Run `cd documentation && npm run build && npm test`. The output validator requires the +`/docs/favicon.svg` link on every handbook page and a valid SVG asset in the build. In the exported +website fixture, require HTTP 200 with SVG content for that URL and repeat desktop/mobile handbook +navigation, search, themes and menu checks with zero console errors. This website asset is +engine-independent; source checks alone do not replace browser acceptance. + ## Enterprise organization policy acceptance Cases EE-POLICY-01 and EE-POLICY-02: for both Claude and Codex, on a disposable Enterprise fixture with Lean mode off set organization instructions and a mandatory skill; verify both appear in a fresh channel run. Downgrade the fixture to Registered and verify the saved policies still apply, while new mandatory grants and changed nonempty organization instructions are rejected with Enterprise guidance. Verify the same rejection via admin UI, HTTP governance/settings routes, MCP org-grant/governance tools and raw settings saves. Mixed governance requests must not partially enable or expose a skill. Explicitly remove the grant and clear instructions; verify subsequent runs omit only those policies and preserve core safety/channel instructions. Re-upgrade and verify new policy writes work. Automated: `test/enterprise-organization-policy.test.js`; live engine acceptance is separate and must not be inferred from unit results. diff --git a/documentation/public/favicon.svg b/documentation/public/favicon.svg new file mode 100644 index 00000000..439fbcb5 --- /dev/null +++ b/documentation/public/favicon.svg @@ -0,0 +1 @@ + diff --git a/documentation/scripts/check-output.mjs b/documentation/scripts/check-output.mjs index f34eab20..8337c1af 100644 --- a/documentation/scripts/check-output.mjs +++ b/documentation/scripts/check-output.mjs @@ -17,9 +17,13 @@ for (const slug of pages) { assert.ok(html.includes(`href="https://channelgate.dev${route}"`), `Missing canonical: ${route}`); assert.ok(html.includes('starlight'), `Missing Starlight layout: ${route}`); assert.ok(html.includes('aria-label="Main"'), `Missing persistent sidebar: ${route}`); + assert.ok(html.includes('href="/docs/favicon.svg"'), `Missing docs favicon link: ${route}`); assert.equal([...html.matchAll(/)/g)].length, 1, `Expected one page heading: ${route}`); htmlByPath.set(route, html); } +// Starlight emits this link by default, but does not provide the public asset. +const favicon = await readFile(resolve(dist, 'favicon.svg'), 'utf8'); +assert.match(favicon, /]*xmlns="http:\/\/www\.w3\.org\/2000\/svg"/); let internalLinks = 0; for (const [route, html] of htmlByPath) { for (const [, href] of html.matchAll(/]*\bhref="([^"]+)"/g)) {