Repository navigation
Project pages: FAQ, roadmap, contributing and changelog #706
Copy link
Copy link
Closed
Labels
documentationImprovements or additions to documentationImprovements or additions to documentationready-for-agentUnblocked and fully specified; an agent may claim itUnblocked and fully specified; an agent may claim itsize:SOne context window, <= 3 files; cloud-eligibleOne context window, <= 3 files; cloud-eligible
Description
Parent
What to build
The FAQ answers match the code (eager loading exists as include(); the raw SQL answer points at the Raw SQL page). The contributing page and CONTRIBUTING.md state the license in LICENSE (Apache 2.0) and link only to channels that exist (GitHub Discussions is turned off; the old docs URL is gone). The roadmap lists only work not yet shipped. The changelog page embeds CHANGELOG.md unchanged (I-10) and its #NNN references link through magiclink.
Pages: faq.md, roadmap.md, contributing.md, changelog.md
Acceptance criteria
- Every fact on the page matches the code at the time of the PR; each High finding in the audit rows below is fixed, and each Medium/Low finding is fixed or answered in the PR body with the reason it was left.
- Each page is one kind (tutorial, how-to, reference or explanation) and opens with one sentence saying what it covers, then an example on the first screen (writing-for-humans rules 1–2).
- Each page uses one running example, declared once near the top and reused; each section shows only what changed (rule 3).
- Every code block has a lead-in sentence ending in a colon and a result sentence after it, and shows its result: printed output, or the asserted value inside the embedded snippet range (rules 7–8). Snippet
end:markers sit below the assert or print that holds the result. - Every copyable block either shows the
async with engines.session():wrapper or sits under a sentence that says it runs inside one and links to Connections › Sessions; the page's first block shows the wrapper. - Every inline Python block that does real work runs under the harness (
{test=run prelude=<name>}) or moves into an example script; a block left compile-only says why in its fence marker. - Every lambda passed to a query method names its parameter after the model in lowercase singular (AGENTS.md I-8);
python -m tests._docs_checksreports no violation for the owned files. - Every error check in an owned example fails when the expected error is not raised (
try/except/else: raise AssertionError, or the harness helper). - Field-declaring examples show both declaration styles as tabs, each backed by a runnable script (AGENTS.md I-7), and the twins use the one Annotated idiom recorded in the docs conventions.
- Headings are short sentence-case noun phrases naming the feature (rule 5); how-to titles name the goal (rule 24); no minimising words (rule 17); admonitions follow rule 20.
- No ADR numbers, issue numbers, codenames, dated or release-bound notes, or contributor-only references in page text; version markers are self-contained blocks at the end of a section.
- Reference material that has a home in Reference is linked, not repeated; each topic ends with a pointer to its reference entry (rule 4).
-
CHANGELOG.mdis not edited (I-10). - No link on these pages returns 404 (checked by hand in the PR body with the list of external links).
Files owned
- Modify:
docs/pages/faq.md,docs/pages/roadmap.md,docs/pages/contributing.md,docs/pages/changelog.md,CONTRIBUTING.md
Interfaces
- Consumes: I-14 and the docs conventions notes (AGENTS.md ticket (AGENTS.md: rewrite I-8 for the lambda-only query API, add a docstring invariant, record the docs conventions #703))
- Consumes: magiclink and the strict build (site config ticket (Docs site config: Zensical features, Markdown extensions, API reference options and a strict build #701))
- Produces: nothing other tickets rely on
Test scenarios
- Happy path: the strict site build succeeds and every snippet range on the owned pages renders without leading indentation.
- Happy path: every owned example script runs to completion under
tests/test_docs_examples.py, and every inline block marked{test=run ...}runs. - Error path: deleting the
raisean owned example's error check expects makes that example's test fail. - Edge case:
python -m tests._docs_checksover the owned files exits 0; renaming one lambda parameter totmakes it exit 1 naming the file and line.
Verify
uv run --no-sync zensical build --clean --strict
uv run --no-sync pytest tests/test_docs_examples.py -q --no-cov -p no:cacheprovider -n 8
uv run --no-sync python -m tests._docs_checks docs/pages/faq.md docs/pages/roadmap.md docs/pages/contributing.mdBlocked by
- Docs site config: Zensical features, Markdown extensions, API reference options and a strict build #701, AGENTS.md: rewrite I-8 for the lambda-only query API, add a docstring invariant, record the docs conventions #703
Audit findings
Rows from the docs audit this ticket covers (file, line, rule, fix)
docs/pages/faq.md
- Kind (rule 1): mixed: explanation + troubleshooting how-to; FAQ format.
- Running example (rule 3): none (
User,Job,Postad hoc). - Verdict: Mostly accurate and readable, but one answer is now wrong (eager loading), one link is dead (Discussions is disabled on the repo) and one links the wrong page. The Troubleshooting section is a how-to and would serve better as its own page keyed by error message. B after the H fixes.
| Sev | Line | Rule | Finding | Suggested fix |
|---|---|---|---|---|
| H | 68-70 | stale fact | "Does Ferro have eager loading? Not yet". Query.include() populates forward-FK relations in one statement (builder.py:958; guide/queries.md "Populating Relations with include()"). Only reverse/M2M population is missing. |
"Forward foreign keys: yes, include(lambda post: post.author). Reverse and many-to-many collections: not yet, see Roadmap." |
| H | 105 | broken link | "GitHub Discussions" link: gh api repos/syn54x/ferro-orm --jq .has_discussions returns false. |
Remove, or enable Discussions. Same dead link in CONTRIBUTING.md:344. |
| M | 66 | link | Raw SQL answer links to Queries; there is a dedicated guide/raw-sql.md. |
Link guide/raw-sql.md. |
| M | 39 | accuracy | "Two doors, one per database": the doors are per workflow, not per database. Also omits the Alembic bridge as a third. | "Two ways, plus a bridge:" |
| M | 41 | humanizer 16 | "Great for tests and development." | "Use it in tests and development." |
| M | 5-105 | rule 5 | All headings are questions (FAQ convention). Acceptable for a FAQ, but the troubleshooting entries are already keyed by error text and would be findable as a "Troubleshooting" page with headings like "Engine not initialized". |
Split Troubleshooting out; keep FAQ headings short. |
| L | 13 | rule 14 | "Well suited to new projects..." has no subject. | "Ferro suits new projects..." |
| L | 7, 31, 35, 66, 76 | humanizer 8 | Em dashes. | Commas/colons. |
docs/pages/roadmap.md
- Kind (rule 1): reference (list of known gaps) with workarounds.
- Running example (rule 3): none.
- Verdict: Accurate (PRD: Static typing for shadow FK columns and relation traversal #290,
feathaving(): post-aggregation group filtering #291,featCross-scope correlation in existence tests (deferred from ADR-0007) #309 are open;disconnect(),ilike(),check_connection()absent;PoolConfighas onlymax_connections/min_connections). Clear and short. A-/B
| Sev | Line | Rule | Finding | Suggested fix |
|---|---|---|---|---|
| M | 12 | rule 1 | "Richer update recipes" opens with what already works (+/-, now, .merge()) before the gap. |
Lead with the gap: ".concat(), * and / in update recipes. Today: load, modify, save(), or raw SQL." Move the "already works" part to the mutations guide link. |
| L | 9 | rule 15 | One 70-word bullet with a parenthetical aside. | Split: gap, workaround, related feature. |
| L | 11, 17 | rule 22 | ilike() and health checks have no issue links, unlike the others. |
Link issues or note "no issue yet". |
| L | 5, 14, 20 | rule 5 | Title Case ("Query Features", "Influencing Priorities"). | Sentence case. |
docs/pages/contributing.md (+ CONTRIBUTING.md)
- Kind (rule 1): how-to.
- Running example (rule 3): n/a.
- Verdict: The wrapper is fine, but the included
CONTRIBUTING.mdhas a wrong license, a dead Discussions link, an old docs URL, a stale project tree, and omits the repo's own PR rules (AGENTS.md,Closes #N). C
| Sev | Line | Rule | Finding | Suggested fix |
|---|---|---|---|---|
| H | CONTRIBUTING 348 | stale fact | "licensed under the same license as the project (Apache 2.0 OR MIT)". LICENSE is Apache 2.0 only; README and FAQ say Apache-2.0. |
"(Apache 2.0)". |
| H | CONTRIBUTING 344-345 | broken link | GitHub Discussions disabled; docs URL https://syn54x.github.io/ferro-orm is the old site (site_url is https://ferro-orm.x54.sh/). |
Remove Discussions; update URL. |
| M | CONTRIBUTING 320-338 | stale fact | Project tree lists src/ferro/queries.py (now src/ferro/query/) and omits crates/ (ferro-ddl-lowering, ferro-migrate, ferro-schema-ir) and docs/examples/. |
Regenerate the tree. |
| M | CONTRIBUTING 193-228 | gap | PR process omits AGENTS.md invariants, I-9 (Closes #N in the PR body), I-10 (never edit CHANGELOG.md), and the docs rules I-7/I-8. Step 7 "Merge once approved!" |
Add a "Project rules" section linking AGENTS.md; state the Closes #N and changelog rules. |
| M | CONTRIBUTING 5 | humanizer 22 | "We welcome contributions to Ferro! This guide will help you get started..." | "To develop Ferro locally you need Python 3.13+, a Rust toolchain and uv." |
| L | contributing.md 3 | humanizer 25 | "The guide below is the canonical contributor reference from the repository." describes the page. | Cut. |
| L | CONTRIBUTING 224-228 | humanizer 20 | Checklist with ✅ emoji per item. | Plain list. |
docs/pages/changelog.md
- Kind (rule 1): reference (generated).
- Running example (rule 3): n/a.
- Verdict: Includes
CHANGELOG.mdverbatim; generated by release tooling and must not be hand-edited (I-10). A
| Sev | Line | Rule | Finding | Suggested fix |
|---|---|---|---|---|
| L | CHANGELOG 1 | rule 5 | H1 "CHANGELOG" in caps. | Change via semantic-release template config, not by hand. |
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
documentationImprovements or additions to documentationImprovements or additions to documentationready-for-agentUnblocked and fully specified; an agent may claim itUnblocked and fully specified; an agent may claim itsize:SOne context window, <= 3 files; cloud-eligibleOne context window, <= 3 files; cloud-eligible
Activity
0x054 commentedon Oct 19, 2026
Status: verify-passed
Worker: sdd worker (reviewed by reviewer-706)
Branch:
sdd/706-project-pagesPR: #731
Verify: passed eefec9d
Review posted on #731: Spec PASS, Quality PASS, Minor findings only.
Trial merge into
feat/docs-rewriteat 4e49af3 passed (248 tests, strict build clean).docs: project pages, FAQ, roadmap, contributing and changelog (#706) (#…
0x054 commentedon Oct 19, 2026
Merged in #731 into
feat/docs-rewrite