Repository navigation
Navigation: six tabs, sentence-case labels that match page titles, moved pages redirected #723
Description
Parent
What to build
The nav becomes six tabs: Get started (Why Ferro, installation, quickstart), Guide, How-to, Concepts, Reference (Python API, CLI, configuration, exceptions, migrations reference, RLS reference), Project (FAQ, roadmap, upgrading between versions, changelog, contributing). Labels are sentence case and equal their page's H1; same-named pages get distinct names ("Testing with Ferro", "Testing migrations"); the adopting how-to moves under Schema management; the upgrade guide moves to Project; the pages created by the split tickets (#714, #715) are wired in; the Next steps page is deleted. Every moved page gets a redirect_maps entry and every internal link is updated. Pages get front matter with a description, and status: new where the page is new in this epic.
Acceptance criteria
- The nav has exactly the six tabs above, and every page in
docs/pages(except includes) is in it. - Every nav label equals its page's H1.
- Every moved or deleted page's old URL redirects.
- Every page has a front-matter
description.
Files owned
- Modify:
zensical.toml,docs/pages/**(front matter, links, moved files) - Delete:
docs/pages/getting-started/next-steps.md - Test:
tests/test_docs_migrations.py
Interfaces
- Consumes:
redirect_maps(site config ticket (Docs site config: Zensical features, Markdown extensions, API reference options and a strict build #701)) - Consumes: new pages from the migrations-split and RLS ticket (Split the row-level security page and fix its example #715)s
- Produces: nothing other tickets rely on
Test scenarios
- Happy path: the strict build passes with every page in the nav.
- Integration: the old URLs of the moved pages resolve to redirects in the built site.
Verify
uv run --no-sync zensical build --clean --strict
uv run --no-sync pytest tests/test_docs_site.py -q --no-cov -p no:cacheprovider
uv run --no-sync pytest tests/test_docs_migrations.py -q --no-cov -p no:cacheprovider -n 8
uv run --no-sync pytest tests/test_docs_examples.py -q --no-cov -p no:cacheprovider -n 8Blocked by
- Get started pages: home page and README, Why Ferro, installation and quickstart #705, Project pages: FAQ, roadmap, contributing and changelog #706, Upgrade guide covers every release up to the current one #707, Models and fields page with a generated field type table #708, Queries guide and the typed predicates concept page: lambda-only story, results shown, one running example #709, Aggregations guide: real data without ties, results shown, error checks that can fail #710, Mutations, transactions and connections guides, and the multiple-databases how-to #711, Relationships and raw SQL guides #712, Schema management pages: fix stale facts and pin every quoted generated step file #713, Split the migrations guide: tutorial loop, how-tos, a squash page, and reference tables in Reference #714, Split the row-level security page and fix its example #715, How-tos: testing, pagination, timestamps and soft deletes #716, Migrating from SQLAlchemy: show sessions, make every block run #717, Concepts pages: architecture, identity map, type safety, backends and performance #718, Docstrings: connect, fields, checks, row security, raw SQL, sessions, settings and exceptions #720, API reference completeness: every public object has an entry, pages named after their objects #722
Audit findings
Rows from the docs audit this ticket covers (file, line, rule, fix)
Top-level nav (zensical.toml)
Judged against rule 6 (map navigation to the product) and rule 24 (titles say what the page gives). With navigation.tabs on, every top-level entry is a tab: Home, Why Ferro, Getting Started, Guide, How-To, Concepts, Reference, API Reference, Community: nine tabs, two of them single pages.
| Sev | Rule | Finding | Suggested fix |
|---|---|---|---|
| M | 6 | "Reference" (CLI, Configuration) and "API Reference" (Model, Fields...) are two tabs for one kind. A reader looking for ferro migrate up or FerroSettings has to guess which. |
One "Reference" tab with sections: Python API, CLI, Configuration, Exceptions. |
| M | 6 | "Home" and "Why Ferro" are each a whole tab for one page. | Fold Why Ferro into "Get started" (Why Ferro, Installation, Quickstart). |
| M | 6, 24 | Same label means different pages: "Migrations" (guide/schema/migrations.md and api/migrations.md), "Testing" (howto/testing.md and guide/schema/testing.md), "Queries", "Relationships", "Transactions", "Raw SQL" in both Guide and API Reference. In search results and breadcrumbs they are indistinguishable. | Name by what the page gives: "Testing with Ferro" vs "Testing migrations"; API pages by object ("Model", "Query", "ferro.migrations"). |
| M | 1, 6 | "Guide" mixes how-to-ish pages with "Using with Postgres RLS", and "How-To" holds "Upgrade Guide" (a version-boundary reference) and "Adopting Migrations..." (which belongs beside Schema Management). | Move Upgrade Guide to Community/Project (next to Changelog); move Adopting Migrations under Schema Management; title RLS "Row-level security". |
| L | 24 | Vague labels: "Overview" (of what), "Alembic" (bridge? migration from?), "Performance", "Next Steps", "Upgrade Guide". | "Schema management overview", "Alembic bridge", "Upgrading between versions". |
| L | 5, 22 | Labels are Title Case ("Models & Fields", "Connections & Databases", "Data Steps and Backfills") while the rule asks sentence case; nav labels and page H1s disagree ("Quickstart Tutorial" vs "Quickstart", "Why Ferro" vs "Why Ferro?", "CLI"). | Sentence case; make nav label = H1. |
| L | 6 | guide/migrations.md is not in nav; it is a deliberate "has moved" redirect page with a JS redirect. Fine, but it is still indexed by search. |
Add search: exclude: true front matter, or use a redirects plugin. |
| L | 6 | "Community" holds Roadmap and Changelog, which are about the product, not the community. | "Project": FAQ, Roadmap, Changelog, Upgrading, Contributing. |
Suggested top level: Get started (Why Ferro, Installation, Quickstart) · Guide (by product area, as now, with Schema management including Adopting) · How-to · Concepts · Reference (Python API, CLI, Configuration, Exceptions) · Project (FAQ, Roadmap, Upgrading, Changelog, Contributing).
docs/pages/getting-started/next-steps.md
- Kind (rule 1): navigation page (link list); not one of the four kinds.
- Running example (rule 3): none.
- Verdict: A second copy of the nav, organised by persona, with Testing listed three times and Pagination twice. It adds little over the nav and the quickstart's own "What's Next". Fold the three persona paths into the quickstart's last section, or keep this page but cut the duplicate lists. C
| Sev | Line | Rule | Finding | Suggested fix |
|---|---|---|---|---|
| M | 15, 32, 38; 14, 39; 31, 42 | rule 1, 6 | Testing appears 3 times, Pagination 2, Multiple Databases 2; "Common Patterns" and "Reference Material" restate the nav. | Keep the three use-case paths; replace the rest with one link each to How-To and API Reference. |
| M | 29-32 | gap | "Production Deployment" omits Installation of the cli extra, ferro migrate, and the CLI/Configuration reference, which are what shipping needs. |
Add CLI reference and Configuration. |
| L | 11-47 | humanizer 19 | Every item is a bold link plus em dash. | Plain link + short clause. |
| L | 54 | rule 24 | "star the repo to follow releases" as the description of a GitHub link. | "Releases on GitHub". |
| L | 56 | humanizer 2 | Closing line "Build something real and reach for the guides above as questions come up." restates nothing new. | Cut. |
| L | 5 | rule 5 | "Learn by Use Case" Title Case. | "Paths by use case". |
Activity
3 remaining items
feat(docs): site configuration fixes and a strict docs build (#701) (#…
docs(get-started): accurate home, README, Why Ferro, installation and…
docs: split the RLS guide into a how-to, an explanation and a referen…
docs: split the migrations guide into the loop, renames and retiremen…
0x054 commentedon Oct 19, 2026
Status: verify-passed
Worker: worker-723 (reviewed by reviewer-723)
Branch:
sdd/723-navigationPR: #749
Verify: passed d1a7219
Review: Spec PASS, Quality PASS (two Minor findings: the repeated "Schema management" label, and the
llmstxt"Start here" section name). Fresh Verify ond1a7219green; trial merge not run (base unchanged). All four declared deviations accepted. Ready for the orchestrator to merge intofeat/docs-rewrite.docs: six-tab nav, page descriptions and redirects for moved pages (#723
0x054 commentedon Oct 19, 2026
Merged in #749 into
feat/docs-rewritetest(docs): enforce the docs guards as gates (#724) (#750)