DataTalksClub / DataTalksClub/website
Finish safe site settings and SEO exceptions; park redirects (umbrella)
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 0
- Forks
- 0
- PR merge metrics
- No merged PRs in 30d
Description
Parent epic: #7
Split children: #187 (site navigation), #188 (sponsors). Accepted and closed slice: #114 (safe site-settings registry, announcement group, Studio + admin-API adapters, tests, deployment evidence).
Original intake title: "Manage navigation, announcements, sponsors, redirects, and safe site settings". This umbrella now tracks only what remains after the accepted #114 slice and the two groomed children.
What already has an owner
| Former umbrella item | Owner | State |
|---|---|---|
| Typed safe site settings registry, Studio/admin-API parity, cache/audit/revision contract | #114 | Accepted, closed, deployed |
| Announcement settings group and public banner | #114 | Accepted, closed, deployed |
| Site primary navigation management | #187 | Groomed, open |
| Sponsor records, public usage, export boundary | #188 | Groomed, open |
| Redirect / 410 records | this umbrella | Parked behind open decision #29 (see below) |
| SEO exception records | this umbrella | Pending #29's exception-approval mechanism (see below) |
Remaining settings groups beyond site.announcement |
this umbrella | Groomed below; sliced per group when a concrete setting is needed |
Normative specs
- 01 — Data ownership: database-owned operational settings, redirect manifest and exceptional URL rules, navigation overrides, announcements, sponsors; secrets never database-backed.
- 02 — URL, link, SEO compatibility: every intentional URL/canonical/metadata change is parity work or an explicit reviewed exception; redirect/retirement records require owner, reason, and test; no catch-all homepage redirect.
- 06 — Studio and admin API: Site section scope; management parity contract; one capability registry; roles; audit model.
- 07 — Security, privacy, operations: secrets stay in the secret store; management surfaces private/no-store; redaction.
- Open decision #18 / issue #29: preservation-first production cutover scope and its exception-approval mechanism.
- #114's accepted contract is the binding precedent for every new settings group: code-owned registry definition, shared query/batch services, capability/role synchronization, Studio + admin-v1 adapters, generated OpenAPI and bidirectional parity checks, uncached public resolution, redacted audit.
Scope
1. Remaining safe site-settings groups
Extend the existing core.configuration.OperationalSettingDefinition registry and core/site_settings.py services group by group, exactly as #114 did for site.announcement. Each new group:
- defines code-owned, immutable, startup-checked definitions (key, group, label, description, type, default, validation, docs reference, lifecycle, cache policy, sensitivity);
- is registered only when a concrete product need names the setting — no speculative settings;
- reuses the one shared query service and one shared batch command service with CAS revisions, actor-scoped idempotency, append-only revisions, and one redacted audit event per changed batch;
- extends Studio
/studio/settingsandGET/POST /api/v1/admin/settingsrather than adding new routes, with regenerated OpenAPI and passingmake check-management-parity; - maps read/write onto the existing
core.read_operational_settings/core.change_operational_settingspermissions and the existing role matrix unless a group genuinely needs narrower authority, which requires its own grooming note in the delivering issue; - keeps only public-safe or safe-indicator values in the database and never secret/bootstrap configuration.
2. SEO exception records (pending #29's mechanism)
The database-owned "exceptional URL rules" from specification 01 are the explicit approved exceptions that #29's acceptance criteria require for the preservation-first cutover: each intentional deviation from exact URL/content/SEO parity needs one reviewed record with exact target, kind (canonical, noindex, metadata, alias), owner, reason, approval evidence, review date, and a test.
This umbrella owns that record family, but its exact workflow (who approves, what evidence is stored, what review cadence applies, and how it maps to the cutover report under #77) must not be invented before the owner accepts #29's preservation-first scope and exception-approval mechanism, or records a replacement. Until #29 resolves, no SEO-exception implementation proceeds; when it resolves, this umbrella's SEO-exception scope is groomed into its own child issue following the #114/#187/#188 pattern before any code.
3. Redirect and retirement records (parked)
Explicit redirect/410 manifest records remain parked behind open decision #29. Specification 02 already fixes their shape in outline — exact source/destination/status, owner, reason, test, loop/chain/homepage-catch-all rejection, one-hop behavior, raw-query preservation — and the current site serves code-owned canonical/alias behavior from the checked route manifests with no database redirect store. Nothing in this umbrella may create a database redirect/retirement record, retire a URL, or change redirect cache classes while #29 is open.
Non-goals
- No reimplementation of anything #114 shipped, no navigation work (owned by #187), and no sponsor work (owned by #188).
- No arbitrary site-settings CRUD, database-authored definitions, environment/Django-setting editor, feature-flag platform, or settings requiring database availability before bootstrap.
- No secret, credential, token, provider, webhook, private-URL, or signing-key value in the registry, database, UI, API, or audit trail.
- No unreviewed redirect, no catch-all homepage redirect, and no redirect analytics while #29 is open.
- No GitHub editorial override: GitHub-owned fields are never silently replaced by database values, and no Studio authoring-to-GitHub workflow is implied here (open decision #12 governs that separately).
- No HTML/script/Markdown injection surface in any value, and no public personalization.
Dependencies
- #114 (closed) is the prerequisite and precedent; #31, #86, #87 (closed) supply the shared primitives; open #107 supplies the development owner/token surface for any new capability's principal reconciliation.
- #29 is a hard gate for the redirect pillar and for finalizing the SEO-exception workflow; #77's release acceptance report is the consumer of SEO-exception records.
- Open #32/#33 and decisions #20/#28 remain production identity/high-risk follow-ups, not implementation blockers, as accepted for #114.
- Open #109 owns any future anonymous-cache classification/invalidation for pages that render database-owned settings values.
Acceptance criteria
- Each newly registered settings group ships as code-owned definitions with schema, validation, ownership, default/source badge, lifecycle, and cache behavior, startup-checked, and is exposed through the existing Studio settings page and admin settings endpoints with regenerated OpenAPI and passing parity checks.
- Each new group reuses the #114 shared services for validation, all-or-none CAS, actor-scoped idempotency, revisions, and redacted audit, with Studio/API parity and role/field permissions proven by tests.
- Security-critical bootstrap and secret values remain environment/Secrets-Manager-only and are provably absent from the registry, adapters, API responses, and audit trail.
- SEO-exception records (once #29 records the owner's mechanism) require exact target, kind, owner, reason, approval evidence, review date, and a passing test, and reject undefined or catch-all targets.
- Redirect/410 work stays parked while #29 is open; no database redirect record, URL retirement, or redirect cache-class change lands under this umbrella before that decision.
- Cross-process visibility, fail-closed public behavior, and negative/security tests for every new group follow the #114 evidence bar.
Test scenarios
- Per new settings group: definition registry checks, default/override resolution, type/length/control/markup validation, unknown or partial batches, stale CAS, idempotent replay, audit redaction, and next-request public visibility across processes.
- SEO exceptions (after #29): approved and unapproved deviations, missing owner/reason/test, expired review, and their appearance in the cutover report's exception list.
- Parked-redirect guard: any redirect-shaped change attempted under this umbrella fails review; existing code-owned alias/canonical behavior is unchanged.
Browser scenarios
Per delivered settings group, at 1440x900 and 390x844: manage and verify the group in /studio/settings, observe the public effect on the next request, and cover empty, error, stale, and denied states with screenshots under .tmp/screenshots/. SEO-exception and redirect browser work is not applicable while those pillars are parked.
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by reading accepted issue #114 and the referenced specifications, then check open decision #29. No implementation is ready while the SEO and redirect work is gated and no concrete settings group is named. Done requires a groomed child issue for a specific settings group or the approved mechanism for the deferred records.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- api, backend, database, documentation, security
- Issue type
- Feature
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Active
- Clarity
- Needs clarification
- Newbie friendliness
- 25/100