Repository navigation
WEB-SUGGESTIONS-001A — Add a static Suggestions page with no page-level intake #618
Description
Outcome
Add a simple public /suggestions information page that helps members and community visitors share short ideas through the club's existing Contact page.
This first slice adds no Suggestions form or suggestion-content submission. It adds no text field, upload, Firebase write, Google Form, suggestion-specific analytics or service call, public idea feed, voting, or new outside provider. The linked Contact page is a separate existing email channel and may retain the sender's address and message.
Current claim
#617 is COMPLETE/CLOSED/CLAIM RELEASED after independent readback proved that the exact bounded #473 artifact is production again. /root claimed this source-only slice at 2026-08-13T05:32:50Z from exact main 3af585077d665d7720b35b5b89505b1d90d9a007. The amended claim owns only the 16 paths/hunks below and does not authorize website publication.
Why this matters
The website has a general Contact page, but no clear place for someone who has an idea about club runs, events, communications, accessibility, or the website. A short Suggestions page makes that purpose easy to find while keeping the first version small enough for officers to understand and operate.
The club has not approved a data-retention, moderation, spam, access, or response workflow for a new Suggestions form. Reusing the existing Contact page avoids inventing a new intake store or provider.
Plain-language behavior
- A visitor opens
/suggestions. - The page explains the kinds of short ideas the club welcomes.
- The page says not to include passwords, private codes, payment details, private member information, health information, emergency-contact information, or vulnerability evidence.
- The page states that it contains no Suggestions form and makes no suggestion-specific service call.
- One internal link opens the existing
/contactpage. - The page explains that sending a Contact message uses the existing email channel, where the message and sender address may be retained.
- The page does not promise anonymity, confidentiality, a reply, or implementation.
- For a security or privacy concern, the page summarizes the current first-contact boundary: use Contact, label the message
security report, ask for a secure reply, and keep secrets, private records, payment references, and exploit details out of an ordinary suggestion.
Exact source scope
Sixteen paths only:
- New
src/pages/suggestions/Suggestions.jsx: one accessible page, normal SEO title/description/canonical/suggestions, safety wording, and internal Contact link. - New
src/pages/suggestions/suggestions.css: narrow responsive content/CTA styles with a visible:focus-visiblestate. src/App.jsx: add only the/suggestionsroute/import.src/components/Footer.jsx: add only the Suggestions link. Keep the already crowded primary navigation unchanged.src/App.test.jsx: one separately namedWEB-SUGGESTIONS-001Aactual-route/footer/SEO/no-form block.public/index.html: add onlyreact-helmet-asyncownership markers to the existing title, description, keywords, Open Graph, Twitter, and canonical fallback tags so a rendered route replaces rather than duplicates them; all values and every other tag remain unchanged.scripts/generate-sitemap.js: add only/suggestionstoSTATIC_PAGES.public/sitemap.xml: add exactly one checked-in/suggestionsentry while preserving every existing entry andlastmodvalue byte-for-byte.tests/test-artifact-safety.test.js: one separately named sitemap-generator fixture/assertion proving exactly one Suggestions URL without unrelated generated-date churn..github/lint-baseline.json: only the generated scan-file count,.jsxcount, Suggestions clean-file entry if emitted, and derived fingerprint.tests/ci-workflow.test.js: onlyEXPECTED_LINT_FILES(expected 118 to 119 if the new page is clean).docs/CONTENT_GUIDE.md: identify the page source, approved copy boundary, and existing Contact-channel distinction.docs/officers/SYSTEM_MAPS.md: add the public page and its internal Contact-only flow to the Mermaid map and one-sentence text alternative.docs/officers/UPDATE_PUBLIC_CONTENT.md: one separately named no-form Suggestions source/preview procedure with purpose, approver, prerequisites, one-action steps, expected result, stop conditions, proof, undo, and escalation.SECURITY.md: only the existing RISK-035 lint-inventory sentence and matching source-ledger sentence, updating 118 files / 34 JSX to 119 files / 35 JSX while preserving 113 errors / 6 warnings.OPERATIONS_RUNBOOK.md: only the existing frontend-lint inventory paragraph with the same derived count update.
Preserve docs/officers/EVENTS_SHOP_MEMBERS.md byte-for-byte.
Required tests
- Direct navigation renders one accessible Suggestions heading.
- A realistic static-shell render exposes exactly one expected title, description, canonical
/suggestionsURL, Open Graph URL, and Twitter URL. - The page exposes one internal Contact link and no external form URL.
- No
form, textbox, upload, submit control, suggestion-specific analytics hook, or page-specific service call is introduced. - Safety wording covers credentials/codes, payment details, private member information, health information, emergency contacts, and vulnerability evidence without echoing example secrets or personal data.
- The Contact-channel disclosure does not promise anonymity, confidentiality, reply, or implementation.
- The footer exposes the Suggestions route; the primary Navbar is unchanged.
- The checked-in sitemap and generator each include exactly one
/suggestionsstatic entry. - Sitemap work preserves every unrelated checked-in URL/date byte-for-byte.
- The lint ledger remains truthful at 119 scanned files / 113 errors / 6 warnings if direct ESLint confirms the new page is clean.
- Existing route, footer, lint, build, SPA, workflow, and repository-safety tests remain green.
Explicit exclusions
- Native form, Firebase Function, Firestore collection/Rules/index, email Function, Google Form, Sheets, Drive, Slack, voting, comments, attachments, moderation dashboard, or notification.
- Any new suggestion-specific collection of name, email, phone, UID, IP address, user agent, analytics, or suggestion content. Ordinary host/network behavior remains unchanged and unverified.
- New mailbox address or direct
mailto:link; reuse the existing Contact page. - Primary Navbar or
src/data.jsxchanges. - Privacy/Terms policy decisions, retention/deletion/export decisions, legal promises, intellectual-property terms, response-time promises, or provider configuration.
- Packages, lockfiles, workflows, deployment, production data, or live publication.
- A claim that OPS-SEC-001 — Establish private security/privacy reporting and rehearse incident response #112 has established a dedicated incident channel; only mirror the current temporary SECURITY instructions.
- Active OAUTH-001A2L — Bound Strava activity/statistics JSON and cancel the unread statistics body #616, coordinating parent MEMBERS-DIRECTORY-001 — Add a private opt-in officer photo directory #504, and draft PR Rollback: prepare exact pre-header Netlify artifact #462 paths/hunks.
Future form dependency
Any later native form or outside-provider link requires a separate issue after:
- DATA-001B — Inventory personal data and approve a minimization/retention matrix #110 approves purpose, fields, access, vendor, retention, deletion, backup, and export handling;
- OPS-SEC-001 — Establish private security/privacy reporting and rehearse incident response #112 establishes a separate monitored security/privacy reporting path;
- named communications and backup officers own triage and account recovery;
- the club chooses public versus verified-member access and a spam/abuse model;
- the public privacy notice truthfully describes the new collection.
Acceptance evidence
- Exact source diff and synthetic tests.
- Independent accessibility, privacy/no-page-intake, and backup-officer reviews.
- Hosted pull-request CI and exact-main CI.
- Separate evidence for source changed, tests passed, merged, website published, and
runmprc.comverified.
Officer impact: Visitors gain a clearer path for short ideas. Any email still uses the existing Contact mailbox. This slice assigns no mailbox owner, response deadline, or moderation duty and creates no new Suggestions dashboard, mailbox, provider, form, or stored suggestion record. The officer procedure explains how to review the page and distinguish it from a real intake system.
Officer documentation: docs/CONTENT_GUIDE.md, docs/officers/SYSTEM_MAPS.md, and one separately named procedure in docs/officers/UPDATE_PUBLIC_CONTENT.md. docs/officers/EVENTS_SHOP_MEMBERS.md stays unchanged because this slice changes no event, shop, member, or payment process.
Deployment evidence: None at issue correction or claim. Source, tests, merge, website publication, and live verification remain separate; this issue authorizes no production publication.
Activity
daliu commentedon Aug 13, 2026
PUBLISHED as a dependency-clear, unassigned
status:readyissue. This creation is NOT A CLAIM and no branch or source edit exists. It is queued behind the already active #571 outcome. Any claimant must re-read live issue/PR/branch ownership, post an exact timestamped claim before editing, preservedocs/officers/EVENTS_SHOP_MEMBERS.mdbyte-for-byte, and keep a future form/provider as a separate owner-approved issue.[-]WEB-SUGGESTIONS-001A — Add a static no-collection Suggestions page[/-][+]WEB-SUGGESTIONS-001A — Add a static Suggestions page with no page-level intake[/+]daliu commentedon Aug 13, 2026
SCOPE/TRUTH CORRECTION — NOT A CLAIM (2026-08-13T00:00Z): independent route, privacy, lint, sitemap, and backup-officer audits expanded the exact review boundary to 13 paths and corrected the page-level data statement. The proposed page itself has no Suggestions form, suggestion-content submission, new store/provider, or suggestion-specific service call; following Contact uses the existing email channel and may retain the sender address/message. The scope now includes derived lint metadata, a named sitemap-generator safety test, exact checked-in sitemap preservation, and the affected UPDATE_PUBLIC_CONTENT officer procedure/map. Issue status is blocked-owner behind active #617: no assignment, branch, source edit, push, PR, preview, or live action may begin until #617 posts COMPLETE/CLOSED/CLAIM RELEASED and current ownership is re-read. Future real intake remains separately gated by #110/#112. Creation and this correction are not claims.
daliu commentedon Aug 13, 2026
CLAIMED by /root at 2026-08-13T05:32:50Z on branch
codex/issue-618-suggestions, exact released base3af585077d665d7720b35b5b89505b1d90d9a007.Exact ownership is the 13 paths/hunks listed in the corrected issue body: new Suggestions component/style; route/Footer/App-test blocks; exact generator/checked-in sitemap additions; named artifact-safety fixture; derived lint scan metadata and EXPECTED_LINT_FILES only; CONTENT_GUIDE; public-page SYSTEM_MAPS map/text; and one no-form UPDATE_PUBLIC_CONTENT procedure.
docs/officers/EVENTS_SHOP_MEMBERS.md, Navbar/data, packages/locks/workflows, Functions/Rules, providers/configuration, production data, and every other hunk remain immutable.#617 is COMPLETE/CLOSED/CLAIM RELEASED with exact #473 production restored. #616 owns only Functions Strava files plus its separate SECURITY row; #504 is a coordination parent without a file claim; draft PR #462 owns two disjoint rollback files. No duplicate issue, PR, or branch was found. No source edit, branch, push, PR, preview, provider, data, or live action preceded this marker. The claim remains active through exact-head reviews/CI, merge, exact-main CI, deployment-truth audit, closure, and explicit release.
daliu commentedon Aug 13, 2026
CLAIM SCOPE AMENDMENT — 2026-08-13T05:36Z, before root-document edits: #618 additionally owns only (1) the existing RISK-035 lint-inventory sentence plus matching source-ledger sentence in
SECURITY.md, and (2) the existing frontend-lint inventory paragraph inOPERATIONS_RUNBOOK.md. The new finding-freeSuggestions.jsxchanges the generated truth from 118 files / 34 JSX to 119 files / 35 JSX while preserving 113 errors / 6 warnings; leaving the authoritative root counts at 118 would be false. No other SECURITY row, runbook paragraph, lint rule/finding/count, root document, workflow, package, provider, data, or live hunk is claimed. Exact scope is now 15 paths. The existing #616 SECURITY row is separate and immutable. RED proof before implementation: named App block 2 intended failures, named sitemap test 1 intended failure; test-only binary diff SHA-256a8c9a75432aadd09dd53acc5de40d6345590532a9c6a2821828a1e24b9d7d16d.daliu commentedon Aug 13, 2026
SEO SHELL SCOPE AMENDMENT — 2026-08-13T06:02:25Z, before
public/index.htmledit: independent real-browser review found that the static shell home description/canonical/Open Graph tags remain alongside Helmet route tags, so/suggestionspresents conflicting home and Suggestions SEO even though jsdom passes. #618 additionally owns onlypublic/index.htmlattributes on the existing Helmet-managed static title/description/keywords, Open Graph, Twitter, and canonical tags soreact-helmet-asyncreconciles rather than duplicates them. The already claimed App test block may add a realistic static-shell fixture and exact-one description/canonical/OG URL assertions. All visible home copy, JSON-LD, non-Helmet meta, scripts, routes, packages, and every other index hunk remain immutable. Exact scope is now 16 paths. No index edit preceded this marker.daliu commentedon Aug 13, 2026
PR #620 is open from exact reviewed head da87c25 on unchanged base 3af5850. Exact tree a746c0e50c7f43db93b95e249f4fc77ad5e7bab3; exact 16-path binary diff SHA-256 af4d18827b32a9477f04004a93130620463dd39d1a929fd2a86c692c17871ac7. Three independent final reviews returned GO and all local Node 20 gates passed. Hosted CI and the exact-head preview are now running. The claim remains active through base freshness, exact-head CI/preview, merge, exact-main CI/deployment audit, closure, and explicit release. PR: #620
daliu commentedon Aug 13, 2026
FINAL RELEASE — WEB-SUGGESTIONS-001A is COMPLETE/CLOSED and all exact claims are RELEASED. PR #620 admin-squash-merged exact reviewed head
da87c253951d953693d3712d224f2d103482a1c3as exact main3cf3e5bfc3ee13b084edb6efb8eff6bb21b907c5at 2026-08-13T06:31:19Z. Reviewed head and merge have the identical treea746c0e50c7f43db93b95e249f4fc77ad5e7bab3; exact 16-path binary patch SHA-256 remainsaf4d18827b32a9477f04004a93130620463dd39d1a929fd2a86c692c17871ac7. PR CI31673796755and exact-main CI31674139878passed all five required jobs; three independent exact-diff reviews returned GO. Exact-head Netlify preview6a7d636d30804600088f9784passed route, SEO, no-intake, responsive, keyboard, header, redirect, and Contact handoff checks and remained preview-only (published_at null). GitHub deployments for exact main are[]. Netlify exact-main attempt6a7d64b9b96ea300088ce47dis error/unpublished (published_at null) under the inactive production manifest. Production remains deploy6a6dc9ea588b0c0008036312with the unchanged #473 marker (control9ad6837756cdd409d296009fde5082eeeae5c059, source39ab8649df411262c8109a3c81a57bc38f1e168b, treed76b496cdc5e79015bc048cb961758abbe88b9ce, 60 files, digest07b10c7d5ff176a1ad893d7549b07042312df35f4a4126e8765824ca94eaefb8). Therefore #618 is source-merged and tested but NOT LIVE on runmprc.com. No Firebase, provider configuration, mailbox, production-data, or live action occurred. Any future real form/provider remains separately gated by #110 and #112.