Skip to content

Project pages: FAQ, roadmap, contributing and changelog #706

Closed

Description

@0x054

Parent

#698

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_checks reports 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.md is 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

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 raise an owned example's error check expects makes that example's test fail.
  • Edge case: python -m tests._docs_checks over the owned files exits 0; renaming one lambda parameter to t makes 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.md

Blocked by

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, Post ad 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

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.md has 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.md verbatim; 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.

Activity

  1. added
    documentationImprovements or additions to documentation
    ready-for-agentUnblocked and fully specified; an agent may claim it
    size:SOne context window, <= 3 files; cloud-eligible
    on Oct 19, 2026
  2. added theissue type on Oct 19, 2026
  3. self-assigned this
    on Oct 19, 2026
  4. 0x054 commented on Oct 19, 2026

    @0x054
    ContributorAuthor

    Status: verify-passed
    Worker: sdd worker (reviewed by reviewer-706)
    Branch: sdd/706-project-pages
    PR: #731
    Verify: passed eefec9d

    Review posted on #731: Spec PASS, Quality PASS, Minor findings only.
    Trial merge into feat/docs-rewrite at 4e49af3 passed (248 tests, strict build clean).

  5. 0x054 commented on Oct 19, 2026

    @0x054
    ContributorAuthor

    Merged in #731 into feat/docs-rewrite

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

documentationImprovements or additions to documentationready-for-agentUnblocked and fully specified; an agent may claim itsize:SOne context window, <= 3 files; cloud-eligible

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions