Category: Testing, Design System & Community Tooling
Description: /contributors fetches the GitHub contributors API from the browser (see the CSP issue) and src/lib/issuesParser.ts parses issues.md bullets with indexOf/split(":") heuristics. Rebuild the data pipeline: server-side fetch with ISR, a robust parser supporting both the tracker format and the rich issue-wave-*.md format, and richer dashboard views.
Problem Statement & Context: The parser breaks on titles containing parentheses, colons in contributor fields or multiple metadata blocks, silently defaulting to Medium/150 (which is also inconsistent with waves that only use High). Client-side GitHub calls hit rate limits and CSP. The dashboard is the transparency face of the Wave program and must be trustworthy.
Scope & Acceptance Criteria:
- Parser rewritten with a small tokenizer/grammar; supports tracker bullets (
- #123 Title (Complexity: High, Points: 200, Status: Open, Contributor: G…)) with parentheses in titles, and rich wave files (### Title: [High] … blocks with **Complexity:** High (200 points)), collecting category from ## headings; unknown/malformed entries are reported as parse warnings (shown to maintainers, not silently defaulted) and points derive from a single tier table.
- Data loaded server-side at build/revalidate time (file read + GitHub issues/PR status when a token is available) with
revalidate caching and stale fallback; page hydrates only interactive filters.
- Dashboard enhancements: filter by wave/category/status, per-wave progress, contributor leaderboard with links, point totals reconciled with the source (test asserts sums), and a "data freshness" indicator.
- Existing tests (
contributors/page.test.tsx) updated; fixtures include the real issues.md and this document format.
- Out of scope: awarding points or payouts.
Implementation Guidelines (Suggested Execution):
- Key Files/Modules:
src/lib/issuesParser.ts, src/app/contributors/*, issues.md, issue-wave-9.md, new server data module, src/app/api/contributors/route.ts (from the CSP issue).
- Design/Architecture: Parser returns
{issues, warnings}; single TIER_POINTS constant; server module loadWaveData() cached.
- Edge Cases/Constraints: files with CRLF, duplicate issue ids, contributor addresses that are not valid strkeys (validate/flag), very large files, missing sections.
- Testing: Grammar tests (≥ 40 cases including malformed lines), snapshot-free assertions on totals; ≥ 95% coverage of the parser.
Definition of "Done": Baseline DoD, plus screenshots of the enhanced dashboard and documented file-format spec in CONTRIBUTING.md.
Resources: src/lib/issuesParser.ts, issues.md, src/app/contributors/page.test.tsx.
Complexity: High (200 points)
Baseline Definition of Done (applies to every Wave issue)
Each issue's own "Definition of Done" is in addition to this baseline:
- Code, tests and documentation are included in one PR that references the issue.
npm run lint, npm run typecheck, npm test, npm run check:i18n and npm run check:editorconfig pass locally and in CI. (If a command is broken by pre-existing repo debris, see the Repository Health & Build Integrity issues — do not silence the check; note the blocker in the PR.)
- No new
any, no // @ts-ignore / eslint-disable without a justification comment, and no new console.* (use secureLogger from src/lib/secureLogging.ts).
- All new user-facing strings go through the i18n catalog (
src/lib/i18n/messages/en.ts and es.ts).
- New interactive UI is keyboard-operable, has visible focus, correct ARIA semantics, and works in both the dark and light palettes defined in
src/app/globals.css.
- UI changes include before/after screenshots (desktop and ~400px mobile). Behaviour changes include a short screen recording or test output.
- Relevant docs under
docs/ (and README.md if routes/scripts/env vars change) are updated.
- The PR is reviewed and approved by a maintainer listed in
.github/CODEOWNERS.
Category: Testing, Design System & Community Tooling
Description:
/contributorsfetches the GitHub contributors API from the browser (see the CSP issue) andsrc/lib/issuesParser.tsparsesissues.mdbullets withindexOf/split(":")heuristics. Rebuild the data pipeline: server-side fetch with ISR, a robust parser supporting both the tracker format and the richissue-wave-*.mdformat, and richer dashboard views.Problem Statement & Context: The parser breaks on titles containing parentheses, colons in contributor fields or multiple metadata blocks, silently defaulting to
Medium/150(which is also inconsistent with waves that only use High). Client-side GitHub calls hit rate limits and CSP. The dashboard is the transparency face of the Wave program and must be trustworthy.Scope & Acceptance Criteria:
- #123 Title (Complexity: High, Points: 200, Status: Open, Contributor: G…)) with parentheses in titles, and rich wave files (### Title: [High] …blocks with**Complexity:** High (200 points)), collecting category from##headings; unknown/malformed entries are reported as parse warnings (shown to maintainers, not silently defaulted) and points derive from a single tier table.revalidatecaching and stale fallback; page hydrates only interactive filters.contributors/page.test.tsx) updated; fixtures include the realissues.mdand this document format.Implementation Guidelines (Suggested Execution):
src/lib/issuesParser.ts,src/app/contributors/*,issues.md,issue-wave-9.md, new server data module,src/app/api/contributors/route.ts(from the CSP issue).{issues, warnings}; singleTIER_POINTSconstant; server moduleloadWaveData()cached.Definition of "Done": Baseline DoD, plus screenshots of the enhanced dashboard and documented file-format spec in
CONTRIBUTING.md.Resources:
src/lib/issuesParser.ts,issues.md,src/app/contributors/page.test.tsx.Complexity: High (200 points)
Baseline Definition of Done (applies to every Wave issue)
Each issue's own "Definition of Done" is in addition to this baseline:
npm run lint,npm run typecheck,npm test,npm run check:i18nandnpm run check:editorconfigpass locally and in CI. (If a command is broken by pre-existing repo debris, see the Repository Health & Build Integrity issues — do not silence the check; note the blocker in the PR.)any, no// @ts-ignore/eslint-disablewithout a justification comment, and no newconsole.*(usesecureLoggerfromsrc/lib/secureLogging.ts).src/lib/i18n/messages/en.tsandes.ts).src/app/globals.css.docs/(andREADME.mdif routes/scripts/env vars change) are updated..github/CODEOWNERS.