docs: rewrite navigation into seven job-based tabs - #401
Conversation
|
Claude encountered an error after 4m 2s —— View job Doc review — third pass (head
|
| "group": "Evidence sources", | ||
| "pages": [ | ||
| "integrations/sonar", | ||
| "integrations/slack", | ||
| "integrations/launchdarkly", | ||
| "integrations/mcp_server" | ||
| ] | ||
| } |
There was a problem hiding this comment.
Two of these four fail the tab's own membership test.
Record evidence is defined in this PR as "…is instrumenting a pipeline to produce evidence."
integrations/slack— "receive notifications about changes in your environments and query Kosli … without leaving Slack". Consumption, not production.integrations/mcp_server— "exposes the Kosli API to AI assistants … ask which environments are non-compliant, and why?". Querying, not evidence.
integrations/sonar is a genuine evidence source; integrations/ci_cd and integrations/kosli_actions above are too. The Slack and MCP pages are notification/query surfaces, and per this PR's own rule ("If a page fails every test, the structure is wrong, not the page — raise it") they either need a home that fits or the tab set needs a seventh test for "get Kosli's answers where I already work."
| "tab": "Environments and runtime", | ||
| "icon": "server", | ||
| "pages": [ | ||
| { | ||
| "group": "Kosli learning labs", | ||
| "group": "Reporting your runtime", | ||
| "pages": [ | ||
| "labs/index", | ||
| "labs/lab-01-get-ready", | ||
| "labs/lab-02-flows-and-trails", | ||
| "labs/lab-03-build-controls", | ||
| "labs/lab-04-release-controls", | ||
| "labs/lab-05-runtime-controls" | ||
| "tutorials/report_k8s_envs", | ||
| "tutorials/report_aws_envs", | ||
| "tutorials/report_cloud_run_envs" | ||
| ] | ||
| } | ||
| }, | ||
| "administration/managing_environments/overview" | ||
| ] |
There was a problem hiding this comment.
Two things here, both structural rather than cosmetic.
"pages" instead of "groups". Every other content tab in this file (Discover Kosli, Platform administration, Risks & controls, Record evidence) uses "groups". Mintlify accepts a group object inside a tab-level "pages", so this renders, but it is the only tab shaped differently.
The bare page lands at the bottom. administration/managing_environments/overview is titled "Managing environments" and is the closest thing this tab has to an entry point, but as an ungrouped sibling after the group it renders below the three reporting how-tos. A reader arriving at the tab meets report_k8s_envs first.
| "tab": "Environments and runtime", | |
| "icon": "server", | |
| "pages": [ | |
| { | |
| "group": "Kosli learning labs", | |
| "group": "Reporting your runtime", | |
| "pages": [ | |
| "labs/index", | |
| "labs/lab-01-get-ready", | |
| "labs/lab-02-flows-and-trails", | |
| "labs/lab-03-build-controls", | |
| "labs/lab-04-release-controls", | |
| "labs/lab-05-runtime-controls" | |
| "tutorials/report_k8s_envs", | |
| "tutorials/report_aws_envs", | |
| "tutorials/report_cloud_run_envs" | |
| ] | |
| } | |
| }, | |
| "administration/managing_environments/overview" | |
| ] | |
| "tab": "Environments and runtime", | |
| "icon": "server", | |
| "groups": [ | |
| "administration/managing_environments/overview", | |
| { | |
| "group": "Reporting your runtime", | |
| "pages": [ | |
| "tutorials/report_k8s_envs", | |
| "tutorials/report_aws_envs", | |
| "tutorials/report_cloud_run_envs" | |
| ] | |
| } | |
| ] | |
| }, |
(The Terraform Reference menu item at line 430 already uses this string-then-group form under "groups", so it is an established pattern in this file.)
Separately: at four pages this is the thinnest tab, while Risks & controls ▸ Drift detection holds two pages about detecting unexpected changes in running infrastructure — arguably "interpreting what is actually running." Worth deciding deliberately rather than by inheritance.
| "tab": "Risks & controls", | ||
| "icon": "shield-halved", | ||
| "groups": [ | ||
| { | ||
| "group": "Risks and controls", |
There was a problem hiding this comment.
Two label problems in five lines.
& vs and. This is the only tab using an ampersand — Environments and runtime spells it out. The commit before this one in the stack (03b83ae) was specifically about label hygiene, and the base nav's Authentication & access / Users & roles / Querying & tracing groups were all dissolved here. Picking one form and applying it is worth the churn now, before both spellings get quoted into CLAUDE.md and the skill.
The group repeats the tab. Risks & controls ▸ Risks and controls is the redundant wrapper 03b83ae set out to remove. Its three pages (understand_kosli/risks, understand_kosli/controls, tutorials/working_with_controls) could sit directly under the tab, or take a label that says what distinguishes them from the other three groups — something like Define risks and controls.
| Tabs are named after subjects, not document types. Diátaxis decides a page's | ||
| *form*; the tab's membership test decides its *place*. One subject draws all | ||
| four needs, so they sit in one tab, sorted by form inside it. | ||
|
|
There was a problem hiding this comment.
This table is byte-for-byte the same as the one added to .claude/skills/doc-write/SKILL.md in the same commit. Two copies of a membership test will drift the first time a tab is renamed, and the reader has no way to tell which is authoritative.
Consider keeping the table in one place and pointing at it from the other — CLAUDE.md already does this for the doc-write/doc-review/doc-structure skills in its Skills section.
0cb65ed to
6afb548
Compare
| "icon": "user", | ||
| "group": "Help and troubleshooting", | ||
| "pages": [ | ||
| "faq/faq", |
There was a problem hiding this comment.
faq/faq.md:4 carries icon: circle-question, added two commits ago (268720f) for a reason this commit removes:
Also restore the FAQ icon that the dissolve dropped … so it does not render as the one bare link among the Documentation tab's icon-bearing groups.
faq/faq is no longer a bare link beside icon-bearing groups — it is the first page inside Help and troubleshooting, and the other eight pages in that group have no front-matter icon. The icon now produces the inverse of the inconsistency it was added to fix: one icon-bearing page among eight plain siblings.
Drop the front-matter icon, or give the group's pages a consistent treatment. Either way it is a decision this commit made and did not follow through on.
| "understand_kosli/risks", | ||
| "understand_kosli/controls", |
There was a problem hiding this comment.
Moving these two out of Understand Kosli breaks the only ordered reading path the site publishes.
understand_kosli/what_is_kosli.md:30, under New to Kosli?:
Read Risks, Controls, and How Kosli works in order.
After this change, steps 1 and 2 of that sequence are in Risks & controls while steps 0, 3 and the glossary stay in Discover Kosli ▸ Understand Kosli. A reader who follows the sidebar instead of the accordion goes what_is_kosli → how_kosli_works → glossary and never meets Risks or Controls.
Both pages describe themselves as orientation, not decision-making — "Why modern software delivery introduces risks, and how to think about them" and "Why SDLC controls exist, how they mitigate software delivery risks" — which is the Discover Kosli test ("has not started yet: orientation…"), not Risks & controls ("is deciding what must be true, or proving it was"). tutorials/working_with_controls passes the new tab's test; these two read as the concepts behind it.
Either keep them in Discover Kosli ▸ Understand Kosli and let the new tab hold the doing, or rewrite the accordion so the path it promises matches the sidebar.
Phase 1 of #393. Closes #395. One edit to config/navigation.json: no page files move, no URLs change, no redirects needed, revertible in this commit. A URL comes from the file path, not from sidebar position, so every one of the 207 pages keeps its address while changing tab. Replace the five tabs, which mixed four organizing principles, with seven named after subjects. Each carries a one-sentence membership test: - Discover Kosli (27) - the reader has not started yet: orientation, first run, learning, getting unstuck - Platform administration (21) - the reader is configuring Kosli itself for an organization - Risks & controls (10) - the reader is deciding what must be true, or proving it was - Environments and runtime (4) - the reader is reporting, or interpreting, what is actually running - Record evidence (15) - the reader is instrumenting a pipeline to produce evidence - Reference (129) - the reader knows what they want and needs exact syntax or values - Changelog (1) - what shipped Documentation held 61 pages across 8 groups spanning all four Diataxis types, with no rule for what belonged in it. Splitting Documentation from Reference by page form forced authors to classify a page before they could place it; naming tabs after subjects means one subject's four Diataxis needs sit in one tab, sorted by form inside it. Tab labels are sentence case per CLAUDE.md, so `Risks & controls` and `Environments and runtime` rather than the Title Case forms in #395. This resolves open decision 5 in the proposal and keeps Phase 0's casing work from being undone two tabs later. Every tab now carries an icon, clearing the last inconsistent-icons finding. Reference is unchanged beyond gaining an icon. H1: update-cli-nav.py:154-158 hard-codes `tab == "Reference"` and `item == "CLI Reference"` and exits 1 without them, so neither label can move. Three deviations from the proposal's group layout, all because the group it specifies would hold a single page and reintroduce what Phase 0 just removed: - Policies and Advanced evaluation are merged into `Policies and evaluation`. The proposal's policy-reference/* entries are cross-links, which stay in Reference. - Working with controls joins `Risks and controls` rather than heading a group of one. - Environments and runtime carries managing_environments/overview as a direct page beside `Reporting your runtime`. The proposal's `Infrastructure as code` group is omitted: its Terraform and Helm entry points are cross-links into Reference, so it would hold no pages of its own. The `Kosli Capture` and `How reporting works` groups are also omitted because all four of their pages are still in unmerged PRs (#380, argument for the tab. Verified: 207 pages before and after, set-identical with no duplicates; audit_navigation.py down to 1 advisory finding; pytest 44 passed; mint broken-links clean.
Part of #393. Pulled forward from #398, because the previous commit is what makes this guidance wrong. The doc-write skill's placement table mapped page types to `Documentation ▸ Tutorials`, `Documentation ▸ Administration` and the other old tabs. None of them exist after the tab rewrite, so an author following the skill would file a page under a tab that is not there - the exact failure #393 exists to remove, reintroduced through the tool authors actually consult. Replace that table with the seven membership tests, and state the rule the old table contradicted: tabs are named after subjects, so Diataxis decides a page's form while the membership test decides its place. Add the same table to CLAUDE.md, which is loaded on every session, along with the H1 warning not to rename the Reference tab or its CLI Reference menu item. Also drop the note telling authors that a group's label may not describe its contents. It was true of `Documentation ▸ Tutorials`, which held mostly how-to guides; it is not true of the new groups, and keeping it would teach authors to distrust labels that are now accurate.
Addresses the doc-review findings on #401. The membership table was copied into both CLAUDE.md and the doc-write skill, and the two copies had already diverged in the commit that created them: only the skill carried "Reference wins on content shape", only CLAUDE.md carried the warning against renaming the Reference tab. Neither copy was complete and neither was authoritative. CLAUDE.md now holds the table, and the skill points at it and keeps only the three rules the table does not carry. Sweep the tab names this rewrite deletes but left behind in prose: - understand_kosli/what_is_kosli.md sent readers to "the Implementation Guide", now Platform administration > Planning your rollout - administration/managing_users/mapping_users_to_roles.md named the same destination - .claude/skills/doc-structure/SKILL.md weighed findings against "the Documentation tab", which no longer exists - and that skill is what audits this navigation every month Rename the tab `Risks & controls` to `Risks and controls`. It was the only label in the whole navigation using `&`: the precedents that justified it, `Users & roles` and `Authentication & access`, are groups this rewrite dissolves. Dissolve `Risks and controls > Risks and controls`, which repeated its tab's label. Its three pages read correctly at tab level beside the remaining groups. Rename `Evidence sources` to `Integrations`. The group claimed more than it held: integrations/slack is a notification surface and integrations/mcp_server is a query surface, and neither produces evidence. Remove the FAQ page icon added in 268720f. It was right on the layer below, where FAQ sat among icon-bearing groups in the Documentation tab; here faq/faq is one of nine pages in `Help and troubleshooting`, none of which carry an icon, so the icon creates the inverse inconsistency.
6afb548 to
9c86c0f
Compare
|
All six addressed in 9c86c0f. Taking them in order of how much they mattered: 4. The two copies of the membership table already disagree — the sharpest finding, and correct. I created the drift in the same commit that created the copies. 3. Prose and agent guidance still name deleted tabs — fixed all three. Agreed that 6. The three open items — all three taken, not deferred:
1. FAQ icon — removed here. Worth noting it stays on #400, where it is correct: FAQ sits among icon-bearing groups in the 5. Your correction to the earlier inline suggestion — confirmed, and thank you for catching it against 2. The ordered reading path spanning two tabs — acknowledged and not changed. Re-verified at head: On your process note — the uncommitted revert of |
| "pages": [ | ||
| { | ||
| "group": "Kosli learning labs", | ||
| "group": "Reporting your runtime", | ||
| "pages": [ | ||
| "labs/index", | ||
| "labs/lab-01-get-ready", | ||
| "labs/lab-02-flows-and-trails", | ||
| "labs/lab-03-build-controls", | ||
| "labs/lab-04-release-controls", | ||
| "labs/lab-05-runtime-controls" | ||
| "tutorials/report_k8s_envs", | ||
| "tutorials/report_aws_envs", | ||
| "tutorials/report_cloud_run_envs" | ||
| ] | ||
| } | ||
| }, | ||
| "administration/managing_environments/overview" | ||
| ] |
There was a problem hiding this comment.
The tab's entry point still renders below the how-tos, and this file now contradicts itself about where direct pages go.
Risks and controls (lines 111–114) was reshaped in 9c86c0f to put its direct pages before its groups. This tab keeps the opposite order, so administration/managing_environments/overview — "Managing environments", the only page here that explains what an environment is — renders after report_k8s_envs. A reader who opens the tab meets a Kubernetes how-to first.
| "pages": [ | |
| { | |
| "group": "Kosli learning labs", | |
| "group": "Reporting your runtime", | |
| "pages": [ | |
| "labs/index", | |
| "labs/lab-01-get-ready", | |
| "labs/lab-02-flows-and-trails", | |
| "labs/lab-03-build-controls", | |
| "labs/lab-04-release-controls", | |
| "labs/lab-05-runtime-controls" | |
| "tutorials/report_k8s_envs", | |
| "tutorials/report_aws_envs", | |
| "tutorials/report_cloud_run_envs" | |
| ] | |
| } | |
| }, | |
| "administration/managing_environments/overview" | |
| ] | |
| "pages": [ | |
| "administration/managing_environments/overview", | |
| { | |
| "group": "Reporting your runtime", | |
| "pages": [ | |
| "tutorials/report_k8s_envs", | |
| "tutorials/report_aws_envs", | |
| "tutorials/report_cloud_run_envs" | |
| ] | |
| } | |
| ] |
| { | ||
| "group": "Integrations", | ||
| "pages": [ | ||
| "integrations/sonar", | ||
| "integrations/slack", | ||
| "integrations/launchdarkly", | ||
| "integrations/mcp_server" | ||
| ] | ||
| } |
There was a problem hiding this comment.
Renaming this group from Evidence sources to Integrations moves the mismatch up a level rather than resolving it — and creates a second one.
The tab's membership test, now published in CLAUDE.md:150, is "…is instrumenting a pipeline to produce evidence." integrations/slack ("receive notifications … and query Kosli without leaving Slack") and integrations/mcp_server ("ask which environments are non-compliant, and why?") are consumption surfaces; neither produces evidence, so they fail the tab, not just the group.
The label also now competes with the group above it: integrations/ci_cd and integrations/kosli_actions are integrations too, and they sit in CI/CD. A reader scanning for "Integrations" will not expect the CI ones to be elsewhere.
Record evidence ▸ Evidence sources for sonar and launchdarkly was the accurate part. The open question is where the two query/notification pages go — per this PR's own rule (CLAUDE.md:152, "If a page fails every test, the structure is wrong, not the page"), that is a missing test, not a page to force in.
| </Accordion> | ||
| <Accordion title="Setting up Kosli for your team?" icon="users"> | ||
| Head to [Getting Started](/getting_started/install) for step-by-step setup, or see the [Implementation Guide](/implementation_guide/phase_1/roles_and_responsibilities/overview) for organizational rollout planning. | ||
| Head to [Getting Started](/getting_started/install) for step-by-step setup, or see [Planning your rollout](/implementation_guide/phase_1/roles_and_responsibilities/overview) for organizational rollout planning. |
There was a problem hiding this comment.
Half of this line was updated to the new labels. [Getting Started] is the other half: the group it points at is now Discover Kosli ▸ Get started, and the Getting started label it quotes no longer exists anywhere in config/navigation.json.
| Head to [Getting Started](/getting_started/install) for step-by-step setup, or see [Planning your rollout](/implementation_guide/phase_1/roles_and_responsibilities/overview) for organizational rollout planning. | |
| Head to [Get started](/getting_started/install) for step-by-step setup, or see [Planning your rollout](/implementation_guide/phase_1/roles_and_responsibilities/overview) for organizational rollout planning. |
Line 30, three lines up, has the larger version of the same problem — see the top-level comment.
Addresses findings 1, 2 and 4 of the second doc-review pass on #401. The first two are regressions from 9c86c0f, which moved the placement table to CLAUDE.md without following its inbound references. - .claude/skills/doc-review/SKILL.md told reviewers to "apply the placement table in the doc-write skill", which that commit deleted. It now points at CLAUDE.md. This is the skill that runs on every PR, so it was reviewing placement against a table that no longer existed. - doc-write's "Writing" step 1 said "pick the destination from the table above". After the move, the nearest table above it is the Diataxis type table - the one the skill explicitly says placement does not follow. Also relax doc-write's group threshold from three sibling pages to two. The seven-tab structure ships three two-page groups (`Your account`, `Policies and evaluation`, `Drift detection`), so the old threshold judged the next author by a rule the navigation itself breaks. Two matches the rule's own rationale and what audit_navigation.py enforces: it flags a group of exactly one.
| ] | ||
| } | ||
| }, | ||
| "administration/managing_environments/overview" |
There was a problem hiding this comment.
This page is a Terraform how-to, which changes the earlier round's read of it — including mine.
administration/managing_environments/overview.md:3 describes itself as "manage Kosli environments via Terraform", and line 13 is explicit:
This page covers managing environments via Terraform. For creating environments via the CLI or UI, see Getting started: Environments.
So two things follow:
- It is not this tab's entry point. Hoisting it above
Reporting your runtime— which the previous round suggested, and whichRisks and controlsnow does with its direct pages — would put aresource "kosli_environment"HCL block in front of a reader who has not been told what a Kosli environment is. Please disregard that part of the earlier suggestion; the ordering inconsistency between the two"pages"tabs is still real, but this is not the page that fixes it. - It reads against the tab's own test. "…is reporting, or interpreting, what is actually running" describes the three reporting how-tos; declaring environments as IaC is closer to "configuring Kosli itself for an organization". The PR body dropped the proposal's
Infrastructure as codegroup because its entries were cross-links — this is the one page that would have belonged in it.
The page the tab is actually missing is the conceptual one it defers to, getting_started/environments, which lands in Discover Kosli ▸ Core concepts. That is defensible for a first-run reader, but it leaves Environments and runtime with no page that explains its own subject.
| </Accordion> | ||
| <Accordion title="Setting up Kosli for your team?" icon="users"> | ||
| Head to [Getting Started](/getting_started/install) for step-by-step setup, or see the [Implementation Guide](/implementation_guide/phase_1/roles_and_responsibilities/overview) for organizational rollout planning. | ||
| Head to [Getting Started](/getting_started/install) for step-by-step setup, or see [Planning your rollout](/implementation_guide/phase_1/roles_and_responsibilities/overview) for organizational rollout planning. |
There was a problem hiding this comment.
Still half-updated at head. 9c86c0f fixed the second link's text (Implementation Guide → Planning your rollout) and left the first: Getting Started is not a label in config/navigation.json any more — the group is Discover Kosli ▸ Get started (line 16).
| Head to [Getting Started](/getting_started/install) for step-by-step setup, or see [Planning your rollout](/implementation_guide/phase_1/roles_and_responsibilities/overview) for organizational rollout planning. | |
| Head to [Get started](/getting_started/install) for step-by-step setup, or see [Planning your rollout](/implementation_guide/phase_1/roles_and_responsibilities/overview) for organizational rollout planning. |
Phase 1 of #393. Closes #395.
Stacked on #400 (Phase 0) — review that first; this PR's diff is only the tab rewrite. Interactive preview of the target structure: https://claude.ai/code/artifact/94c14e95-8be9-4a3a-be46-bb1b0f979f9d
URL impact
config/navigation.jsononly, no redirects neededA URL comes from the file path, not from sidebar position, so all 207 pages keep their address while changing tab. Revertible in one commit.
The change
Documentationheld 61 pages across 8 groups spanning all four Diátaxis types, with no rule for what belonged in it. SplittingDocumentationfromReferenceby page form forced authors to classify a page before they could place it. Naming tabs after subjects means one subject's four Diátaxis needs sit in one tab, sorted by form inside it.Tab labels are sentence case per
CLAUDE.md—Risks and controls,Environments and runtime— rather than the Title Case forms written into #395. This resolves open decision 5 in the proposal and stops Phase 0's casing work being undone two tabs later. Every tab now carries an icon, clearing the last inconsistent-icons finding.Referenceis unchanged beyond gaining an icon. Per H1,scripts/update-cli-nav.py:154-158hard-codestab == "Reference"anditem == "CLI Reference"and exits 1 without them, so neither label can move.Deviations from the proposal, and why
Three of the proposal's groups would have held a single page, reintroducing exactly what #400 removes:
PoliciesandAdvanced evaluationare merged intoPolicies and evaluation. The proposal'spolicy-reference/*entries are cross-links, and those pages stay in Reference.working_with_controlsjoins the risks-and-controls pages rather than heading a group of one.Environments and runtimecarriesmanaging_environments/overviewas a direct page besideReporting your runtime.Two groups are omitted:
Infrastructure as code— its Terraform and Helm entry points are cross-links into Reference, so the group would hold no pages of its own.Kosli CaptureandHow reporting works— all four pages are still in unmerged PRs (docs: add Kosli Capture Managed Service page #380, feat: new Kosli Capture drop-in AWS snapshotting tutorial #337, docs: document how the k8s reporter handles job and cronjob pods #391). Those PRs now have an obvious home to land in, which was the argument for this tab in the first place.Environments and runtimeis therefore thin at 4 pages. That is deliberate: it is the tab that makes the seven undocumented reporters visible as a gap rather than an absence.Three further changes came out of review:
Risks and controls, notRisks & controls. It was the only label in the whole navigation using&— the precedents that justified it,Users & rolesandAuthentication & access, are groups this rewrite dissolves.Risks and controlsgroup is dissolved rather than repeating the tab's own label; its three pages sit at tab level beside the remaining groups.Evidence sourcesis renamedIntegrations. The group claimed more than it held:integrations/slackis a notification surface andintegrations/mcp_serveris a query surface, and neither produces evidence.Second commit: the authoring guidance
The
doc-writeskill's placement table mapped page types toDocumentation ▸ Tutorialsand the other old tabs. None survive this rewrite, so an author following the skill would file a page under a tab that does not exist — the exact failure #393 exists to remove, reintroduced through the tool authors actually consult.That table is now the seven membership tests, and the same table is in
CLAUDE.md, which loads every session. This work was assigned to #398; it moved here because the first commit is what makes the old guidance wrong.I also dropped the note telling authors that a group's label may not describe its contents. It was true of
Documentation ▸ Tutorials, which held mostly how-to guides. It is not true of the new groups, and keeping it would teach authors to distrust labels that are now accurate.Conflicts to expect
Four open PRs also touch
config/navigation.json: #391 and #380 are active, #338 and #337 are stale drafts. This PR rewrites the file wholesale, so whichever lands second pays the conflict. The suggestion is not to block on them — land #391 and #380 on their own track and rebase this stack, and let the two stale drafts absorb the conflict when someone revives them.Verification
python3 scripts/audit_navigation.py— 1 advisory finding left, down from 32 across the stackpython3 scripts/audit_navigation.py --check— exit 0python3 -m pytest tests/— 44 passedmint broken-links— zero broken linksReferencetab andCLI Referenceitem labels unchanged (H1)