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
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.

Expand Down
3 changes: 3 additions & 0 deletions FEATURES.md
Original file line number Diff line number Diff line change
@@ -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.
Expand Down
8 changes: 8 additions & 0 deletions TEST-PLAN.md
Original file line number Diff line number Diff line change
@@ -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.
Expand Down
1 change: 1 addition & 0 deletions documentation/public/favicon.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 4 additions & 0 deletions documentation/scripts/check-output.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -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(/<h1(?:\s|>)/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, /<svg\b[^>]*xmlns="http:\/\/www\.w3\.org\/2000\/svg"/);
let internalLinks = 0;
for (const [route, html] of htmlByPath) {
for (const [, href] of html.matchAll(/<a\b[^>]*\bhref="([^"]+)"/g)) {
Expand Down
Loading