DataTalksClub / DataTalksClub/website

Project normalized Podwiki pages onto canonical /wiki routes

Open
#43 3 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

content enhancement frontend integration P0 security seo testing
Dominant language
Python
Stars
0
Forks
0
PR merge metrics
No merged PRs in 30d

Description

Parent epic: #4
Source-normalization child: #294
Downstream search/graph owner: #44

Normative authority:

Product outcome

Serve the accepted normalized Podwiki page corpus as the sole public Wiki family at /wiki, preserving typed chips, aliases, citations, timestamp labels, tags, related pages, heading/hash deep links, git-derived SEO fields, and canonical links to mirrored Podcast, Person, and Book records.

The source repository and adapter may retain the Podwiki name for provenance. Public readers, metadata, links, assets, forms, sitemap/feed/graph/search entry points, and generated URLs use /wiki only.

Current baseline and lifecycle disposition

Current website origin/main is face8e4808d65afbf0374d1ced7a88079950d663. It already serves a checked 282-page Wiki projection at /wiki, a 1,072-node / 13,006-link checked graph, and a 2,998-document checked search corpus from DataTalksClub/podwiki@988b79d0d655bf4755945c3118544cb9e0dbead6. Current tests correctly require /podwiki* to be an ordinary unredirected 404.

That is characterization evidence, not completion of the source-adapter-to-public-projection lifecycle. There is no #43 engineer handoff, independent tester PASS/screenshots, PM acceptance, focused commit, merge, or on-call evidence.

#43 is groomed but dependency-blocked. Engineering must not start until accepted/integrated #294 supplies typed route-neutral records, accepted/integrated #40 supplies the exact canonical Person resolver, and accepted/integrated #253 supplies the reproducible Podcast/Book/public-projection source envelope.

Ownership boundary and resolved dependency cycle

  • #294 owns bounded network-free source parsing and typed route-neutral page/relation/graph/search seed normalization. It emits opaque mirrored entity keys and no website mount.
  • #43 owns mapping normalized pages and relations onto public /wiki identities, checked/read-model page output, canonical mirrored links, exact public routes/metadata, templates, and browser behavior. It does not build a search index or public graph projection.
  • #44 is downstream of #43. It owns search documents/indexing/ranking, graph/link projection, query/filter backend behavior, cross-source projection validation, failure/fallback, parity measurement, and any eventual Lambda retirement. #43 does not depend on #44.
  • Until #44 is accepted, the existing checked wiki_search.json and wiki_graph.json remain the unchanged active compatibility fallback. #43 may validate and consume those interfaces but must not regenerate, re-rank, activate, or weaken them.
  • #38 later consumes accepted source/projection contracts for direct-sync and public-authority cutover. It is not a prerequisite for this offline checked projection lane, and #43 introduces no staged activation or direct-sync behavior.

This establishes the acyclic sequence #294 → #43 → #44; #40 and #253 provide canonical cross-source identities to #43.

Exact public route contract

  • GET/HEAD /wiki is the canonical hub and query-search surface. /wiki/ is the sole approved hub alias and redirects permanently in one hop to /wiki, preserving the raw query.
  • Exact editorial details are /wiki/<slug>, including the real editorial slug /wiki/search. Query search remains on /wiki?q=...; it must never capture or replace the /wiki/search detail.
  • Reviewed public endpoints remain directly beneath the canonical family: /wiki/graph, /wiki/graph/graph.json, /wiki/search-corpus.json, /wiki/special-pages, the reviewed special-page category paths, /wiki/feed.xml, /wiki/sitemap.xml, /wiki/robots.txt, and /wiki/assets/<reviewed-asset>.
  • Canonical, alternate, Open Graph, Twitter, JSON-LD, breadcrumbs, navigation, forms, content relations, search/graph URLs, sitemap/feed, and asset URLs emit /wiki directly. No generated response contains a /podwiki destination.
  • /podwiki, /podwiki/, every nested or extension-bearing path beneath that family, and encoded attempts to reach it are absent and return a real 404: no redirect, Location, compatibility map, canonical, soft-404/homepage fallback, or public-path claim.
  • Unknown Wiki slug/asset/extension routes fail closed under the shared public 404/method/cache contract; route matching must not turn unknown extension-bearing endpoints into editorial pages.

Scope

  • Consume #294's exact typed normalized pages/occurrences and canonical resolvers; do not reparse source Markdown, infer entity identity from labels/names/URLs, or run source repository code.
  • Produce deterministic public page/read-model records with exact /wiki/<slug> identity, safe rendered blocks, stable heading fragments, ordered typed relations, canonical mirrored entity destinations, source/git-date SEO values, and complete provenance.
  • Preserve every accepted public page, fragment target, visible alias/citation/timestamp label, tag/type catalogue, related link, and mirrored canonical link or fail the complete build with a bounded diagnostic.
  • Serve the hub, details, special-page catalogues, feed/sitemap/robots/assets, and the existing search/graph presentation endpoints under the exact route contract above.
  • Ordinary public Wiki templates extend templates/core/content_page.html; that parent owns the document shell, masthead/footer, cream/yellow header surface, lavender content surface, and normal .content-shell width. A page-specific .shell-breakout requires a documented genuine width need.
  • Preserve progressive enhancement, semantic reading order, keyboard access, focus visibility, reduced motion, dark mode, responsive reflow, and the approved site headings. Events and Community knowledgebase are correct copy and must not be reverted to stale regression expectations.

Explicit non-goals

No source parsing/token grammar (#294); search-document/index/ranking implementation, graph construction, type-filter engine, projection activation/fallback, or parity threshold (#44); direct-sync schema/runner/webhook/reconciliation/public cutover (#38 and children); source edit or GitHub write; Person inference/account linking; search UX redesign; new route family; /podwiki redirect; Lambda retirement; Studio/admin API; provider/production access; unrelated homepage redesign; commit, push, merge, or deployment during grooming.

Acceptance criteria

  • The complete accepted #294 page corpus projects deterministically to 282 unique canonical /wiki/<slug> pages with source commit/tree/checksum provenance; two clean supported generations are byte-identical and no source parser is duplicated in this layer.
  • Every accepted typed chip/alias/citation/timestamp/tag/related-page occurrence is represented in page content or its explicit typed relation model without source-order loss or identity inference; every accepted heading/search fragment resolves exactly once.
  • Mirrored Person, Podcast, and Book keys resolve only through accepted exact canonical resolvers to /people/<short>.html, the accepted Podcast canonical, or /books/<slug>.html; missing, duplicate, ambiguous, case-folded, label-derived, or unsafe targets fail before publication.
  • The exact route contract above passes for GET and HEAD, canonical/metadata/link generation, query preservation on the sole hub alias, methods, cache/robots behavior, unknown routes, the /wiki/search editorial detail, and all reviewed machine/asset endpoints.
  • /podwiki, /podwiki/, nested paths, encoded variants, query-bearing variants, graph/search/asset lookalikes, and unsafe methods are never mounted or redirected and receive the required true denial without a canonical or destination leak.
  • The hub, detail, special-page, graph, and search presentation remain usable at desktop/mobile with JavaScript on and off, keyboard-only operation, visible focus, reduced motion, light/dark mode, long Unicode text, empty/zero-result states, and no horizontal document overflow.
  • Every ordinary Wiki page uses the shared content_page.html shell without duplicating the document shell, masthead/footer, or normal width; any graph breakout is narrowly justified and responsive.
  • The existing checked search/graph artifacts remain byte-identical and active as the compatibility fallback; #43 does not change ranking, filter semantics, graph construction, activation, or Lambda behavior. Contract fixtures and public identity output are handed to #44.
  • No rendered internal URL, metadata value, sitemap/feed entry, graph/search entry point, or asset reference contains /podwiki; no unknown route becomes a soft 200 or redirect.
  • A current change-selective plan, uv-backed format/lint/type/migration checks, focused Django/integration/security tests, graph-selected full Playwright evidence, independent tester screenshots/PASS, and PM acceptance exist before commit.

Required Django/integration scenarios

  1. Build twice from the frozen #294 output with exact accepted #40/#253 resolvers; compare page/read-model bytes, order, path/fragment inventory, relations, metadata, provenance, and public route manifest.
  2. Cover the canonical hub, /wiki/ raw-query one-hop alias, representative concept/guide/comparison/roadmap/transition/how-to details, the /wiki/search editorial slug, special-page categories, feed/sitemap/robots, graph/search JSON entry points, and the reviewed asset.
  3. Cover all typed relation kinds, visible aliases, timestamped citations, repeated occurrences, Unicode, headings/deep links, mirrored canonicals, and source-derived dates; reject unresolved/ambiguous/malformed/unsafe relations and fragments with no partial output.
  4. Assert true 404/no-redirect/no-canonical behavior for /podwiki, /podwiki/, several nested endpoints, encoded mount attempts, query-bearing attempts, unknown Wiki slugs/assets/extensions, and case/trailing-slash variants not explicitly accepted.
  5. Prove existing checked search/graph bytes and query/provider behavior are unchanged, public requests perform no source/network mutation, and no account/MemberProfile/Studio/API/direct-sync/provider/production side effect is introduced.

Playwright and screenshot matrix

The independent tester captures and reads graph-selected screenshots beneath .tmp/screenshots/ for at least:

  1. /wiki at desktop and mobile, JavaScript on and off, including the canonical search form, exploration links, catalogue/pagination, and the approved Community knowledgebase navigation copy;
  2. representative untagged and typed /wiki/<slug> details at desktop/mobile, including chips, visible alias/citation/timestamp content, related links, long prose, and a hash deep link after direct navigation/reload;
  3. /wiki/search as the editorial detail and /wiki?q=<representative> as query search, plus empty, zero-result, Unicode, and escaped malicious input states, without changing #44-owned ranking/filter semantics;
  4. /wiki/special-pages and one category at desktop/mobile;
  5. /wiki/graph at desktop/mobile and JavaScript-off, including keyboard-accessible semantic fallback and one encoded graph hash/deep-link state; and
  6. representative /podwiki* and unknown Wiki denials, visually confirming the real site 404 rather than a redirect, debug page, or soft homepage.

Across the selected states, assert correct final URL/status/title/canonical, no /podwiki link, no broken asset/error page, no document overflow at the selected desktop/mobile widths, logical focus order, visible focus, touch-target geometry, reduced-motion behavior, and light/dark contrast. Screenshots are mandatory because routes/templates/rendered content change.

Dependencies and sequencing

  • Satisfied: #24, #35, and #37.
  • Hard prerequisites: accepted/integrated #294, #40, and #253 on a clean reproducible baseline.
  • Not prerequisites: #38 and #44. #38 later consumes the accepted source/public contract; #44 is explicitly downstream and consumes #43's public identity and compatibility fixtures.
  • Any source pin/tree, canonical resolver, public route manifest, checked search/graph artifact, template shell, or accepted source/projection digest change after the engineer plan invalidates the handoff and returns it to PM.

Lifecycle

This body supersedes the stale /podwiki/ scope and stale #43↔#44 cycle. All acceptance boxes remain unchecked. After the hard prerequisites close and a clean current base is available, assign one engineer in an isolated worktree. The engineer leaves an uncommitted frozen handoff; a separate tester runs the exact plan, full applicable Playwright tier, and screenshot matrix; PM accepts only after tester PASS. Only then may a focused commit with Closes #43 be created and locally merged through the repository process.

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Do not begin implementation until #294, #40, and #253 are accepted and integrated. Read the listed normative specs, AGENTS.md, and templates/core/content_page.html, then inspect the accepted #294 output and existing checked Wiki projection. Done means the exact /wiki route contract, deterministic page projection, focused Django/integration/security checks, Playwright evidence, and required independent acceptance all pass.

Written by the indexing model from the issue text.

Assessment

Tech stack
django, playwright, python
Domain
backend, frontend, full-stack, testing
Issue type
Feature
Difficulty
5/5
Estimated time
Over a week
Activity status
Active
Clarity
Mostly clear
Newbie friendliness
25/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.