Prepare CV Builder MVP for community testing#87
Conversation
- Rewrite home page copy to honestly describe the product as a CV evaluator - Render issues[], ATS verdict, and detected archetype on /results - Add visual dimension bars and CTA back to evaluator on /results - Add /feedback page with anonymization guidance and sample feedback - Stop advertising PDF support; remove .pdf from accept list; show inline status messages instead of alerts in FileUpload - Add docs/LOCAL_DEMO.md, docs/FEEDBACK_GUIDE.md, docs/COMMUNITY_ANNOUNCEMENT.md - Update README with privacy note, MVP framing, and link to local demo guide
|
Warning Review limit reached
Next review available in: 11 minutes Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (4)
📝 WalkthroughWalkthroughREADME, Web UI pages (home, results, feedback), and FileUpload/EvaluateForm components are updated to reflect a "community MVP" positioning that scores an existing CV. FileUpload restricts uploads to .txt/.md with inline status messaging. Three new documentation files (community announcement, feedback guide, local demo) are added. ChangesWeb UI upload flow, page content, and results UI
README and new community/demo documentation
Estimated code review effort: 2 (Simple) | ~15 minutes Possibly related PRs
Suggested reviewers: 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 5
🧹 Nitpick comments (2)
apps/web-ui/src/app/components/FileUpload.tsx (1)
13-18: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winPrefer React state over imperative DOM query for status messages.
setStatusreaches into the DOM viadocument.getElementByIdinstead of using component state. This bypasses React's rendering model, is harder to test, and is fragile if the DOM node is ever conditionally unmounted/remounted (the query would silently no-op).♻️ Suggested refactor using state
-export function FileUpload({ inputId, onContentLoaded }: FileUploadProps) { - const inputRef = useRef<HTMLInputElement>(null); - - function setStatus(message: string) { - const el = document.getElementById(`${inputId}-message`); - if (el) { - el.textContent = message; - } - } +export function FileUpload({ inputId, onContentLoaded }: FileUploadProps) { + const inputRef = useRef<HTMLInputElement>(null); + const [status, setStatus] = useState("");Then render
{status}inside the<p id={...} role="status" aria-live="polite">element instead of leaving it empty.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@apps/web-ui/src/app/components/FileUpload.tsx` around lines 13 - 18, The FileUpload status update logic is imperatively querying the DOM in setStatus instead of using React state. Refactor FileUpload so status text is stored in component state (for example, via the existing status setter logic around setStatus) and rendered directly inside the <p role="status" aria-live="polite"> element, removing the document.getElementById lookup and keeping the status message in React’s render flow.apps/web-ui/src/app/results/page.tsx (1)
58-79: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueResults page skips the shared
Header.Home and Feedback pages both wrap content in
<Header />(nav + theme toggle), but this page renders directly in<main>. Not a functional bug — "Evaluate another CV" covers navigation — but it's an inconsistent shell across the three pages in this cohort.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@apps/web-ui/src/app/results/page.tsx` around lines 58 - 79, The results page is missing the shared app shell header, so it should use the same `<Header />` component pattern as the Home and Feedback pages. Update the `ResultsPage`/`page.tsx` layout to render `<Header />` above the `<main>` content, keeping the existing “Evaluate another CV” link inside the page body if needed. Use the `Header` component reference already used by the other pages to keep the shell consistent across the cohort.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@apps/web-ui/src/app/results/page.tsx`:
- Around line 21-24: The results page is trusting parsed localStorage data too
much in the page component and can crash on older/stale records. In the results
rendering logic, treat `result.dimensions` the same way as `issues` and
`strengths` by defaulting to an empty array before mapping in the results view,
and make sure the `getEvaluationResult`/`setResult` flow in `page.tsx` handles
missing fields safely instead of relying on the `EvaluationResult` cast. Also
update the progress-bar percentage calculation in the dimensions render path to
handle `dimension.maxScore === 0` by falling back to a safe value before
dividing.
In `@docs/FEEDBACK_GUIDE.md`:
- Around line 103-109: The community feedback bullet is inconsistent with the
rest of the docs because it mentions Discord/Telegram instead of the documented
Tech Immigrants feedback channel. Update the wording in the “Other ways to give
feedback” section to match the repo’s standard phrasing, keeping the reference
to the `#feedback` channel consistent and avoiding any extra platform-specific
wording.
In `@docs/LOCAL_DEMO.md`:
- Around line 233-237: Replace the ad-hoc formatting command in the LOCAL_DEMO
docs with the repo-standard formatting script, and keep the surrounding guidance
about lint errors unchanged. Update the Lint reports errors section to reference
the existing docs-level command convention used elsewhere in the repo, so
readers are directed to the same formatting entrypoint rather than
biome-specific invocation.
- Around line 48-53: The prerequisites section in LOCAL_DEMO.md currently says
Node.js 22 or newer, which conflicts with the repo’s declared runtime. Update
the prerequisite text to match the repo metadata by lowering the Node
requirement to Node >= 20.0.0, and keep the rest of the setup guidance
unchanged. Locate the change in the prerequisites list that mentions Node.js and
align it with the supported toolchain used by the repository.
- Around line 160-162: The local demo docs are describing the EvaluationResult
shape incorrectly by marking rewrites as “reserved for future use” even though
it is already part of the current schema. Update the documentation around
EvaluationResult to clearly describe rewrites as an existing field, and align
the surrounding comments for atsCompatible and rewrites so the result shape
matches the actual API contract.
---
Nitpick comments:
In `@apps/web-ui/src/app/components/FileUpload.tsx`:
- Around line 13-18: The FileUpload status update logic is imperatively querying
the DOM in setStatus instead of using React state. Refactor FileUpload so status
text is stored in component state (for example, via the existing status setter
logic around setStatus) and rendered directly inside the <p role="status"
aria-live="polite"> element, removing the document.getElementById lookup and
keeping the status message in React’s render flow.
In `@apps/web-ui/src/app/results/page.tsx`:
- Around line 58-79: The results page is missing the shared app shell header, so
it should use the same `<Header />` component pattern as the Home and Feedback
pages. Update the `ResultsPage`/`page.tsx` layout to render `<Header />` above
the `<main>` content, keeping the existing “Evaluate another CV” link inside the
page body if needed. Use the `Header` component reference already used by the
other pages to keep the shell consistent across the cohort.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro Plus
Run ID: 6210907e-4e88-4636-a750-94022d64fd3f
📒 Files selected for processing (9)
README.mdapps/web-ui/src/app/components/EvaluateForm.tsxapps/web-ui/src/app/components/FileUpload.tsxapps/web-ui/src/app/feedback/page.tsxapps/web-ui/src/app/page.tsxapps/web-ui/src/app/results/page.tsxdocs/COMMUNITY_ANNOUNCEMENT.mddocs/FEEDBACK_GUIDE.mddocs/LOCAL_DEMO.md
Deploying with
|
| Status | Name | Latest Commit | Updated (UTC) |
|---|---|---|---|
| ❌ Deployment failed View logs |
cv-builder-web | 2bc34a4 | Jul 02 2026, 05:24 PM |
- results/page.tsx: default dimensions/issues/strengths to [] on stale localStorage records; guard divide-by-zero when dimension.maxScore is 0; render shared Header so the page matches the home and feedback shell. - FileUpload.tsx: replace imperative document.getElementById status updates with a React useState field rendered inside the aria-live status element. - docs/LOCAL_DEMO.md: lower Node prerequisite to 20+ (matches package.json), use the repo's pnpm format script for auto-fix, document rewrites as Rewrite[] in the current EvaluationResult shape. - docs/FEEDBACK_GUIDE.md: align feedback channel wording with the rest of the repo (Tech Immigrants community, not Discord/Telegram). Validates: pnpm test (12/12 tasks), pnpm lint (0 errors), pnpm build (6/6).
Captures what is ready (web UI, CLI, eval harness, 8 archetypes, 6 dimensions), what is not (PDF parsing, hosted deployment, rewriter mode, telemetry), and the local-only caveat. Includes validation results from the post-PR #87 fresh build (pnpm test 12/12, pnpm lint 0 errors, pnpm build 6/6 with /, /results, /feedback emitted as static). Points to docs/COMMUNITY_ANNOUNCEMENT.md for the announcement templates.
* docs: align repository documentation with MVP status Documentation-only audit. No code, evaluator, or rule changes; no new features; no Cloudflare work; no changes to PR #37 or #78. User-facing copy fixed: - README.md: replace misleading ASCII diagram (3 rewrites / Tailored CV) with the actual MVP outputs (Score, Issues, Strengths, ATS verdict, Archetype); clarify that /evaluate-cv ./my-resume.pdf works only because Claude Code reads PDFs natively (the local CLI/web UI parse .md and .txt only). - apps/web-ui layout.tsx: Next.js metadata description replaced with honest CV-evaluator copy (no longer 'Build a tailored resume...'). - apps/web-ui/README.md: list all three routes (/, /results, /feedback), note the static-export + privacy-first posture. - apps/cli/README.md: same PDF-clarification note as the root README. - package.json descriptions (root + core + cli): remove 'tailor / build' wording; describe the deterministic evaluator. - packages/intelligence/README.md: list the eight shipped roles (matches README and the actual implementation) and correct the default archetype (Backend Engineer, not Software Engineer). - packages/eval/README.md: drop the outdated LLM-provider claim; the MVP is fully deterministic. - .claude/skills/cv-evaluation/SKILL.md: 'local MVP', not 'hosted product'; default archetype corrected. - ROADMAP.md: status note added; Phase-1 / #74 / #75 / #76 / #85 / #87 marked as recently shipped; only #37 and #78 remain in progress. Historical docs marked with status notes (not rewritten, just flagged as pre-release context): ARCHITECTURE.md, PROPOSAL.md, PHASE-1.md, V1_SCOPE.md, MVP_DEMO_PLAN.md, PR_CLEANUP_HANDOFF.md, POST_MERGE_VALIDATION.md, REMAINING_PRS_PLAN.md, PR85_ROLLBACK_PLAN.md. Each now points readers to docs/MVP_RELEASE_STATUS.md. New: - docs/REPO_DOCS_AUDIT.md records the audit date, files reviewed, files changed, outdated claims found and fixed, historical docs left intentionally unchanged, remaining risks, and the validation results. Validates: pnpm test (12/12), pnpm lint (0 errors), pnpm build (6/6, fresh --force: emits /, /_not-found, /feedback, /results). * docs: fix remaining Node version reference docs/MVP_DEMO_PLAN.md still said 'Node 22+' in the prereqs section, which conflicts with the actual repo metadata (Node >= 20.0.0 in package.json) and with the authoritative setup guide in docs/LOCAL_DEMO.md. Replace the prereqs with a short pointer to LOCAL_DEMO.md plus a one-line accurate summary, so this historical demo-readiness doc no longer contradicts current setup instructions. docs/REPO_DOCS_AUDIT.md: remove the corresponding entry from the 'remaining documentation risks' list, fix the resulting item numbering, and add a note recording that the Node-version item was resolved before merge. No code, evaluator, or rule changes. No new features. PR #37 and PR #78 untouched. Validates: pnpm test 12/12, pnpm lint 0 errors, pnpm build 6/6 (fresh --force, emits /, /_not-found, /feedback, /results). * docs: address remaining CodeRabbit comments on PR #88 Two unresolved CodeRabbit comments fixed in this commit: 1. README.md — replace hard-coded '5 issues' in the evaluator diagram with the non-fixed wording 'Issues'. evaluate() returns a variable-length issues array; a fixed count would drift as scoring changes. The other diagram labels (Score, Strengths, ATS verdict, Archetype) are kept as-is because they describe deterministic outputs that do not vary in count. 2. packages/intelligence/README.md — the previous audit pass claimed this package ships eight roles and falls back to Backend Engineer. But packages/intelligence/src/archetypes/index.ts registers only three archetypes (Software Engineer, Product Manager, Data & ML Engineer) and DEFAULT_ARCHETYPE is softwareEngineer. Update the README to reflect the actual registry. Add a note clarifying that @cv-builder/core has a separate, broader legacy/runtime registry (7 roles) used by the CLI and Web UI, and that unifying the two registries is a follow-up — see docs/ARCHETYPE_GAP_AUDIT.md. docs/REPO_DOCS_AUDIT.md updated to record that the packages/intelligence/README.md archetype-inventory row was corrected in two steps (the audit pass incorrectly bumped the package claim to 8; this commit brings it back to 3 and adds the @cv-builder/core note). No code changes. No new features. PR #37 and PR #78 untouched. Docs only. Validates: pnpm test 12/12, pnpm lint 0 errors, pnpm build 6/6. --------- Co-authored-by: Cleanup Bot <cleanup-bot@example.com>
Summary
This PR prepares the CV Builder MVP for a community announcement. It is a finish-and-announce release — no new features, only honest copy, complete result rendering, a feedback collection flow, and three new docs that walk a new tester through running, evaluating, and reporting back.
What changed
Web UI
apps/web-ui/src/app/page.tsx): replaced the misleading "Tailor your resume / Shape the story / Export a focused CV" marketing claims with an honest description of the product as a CV evaluator. Adds a privacy callout and a link to the feedback guide.apps/web-ui/src/app/results/page.tsx):issues[]array with severity color-coding (critical/major/minor)/resultsis visited directly/feedback/feedbackpage (apps/web-ui/src/app/feedback/page.tsx): where to send feedback, what to include, anonymization checklist, sample anonymized feedback, five open-ended questions.apps/web-ui/src/app/components/FileUpload.tsx):.pdfremoved from theacceptattribute; PDF now produces a friendly inline status message instead of an alert. Other unsupported types get a non-blocking status message. Adds aninputIdprop so each textarea's status message has a stable id for screen readers.inputIdto eachFileUploadso the new status messages are wired to the right input.Docs
docs/LOCAL_DEMO.md— what the MVP does and doesn't do, install, run web UI, run CLI, sample fixtures, expected result shape, troubleshooting.docs/FEEDBACK_GUIDE.md— where to send feedback, anonymization checklist, what NOT to include (real CV), sample anonymized feedback, five questions.docs/COMMUNITY_ANNOUNCEMENT.md— ready-to-post announcements in Persian (short + long) and English (short), plus a posting checklist.README
What is intentionally not included
package.jsonchanges.Validation results
pnpm installpnpm test(turbo)pnpm --filter @cv-builder/core testpnpm --filter @cv-builder/eval testpnpm lintbiome migrate)pnpm build/,/_not-found,/feedback,/resultsHow Sahar can announce it
docs/COMMUNITY_ANNOUNCEMENT.md.Links
docs/COMMUNITY_ANNOUNCEMENT.mddocs/LOCAL_DEMO.mddocs/FEEDBACK_GUIDE.md/feedback(live after merge)Summary by CodeRabbit
.txt/.mdfiles.