Skip to content

Pr63692 main #1

Open
wants to merge 21 commits into
base: pr63692-bug
Choose a base branch
from
Open

Pr63692 main #1

wants to merge 21 commits into from

Conversation

admin-coderabbit
Copy link
Owner

@admin-coderabbit admin-coderabbit commented Dec 17, 2025

Checklist:

Closes #XXXXX

Summary by CodeRabbit

  • New Features

    • A2 English for Developers Certification is now live (no longer Beta).
    • Added speaking practice UI (translations across multiple locales).
    • New workshops/labs (e.g., Bookstore Page, String Formatter, Discount Calculator, Shortest Path, JS/Python labs).
    • Added Chinese A1 audio assets.
  • Improvements

    • Updated course titles to Legacy V7/V8 across locales with clearer notes on “coming soon” items.
    • Form inputs improved with better type handling and accessibility (aria-describedby).
    • Visual tweaks: clearer block titles and ruby annotation font sizing.
  • Documentation

    • Many lessons updated to include “enable the interactive editor” guidance and expanded examples.

✏️ Tip: You can customize this high-level summary in your review settings.

Huyen Nguyen and others added 21 commits November 10, 2025 18:59
Co-authored-by: Oliver Eyton-Williams <ojeytonwilliams@gmail.com>
Co-authored-by: Oliver Eyton-Williams <ojeytonwilliams@gmail.com>
…a-heart (#63692)

Co-authored-by: Huyen Nguyen <25715018+huyenltnguyen@users.noreply.github.com>
@coderabbit-eval
Copy link

coderabbit-eval bot commented Dec 17, 2025

Walkthrough

Refactors challenge data by moving tests from challenge.fields to top-level and removing fields.blockName usage across queries, types, and components. Activates A2 English certification (updates config, flags, labels, tests). Adds i18n-aware HTML serialization for Chinese ruby annotations in the challenge parser with new fixtures/tests. Broad i18n content renames to Legacy V7/V8, speaking-modal strings, and minor curriculum text and CSS tweaks.

Changes

Cohort / File(s) Summary
Challenge data shape refactor (tests top-level; drop blockName)
client/gatsby-node.js, client/src/client-only-routes/show-daily-coding-challenge.tsx, client/src/components/profile/components/time-line.tsx, client/src/templates/Challenges/.../*.tsx, client/src/templates/Introduction/super-block-intro.tsx, client/src/templates/Introduction/components/super-block-intro.tsx, client/src/redux/prop-types.ts, tools/daily-challenges/*, tools/client-plugins/gatsby-source-challenges/create-challenge-nodes.js
Removes fields.blockName and promotes tests to challenge-level across GraphQL queries, components, helpers, and types; updates HelpModal to receive block; adjusts daily challenge formatting.
A2 English certification activation
shared/config/certification-settings.ts, curriculum/structure/blocks/en-a2-certification-exam.json, tools/challenge-editor/api/configs/super-block-list.ts, client/i18n/locales/english/intro.json, e2e/map.spec.ts
Adds Certification.A2English, moves it to currentCertifications, flips isUpcomingChange to false, updates displayed names, and aligns e2e expectations.
Exams and module flags/content insertions
curriculum/structure/superblocks/*-v9.json, curriculum/structure/superblocks/javascript-v9.json, curriculum/structure/superblocks/responsive-web-design-v9.json, curriculum/structure/superblocks/python-v9.json, curriculum/structure/superblocks/relational-databases-v9.json
Adds/adjusts comingSoon flags; inserts new blocks (e.g., workshop-bookstore-page, workshop-major-browsers-list, labs); removes some comingSoon flags; updates exam module flags.
Parser i18n HTML rendering (Chinese ruby)
tools/challenge-parser/parser/plugins/utils/i18n-stringify.js, .../utils/i18n-stringify.test.js, .../utils/mdast-to-html.js, .../plugins/add-text.js, .../plugins/add-video-question.js, .../plugins/add-assignment.js, .../plugins/add-quizzes.js, .../plugins/add-text.test.js, .../plugins/add-video-question.test.js, tools/challenge-parser/parser/__fixtures__/with-chinese-*.md
Introduces createMdastToHtml with zh-CN ruby handling for inline code; refactors plugins to use language-aware HTML builder; adds Chinese fixtures and tests; expands mdastToHTML to accept hastOptions.
i18n content updates (titles/notes/keys, speaking-modal)
client/i18n/locales/*/intro.json, client/i18n/locales/*/translations.json
Renames many certifications to Legacy V7/V8 variants; adds development notes; renames A1 Spanish module/quiz keys; adds speaking-modal strings and cert-project label across locales (Chinese, Chinese Traditional, Spanish, German, Italian, Japanese, Korean, Portuguese, Swahili, Ukrainian).
Curriculum content and tests
curriculum/challenges/english/blocks/.../*.md, curriculum/structure/blocks/en-a2-certification-exam.json, curriculum/schema/scene-assets.js, curriculum/i18n-curriculum
Adds “enable the interactive editor” guidance across lectures; adjusts regex/tests (doctype, factorial, etc.); adds audio assets; updates submodule reference.
UI and form tweaks
client/src/components/formHelpers/form-fields.tsx, client/src/components/layouts/global.css, client/src/templates/Challenges/components/preview.tsx, client/src/templates/Introduction/intro.css
Enhances form types and accessibility; sets rt font-size; removes data-playwright-test-label; adjusts intro title size.
E2E updates
e2e/cert-username-case-navigation.spec.ts, e2e/map.spec.ts, e2e/preview.spec.ts
Updates expected link counts/text; merges preview tests into combined default/changed code flow.
API test tweak
api/src/routes/protected/certificate.test.ts
Adds isA2EnglishCert flag in test user data and certification maps.

Sequence Diagram(s)

sequenceDiagram
  autonumber
  actor Author
  participant Parser as Challenge Parser Plugins
  participant I18N as i18n-stringify (createMdastToHtml)
  participant MD as MD AST
  participant HTML as HTML Output

  Author->>Parser: Provide MD AST and file.lang (e.g., zh-CN)
  Parser->>I18N: createMdastToHtml(file.lang)
  I18N-->>Parser: toHtml(nodes)
  Parser->>MD: Extract sections (text, questions, answers, distractors)
  loop Render sections
    Parser->>I18N: toHtml(sectionNodes)
    alt lang = zh-CN and inlineCode matches "hanzi (pinyin)"
      I18N->>HTML: Render ruby/rp/rt structure
    else
      I18N->>HTML: Render standard HTML (e.g., code)
    end
  end
  Parser->>Author: file.data.{text, quizzes, assignments, videoQuestion} with HTML
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~75 minutes

  • Verify all GraphQL query shape changes (tests moved, blockName removed) across templates and helpers.
  • Ensure Redux/types and gatsby node align with new data shape.
  • Validate A2 English activation flags and config, plus e2e expectations.
  • Review parser i18n-stringify logic and tests for Chinese ruby rendering.
  • Check i18n locale renames and speaking-modal keys for consistency.

Poem

In fields of code I hop with glee,
Tests leap top-level, tidy and free.
A2’s live—carrots raised high!
Ruby on hanzi winks to the sky.
Legacy labels line the burrow way,
Ship it swift—then back to play. 🥕✨

Pre-merge checks and finishing touches

❌ Failed checks (1 inconclusive)
Check name Status Explanation Resolution
Title check ❓ Inconclusive The title 'Pr63692 main' is generic and does not describe the changes introduced in the pull request. Provide a concise, descriptive title summarizing the primary change in the pull request.
✅ Passed checks (1 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch pr63692-main

Comment @coderabbit eval help to get the list of available commands and usage tips.

Copy link

@coderabbit-eval coderabbit-eval bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 18

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (7)
curriculum/challenges/english/blocks/lecture-user-centered-design/672bafe4ef812b78696b0e27.md (1)

14-59: Fix minor grammar issue in desaturated-colors sentence

Line 58 is missing a verb before “more comfortable”:

“Desaturated colors are colors that are less intense, have a lower saturation level, and more comfortable to look at in dark mode.”

Consider:

-Desaturated colors are colors that are less intense, have a lower saturation level, and more comfortable to look at in dark mode.
+Desaturated colors are colors that are less intense, have a lower saturation level, and are more comfortable to look at in dark mode.

The interactive-editor instructions around this paragraph read well and match the rest of the curriculum.

client/i18n/locales/portuguese/translations.json (1)

682-693: Localize block-type.cert-project for this Portuguese locale

All other block-type values here are in Portuguese, but cert-project is English. To keep the UX consistent with the rest of this file (and reuse existing wording from misc.certification-project), consider:

       "review": "Revisão",
       "quiz": "Questionário",
-      "cert-project": "Certification Project",
+      "cert-project": "Projeto de certificação",
       "exam": "Teste",
client/i18n/locales/chinese/translations.json (1)

682-693: Align cert-project label with existing Chinese translation

learn.block-type.cert-project is currently in English, while the rest of this block and misc.certification-project use Chinese. For consistency, you can reuse the existing translation:

-      "cert-project": "Certification Project",
+      "cert-project": "认证项目",
client/i18n/locales/ukrainian/translations.json (1)

682-693: Localize cert-project to match existing Ukrainian wording

learn.block-type.cert-project is in English, but misc.certification-project already has the Ukrainian phrase. For consistency with the rest of the UI:

-      "cert-project": "Certification Project",
+      "cert-project": "Сертифікаційний проєкт",
client/i18n/locales/korean/intro.json (1)

8758-8768: Mislabelled A1 Chinese practice block shares quiz title

zh-a1-practice-building-your-self-introduction currently has the same title as the quiz block, which is confusing:

  • Practice block title: “Greetings and Introductions Quiz”
  • Quiz block title: “Greetings and Introductions Quiz”

The practice block should have a distinct, descriptive title. For example:

-      "zh-a1-practice-building-your-self-introduction": {
-        "title": "Greetings and Introductions Quiz",
+      "zh-a1-practice-building-your-self-introduction": {
+        "title": "Building Your Self Introduction",
         "intro": ["", ""]
       },

This keeps the quiz label unique and better reflects the practice activity.

client/i18n/locales/japanese/intro.json (2)

7486-7631: Placeholder and empty intros in A1 Professional Spanish should be filled or hidden

Several pieces of user‑facing text in a1-professional-spanish are still placeholders or empty:

  • Superblock intro: "intro": ["Placeholder intro"]
  • Module intros under es-a1-module-*-...: "intro": ["PLACEHOLDER: Write the module intro here."]
  • Many blocks (e.g. es-a1-learn-vowels, es-a1-learn-consonants-and-special-characters, es-a1-review-the-alphabet, es-a1-practice-the-alphabet, es-a1-quiz-the-alphabet) have intro: ["", ""].

These will either show visibly as “PLACEHOLDER…” or as blank sections in the UI, which is a minor UX issue.

Consider either:

  • Providing temporary real English/Japanese copy, or
  • Omitting the intro key / gating these blocks from navigation until content is ready.

If you’d like, I can help draft neutral, non‑placeholder intros based on the chapter and block titles.


8621-8624: Responsive Web Design exam intro has duplicated “Exam”

The exam-responsive-web-design-certification intro currently reads “Responsive Web Design Certification Exam” twice (“earn your … Certification Exam”). To match the other exam intros (JavaScript, Python, etc.), dropping the trailing “Exam” is clearer.

-          "Pass this exam to earn your Responsive Web Design Certification Exam"
+          "Pass this exam to earn your Responsive Web Design Certification."
♻️ Duplicate comments (2)
curriculum/challenges/english/blocks/lecture-user-centered-design/672bb02009ffc0797ca567ab.md (1)

10-10: Consistent interactive-editor note

This NOTE mirrors the wording used in the related user-centered-design lesson and clearly explains the need to enable the interactive editor to see previews. Any optional wording polish discussed in the other file applies here as well.

curriculum/challenges/english/blocks/lecture-user-centered-design/672bb015cfc889794359c4e0.md (1)

10-10: Aligned modal-dialog NOTE with other lessons

The interactive-editor NOTE is consistent with the other user-centered-design lessons and clearly explains how to see the previews. Any optional wording tweak around “all of the code” from the earlier file would apply here too but is non-blocking.

🧹 Nitpick comments (50)
curriculum/challenges/english/blocks/lecture-working-with-specialized-semantic-elements/672995ffdfd2f337f5f215f8.md (1)

12-12: Clarifying note about previews looks good; style tweak is optional

The added parenthetical about enabling the interactive editor is clear and consistent across all three examples. If you want slightly tighter copy, you could consider making it a separate sentence instead of in parentheses, e.g., “Here is an example … . To see the previews, enable the interactive editor.” — but the current wording is acceptable as-is.

Also applies to: 24-24, 42-42

curriculum/challenges/english/blocks/lab-factorial-calculator/66c07238b01053abaf812065.md (1)

77-77: Regex relaxation is fine; optional consistency tweak only

Allowing \s* after the optional semicolon is safe and just makes the test more tolerant of trailing whitespace. If you care about consistency, you could mirror this in the console.log(resultMsg) hint regex (Line 105), but that’s purely optional.

curriculum/challenges/english/blocks/lecture-accessible-media-elements/672a55fbc2d95a9453151caf.md (2)

31-31: Clearer sequencing for enabling the editor (optional)

The added sentence is helpful. For slightly clearer instructions, consider leading with enabling the editor, e.g., “First enable the interactive editor. Then click anywhere in the whitespace…”.


85-85: Align wording with earlier instructions (optional)

Content is correct. For consistency with Line 31 and to avoid any ambiguity about order of actions, you could mirror a “First enable the interactive editor, then…” structure here as well.

curriculum/challenges/english/blocks/lecture-understanding-form-validation/6733d3a33abdd27cd562bdf2.md (2)

56-56: Tighten wording to avoid repeated “Maybe”

Consider rephrasing to reduce repetition, e.g., “Perhaps we don’t want that. Instead, we’d like to show the character the user types in a separate element.”


258-258: Align preventDefault naming with code usage

Elsewhere you show preventDefault() with parentheses; here you refer to the e.preventDefault method. For consistency and clarity, consider writing e.preventDefault().

curriculum/challenges/english/blocks/review-semantic-html/671a83934b61f64cefe87a61.md (1)

149-155: Hyphenate “human readable” for better grammar

Minor copy edit: change “a human readable description” to “a human‑readable description”.

e2e/preview.spec.ts (1)

29-43: Strengthen the changed-code assertion (and consider brand casing)

Right now the second check only asserts that a heading with name FreeCodeCamp is visible after typing, but it does not explicitly prove that the edit changed the preview. If you want this test to be more future-proof, consider:

  • Asserting that FreeCodeCamp is not visible before insertText, then is visible afterward; and/or
  • Clearing or replacing the editor content instead of just inserting, so the heading is guaranteed to come from the new code.

Also, if the project generally uses the brand as freeCodeCamp, you might want to align the <h1> text and assertion with that spelling to avoid future nitpicks in content reviews.

curriculum/challenges/english/blocks/lecture-user-centered-design/672baffc684be178dd02fa06.md (1)

10-10: NOTE copy is clear; optional wording tightening

The guidance about enabling the interactive editor is clear and consistent. If you want to tighten the prose slightly, you could drop “of” and make the preview phrase a bit more idiomatic:

-**NOTE**: Some of the interactive examples might use CSS that you haven't learned yet. Don't worry about trying to understand all of the code. The goal of the examples is to show you previews for these design concepts so you better understand how things work. To see the previews, you will need to enable the interactive editor.
+**NOTE**: Some of the interactive examples might use CSS that you haven't learned yet. Don't worry about trying to understand all the code. The goal of the examples is to show you previews of these design concepts so you better understand how things work. To see the previews, you will need to enable the interactive editor.

As per static analysis hints, this is optional.

curriculum/challenges/english/blocks/lecture-user-centered-design/672baff13bc5b3789691c75c.md (1)

10-10: NOTE text matches the new interactive-editor pattern

The NOTE clearly explains the purpose of the examples and how to enable previews via the interactive editor. If you want to align wording with a slightly more concise style, you could also use “all the code” instead of “all of the code,” but that’s purely optional.

curriculum/challenges/english/blocks/lecture-user-centered-design/672bb03999f39379f67d8972.md (1)

10-10: Note text looks good; consider minor wording tweak

The added guidance about enabling the interactive editor is clear and fits the global pattern. For slightly tighter prose, you could drop “of” in “all of the code”:

-Don't worry about trying to understand all of the code.
+Don't worry about trying to understand all the code.

Based on static analysis hints, this makes the sentence more concise.

curriculum/challenges/english/blocks/lecture-user-centered-design/672bb009952c7a7904a750cb.md (1)

10-10: Note text is clear; optional minor wording tweak

The added sentence about enabling the interactive editor correctly explains how to see the previews. Optionally, you could tighten the earlier phrase to “trying to understand all the code” (dropping “of”) for slightly smoother reading, but it’s not required.

curriculum/challenges/english/blocks/lecture-understanding-html-attributes/6708143cab2b583ecd3324f5.md (1)

62-62: Fix minor grammar in the checkbox instruction

“try remove the checked attribute” should be “try removing the checked attribute” for correct grammar.

-Enable the interactive editor and try remove the `checked` attribute from the `input`. You will see that the checkbox is no longer checked by default. 
+Enable the interactive editor and try removing the `checked` attribute from the `input`. You will see that the checkbox is no longer checked by default. 
curriculum/challenges/english/blocks/lecture-html-fundamentals/670803abcb3e980233da4768.md (1)

12-31: Optional wording tweak for “inside of the … element”

The instructions are clear as-is. For slightly tighter style, you could drop “of” in both places:

-Here is an example of a `div` element. Add another paragraph element inside of the `div` element and see the changes in the preview window. To see the previews, you will need to enable the interactive editor.
+Here is an example of a `div` element. Add another paragraph element inside the `div` element and see the changes in the preview window. To see the previews, you will need to enable the interactive editor.
@@
-Add another `section` element below the first one. Then inside of the `section` element, a `h2` and `p` elements. You can use whatever text you like and you will see the changes in the preview window. To interact with the example, you will need to enable the interactive editor.
+Add another `section` element below the first one. Then inside the `section` element, add `h2` and `p` elements. You can use whatever text you like and you will see the changes in the preview window. To interact with the example, you will need to enable the interactive editor.

(Based on static-analysis hints.)

curriculum/challenges/english/blocks/lecture-importance-of-semantic-html/672990ecf71a852804ababe7.md (1)

80-80: Optional style tweak: “inside the nav

The instruction is clear. For slightly smoother phrasing you could drop “of”:

-Enable the interactive editor and add a `<a href="#">Products</a>` inside of the `nav` and see the changes in the preview window.
+Enable the interactive editor and add a `<a href="#">Products</a>` inside the `nav` and see the changes in the preview window.

(Based on static-analysis style hint.)

curriculum/challenges/english/blocks/lecture-working-with-audio-and-video-elements/67168278ac6df6a799555db5.md (1)

41-41: Minor grammar tweak: “close to the end of the song”

Consider inserting “to” for smoother reading.

-Here's an example of using the `loop` attribute to play one of Quincy Larson's songs titled "Can't stay down". To see the looping in action, enable the interactive editor, scrub the play head close the end of the song and it will restart again once it is finished. 
+Here's an example of using the `loop` attribute to play one of Quincy Larson's songs titled "Can't stay down". To see the looping in action, enable the interactive editor, scrub the play head close to the end of the song and it will restart again once it is finished. 
client/src/components/formHelpers/form-fields.tsx (1)

98-99: Remove unnecessary casts and ensure a stable string value for the control

Field<string | undefined> combined with repeated value as string casts is a small type/ergonomics smell and risks passing undefined through to a controlled input. You can rely on the union type directly and only coerce for the control:

-          <Field<string | undefined> key={`${name}-field`} name={name}>
+          <Field<string | undefined> key={`${name}-field`} name={name}>
             {({ input: { value, onChange }, meta: { pristine, error } }) => {
@@
-                    type={types[name] || 'text'}
-                    value={value as string}
+                    type={types[name] || 'text'}
+                    value={value || ''}
@@
-                  {nullOrWarning(
-                    value as string,
+                  {nullOrWarning(
+                    value,
                     !pristine && error,
                     isURL,
                     name
                   )}

This keeps the input consistently controlled (always a string) and aligns nullOrWarning’s parameter type with the actual value type, without the extraneous assertions.

Also applies to: 118-119, 124-128

e2e/cert-username-case-navigation.spec.ts (1)

17-19: Updated count to 20 matches new certification but keeps the test brittle

Bumping the expected View … Certification link count to 20 is consistent with adding another cert (e.g. A2 English). Consider, longer term, asserting on the presence of specific certification titles or a minimum count instead of an exact total to reduce maintenance when certs are added/removed.

Also applies to: 48-51

api/src/routes/protected/certificate.test.ts (1)

36-56: A2 English flag is wired consistently into certificate verification tests

Initializing isA2EnglishCert in the test setup, including it in isCertMap expectations and marking it true in the “all current certifications are met” scenario keeps the tests aligned with the new cert type and currentCertifications semantics. To reduce future churn when adding more current certs, consider deriving this “all met” user state from currentCertifications (and their mapped flags) instead of hard‑coding the full set of boolean fields here.

Also applies to: 132-157, 221-245

shared/config/certification-settings.ts (1)

35-38: Promotion of A2 English to a current certification looks coherent

Adding Certification.A2English to the enum, including it in currentCertifications and wiring it into certSlugTypeMap keeps the config consistent with the new live cert and the existing certTypes.a2English plumbing. You might want to adjust the nearby // Upcoming certifications comment or placement of A2English in the enum to avoid implying it is still upcoming.

Also applies to: 56-59, 185-213

client/src/components/profile/components/time-line.tsx (1)

249-307: Timeline now correctly uses block instead of blockName

Using block in the query and in blockNameTitle (intro:${superBlock}.blocks.${block}.title) is consistent with the new data shape and with other templates. The A2 English special-case still works with the updated key.

If you want to tighten types later, you could declare const idToNameMap = new Map<string, NameMap>(); to remove some of the @ts-expect-error noise here.

tools/challenge-parser/parser/plugins/utils/mdast-to-html.js (1)

5-15: Consider propagating allowDangerousHtml consistently to hastToHTML

The new hastOptions parameter lets callers override allowDangerousHtml for mdastToHast, but hastToHTML is still hard‑coded with { allowDangerousHtml: true }. If the intent is to be able to turn this off end‑to‑end, consider deriving a single allowDangerousHtml value and using it in both calls:

-function mdastToHTML(nodes, hastOptions = {}) {
+function mdastToHTML(nodes, hastOptions = {}) {
   if (!Array.isArray(nodes))
     throw Error('mdastToHTML expects an array argument');
-  // - the 'nodes' are children, so first need embedding in a parent
-
-  return hastToHTML(
-    mdastToHast(root(nodes), { allowDangerousHtml: true, ...hastOptions }),
-    {
-      allowDangerousHtml: true
-    }
-  );
+  const allowDangerousHtml =
+    Object.prototype.hasOwnProperty.call(hastOptions, 'allowDangerousHtml') ?
+      hastOptions.allowDangerousHtml :
+      true;
+
+  return hastToHTML(
+    mdastToHast(root(nodes), { ...hastOptions, allowDangerousHtml }),
+    { allowDangerousHtml }
+  );
 }

This keeps current behavior by default while honoring any explicit override.

tools/challenge-parser/parser/plugins/add-text.test.js (1)

165-177: Solid coverage for zh‑CN ruby rendering in add-text

The new zh‑CN test exercises both instructions and explanation sections and asserts the full ruby markup, which should quickly catch regressions in the i18n HTML serializer. If you want to de‑duplicate strings slightly, you could reuse the instructionsId constant, but that’s purely cosmetic.

tools/daily-challenges/types.ts (1)

18-25: Challenge.tests flattening matches helpers and Redux types

Exposing tests directly on Challenge as { testString; text }[] lines up with the updated GraphQL selection in helpers.ts and the shared Test type. While you’re here, note that challengeFiles uses filekey (lowercase k); if that’s not intentional and other types/queries use fileKey, consider harmonizing the name in a follow‑up to avoid confusion.

tools/challenge-parser/parser/__fixtures__/with-chinese-quizzes.md (1)

1-69: Fixture structure matches parser expectations; MD024 warning is benign

The quiz fixture’s marker layout (--quizzes--, --quiz--, repeated --question-- blocks, etc.) is appropriate for exercising the quizzes parser and the new zh‑CN behavior. The markdownlint MD024 “duplicate heading” warnings are expected here and can be safely ignored or suppressed for fixtures rather than changing the test data.

tools/challenge-parser/parser/plugins/add-quizzes.js (1)

3-36: Quiz question serialization cleanly migrated to i18n‑aware HTML helpers

Binding toHtml = createMdastToHtml(file.data.lang) and routing question text, distractors and answer through getQuestion / getDistractors keeps the existing validation (including “three distractors required”) while enabling zh-CN ruby rendering. The logic is sound; the if (!distractors) guard is effectively redundant but harmless given the prior length check.

client/i18n/locales/chinese/translations.json (1)

1357-1376: New speaking-modal strings are English placeholders

The speaking-modal block is fully in English in the Chinese locale. This is fine functionally, but for a smoother UX you may want to localize these strings in a later translation pass (at least the button labels like “Play”, “Record”, “Stop”).

client/i18n/locales/ukrainian/translations.json (1)

1357-1376: Consider translating speaking-modal UI text

All speaking-modal strings are currently English in the Ukrainian locale. Functionality is unaffected, but this will appear inconsistent next to the rest of the localized UI. Consider adding Ukrainian translations in a future localization pass.

client/i18n/locales/espanol/translations.json (1)

1357-1376: speaking-modal block added correctly; consider later localization

The new speaking-modal keys and placeholders look correct and consistent with other locales, but all strings are in English; if full Spanish localization is desired here, these should be queued for translation.

client/i18n/locales/swahili/translations.json (1)

1357-1376: Speaking modal keys added; English text can be localized later

The new speaking-modal block is well-formed and matches other locales. All strings are English; if you want a fully Swahili UI here, plan a follow-up localization pass.

client/i18n/locales/chinese-traditional/translations.json (1)

1357-1376: Speaking modal block added; English strings acceptable as placeholders

The speaking-modal structure and interpolation tokens are correct. Since all strings are English, consider scheduling Traditional Chinese translations if you want this UI fully localized.

client/i18n/locales/swahili/intro.json (1)

7491-7492: Spanish A1 alphabet renames and new blocks – check slug usage and placeholders

The renames (es-a1-chapter-the-spanish-alphabet, es-a1-module-alphabet-and-special-characters, es-a1-quiz-the-alphabet) and added vowel/consonant/review/practice blocks look conceptually consistent.

Two follow‑ups to consider:

  • The new module intro for es-a1-module-alphabet-and-special-characters still contains "PLACEHOLDER: Write the module intro here.", and the new alphabet‑related blocks all have empty intro arrays. These strings will surface directly to learners unless hidden or replaced before launch.
  • Since module and block slugs changed, ensure any upstream curriculum config, routing, and tests that referenced the old identifiers are updated to avoid broken links.

Also applies to: 7496-7497, 7506-7509, 7556-7558, 7608-7623

client/i18n/locales/chinese/intro.json (3)

1383-1383: Align A2 English title wording with B1 for consistency

A2 uses “A2 English for Developers (Beta) Certification”, while B1 uses “B1 English for Developers Certification (Beta)”. Consider standardizing the pattern (e.g. “… Certification (Beta)”) across both for consistency in UI copy.

-    "title": "A2 English for Developers (Beta) Certification",
+    "title": "A2 English for Developers Certification (Beta)",

4809-4812: Clarify “shortest path algorithm” wording (optional)

“Implement the shortest path algorithm to find the shortest path” is a bit tautological. Consider naming the specific algorithm (e.g. Dijkstra) or rephrasing slightly to be more informative.

-        "title": "Implement the Shortest Path Algorithm",
-        "intro": [
-          "In this workshop you will implement the shortest path algorithm to find the shortest path between two nodes in a graph."
-        ]
+        "title": "Implement a Shortest Path Algorithm",
+        "intro": [
+          "In this workshop you will implement a shortest path algorithm to find the shortest route between two nodes in a graph."
+        ]

6285-6285: Unify v9 certification “in development” notes

The notes for front-end-development-libraries-v9, python-v9, and relational-databases-v9 include guidance about completing available courses, but back-end-development-and-apis-v9 only states that it is in development. For a consistent learner experience, consider using the same two-sentence pattern for all four.

-    "note": "This certification is currently in development and will be available soon.",
+    "note": "This certification is currently in development and will be available soon. We recommend completing the available courses below to prepare for the certification exam once it is released.",

Also applies to: 6627-6627, 7085-7085, 7321-7321

client/i18n/locales/chinese-traditional/intro.json (1)

4810-4812: Shortest-path workshop text is fine; consider fixing nearby BFS typo

The new shortest-path workshop title and intro are clear and technically accurate.

Right below, the breadth-first search description has a small typo (“bread-first search algorithm”). Consider correcting it for clarity:

-      "workshop-breadth-first-search": {
-        "title": "Implement the Breadth-First Search Algorithm",
-        "intro": [
-          "In this workshop, you will use the bread-first search algorithm to generate all valid combinations of parentheses."
-        ]
-      },
+      "workshop-breadth-first-search": {
+        "title": "Implement the Breadth-First Search Algorithm",
+        "intro": [
+          "In this workshop, you will use the breadth-first search algorithm to generate all valid combinations of parentheses."
+        ]
+      },

Also applies to: 4821-4824

client/i18n/locales/english/intro.json (3)

2375-2378: Numeric title fields for internal blocks (qpra, kagw, trvf, etc.) are semantically odd

These blocks now use objects like "title": "30" / "258" with empty intro arrays. If these values are internal metadata (for example, question counts) migrated from bare numbers into objects (as suggested by the AI summary), consider moving them into a dedicated field (e.g. questionCount) and giving title either a human‑readable label or omitting it from the UI entirely. Otherwise, there’s a risk of raw numbers showing up as block titles in the interface or confusing future maintainers.

Based on learnings, these look like structural conversions of prior numeric values – worth confirming they are not rendered directly to users.

Also applies to: 4176-4179, 4452-4470, 4489-4496, 8046-8049


7600-7607: Empty-string intro arrays for new A1 Spanish/Chinese blocks

Several new A1 blocks (es-a1-learn-meet-luna, es-a1-learn-meet-mateo, zh-a1-learn-initials, zh-a1-learn-the-team, zh-a1-learn-my-family) use intro: ["", ""] as placeholders. That’s valid JSON, but it will likely render as empty paragraphs instead of being treated as “no content yet”.

If these are true placeholders, consider using intro: [] or a single explicit placeholder string so downstream rendering and translators can distinguish “missing” from “intentionally blank”.

Also applies to: 8775-8778, 8830-8832, 8838-8840


9018-9020: Add missing intro arrays for daily-coding-challenge
The super-block and its nested block both omit intro; add an empty array to each:

  "daily-coding-challenge": {
    "title": "Daily Coding Challenge",
+    "intro": [],
    "blocks": {
      "daily-coding-challenge": {
        "title": "Daily Coding Challenge",
+        "intro": []
      }
    }
  }
client/i18n/locales/ukrainian/intro.json (1)

2076-2081: New workshop-bookstore-page block is structurally correct

Key, nesting under full-stack-developer.blocks, and content format (title + intro array) all look good and consistent with neighboring workshop blocks. Since this is the Ukrainian locale, consider adding a Ukrainian translation for the title and intro later when translations are ready.

client/i18n/locales/german/intro.json (1)

7491-7491: A1 Spanish alphabet chapter/module and block additions are coherent, but intros are empty

The new A1 Spanish alphabet chapter (es-a1-chapter-the-spanish-alphabet), module (es-a1-module-alphabet-and-special-characters), and related blocks (alphabet quiz, vowels, consonants & special characters, alphabet review/practice) are named consistently and fit the emerging structure. However, many of these blocks still have empty intro arrays (`["", ""]), which will render as blank paragraphs in the UI.

Consider either:

  • Providing at least one short descriptive intro string per block, or
  • Using an empty array [] when there’s intentionally no intro, to avoid empty bullets/paragraphs.

Also applies to: 7496-7496, 7506-7506, 7557-7557, 7609-7609, 7613-7613, 7617-7617, 7621-7621

client/i18n/locales/italian/intro.json (4)

63-63: Legacy / V7–V8 title updates look consistent

The versioned titles for the legacy certifications are aligned with the new V7/V8 naming and do not introduce structural issues in the JSON; optional future improvement would be to localize the few remaining English titles into Italian for consistency.

Also applies to: 220-220, 303-303, 493-493, 556-556, 591-591, 699-699


2090-2095: New workshop-bookstore-page block is well-structured

The new workshop block matches the existing blocks schema (unique key, title, intro array) and should integrate cleanly; only optional follow-up is translating the English copy into Italian when convenient.


4823-4826: Shortest-path workshop block wiring looks correct

The workshop-shortest-path-algorithm entry is structurally consistent with other workshop blocks and clearly describes its purpose; no code-level or schema issues here, just note that the text is English in the Italian locale and could be localized later if desired.


6299-6299: v9 certification note fields are coherent but remain untranslated

All new note strings correctly describe that the v9 certifications are in development and match the surrounding English messaging used elsewhere in this file; if full Italian localization is a goal, consider translating these notes in a follow-up pass.

Also applies to: 6641-6641, 7100-7100, 7335-7335

client/i18n/locales/japanese/intro.json (3)

493-739: Empty note for Front End Libraries V8 — verify UI behavior

"front-end-development-libraries" now has "note": "". If the UI renders the presence of note regardless of contents, this could show as an empty note block. If the UI treats empty string the same as “no note”, this is fine, but it’s worth confirming.

If the UI expects note to be absent when there is nothing to show, consider dropping the key entirely for this block instead of using an empty string.


4823-4827: Shortest path workshop description is fine, but wording could be less absolute

The new workshop-shortest-path-algorithm block is well-formed. If you want slightly clearer wording, consider “a shortest path algorithm” instead of “the shortest path algorithm” to avoid implying there is a single canonical one.

-        "title": "Implement the Shortest Path Algorithm",
+        "title": "Implement a Shortest Path Algorithm",
@@
-          "In this workshop you will implement the shortest path algorithm to find the shortest path between two nodes in a graph."
+          "In this workshop you will implement a shortest path algorithm to find the shortest path between two nodes in a graph."

6615-6623: Standardize “TypeScript” capitalization in review title

The review-typescript block uses “Typescript” while the rest of the content and module name use “TypeScript”. For consistency and searchability, it’s worth correcting the title here (and any mirrored copy in other superblocks).

-        "title": "Typescript Review",
+        "title": "TypeScript Review",

You may want to apply the same change anywhere else this title appears (for example under the full-stack curriculum’s review-typescript block).

client/i18n/locales/espanol/intro.json (2)

2090-2095: Minor copy nit: “ids” wording in bookstore workshop description

The new workshop-bookstore-page block is clear and well-scoped. To tighten the copy, consider capitalizing the acronym or being explicit:

- "In this workshop, you will practice working with classes, ids and the <code>div</code> element by building a bookstore page."
+ "In this workshop, you will practice working with classes, IDs and the <code>div</code> element by building a bookstore page."
+ // or: "with class and id attributes and the <code>div</code> element"

Purely cosmetic; no functional impact.


7491-7496: A1 Spanish alphabet renames and new blocks are structurally sound; check empty intros

The chapter rename to “The Spanish Alphabet”, the module key/title change to es-a1-module-alphabet-and-special-characters, the updated quiz title, and the new supporting blocks (es-a1-learn-vowels, es-a1-learn-consonants-and-special-characters, es-a1-review-the-alphabet, es-a1-practice-the-alphabet) all line up consistently with the new structure and naming.

The only open question is that these new blocks have intro: ["", ""], so they will render with empty description text until filled. If that’s intentional for now, no action needed; otherwise, you may want to stub minimal descriptive intros so learners don’t see blank sections. I can help draft concise intros if you’d like.

Also applies to: 7506-7509, 7557-7558, 7608-7623

📜 Review details

Configuration used: Environment YAML

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 940cf61 and 25b1397.

📒 Files selected for processing (112)
  • api/src/routes/protected/certificate.test.ts (3 hunks)
  • client/gatsby-node.js (0 hunks)
  • client/i18n/locales/chinese-traditional/intro.json (18 hunks)
  • client/i18n/locales/chinese-traditional/translations.json (3 hunks)
  • client/i18n/locales/chinese/intro.json (18 hunks)
  • client/i18n/locales/chinese/translations.json (3 hunks)
  • client/i18n/locales/english/intro.json (19 hunks)
  • client/i18n/locales/espanol/intro.json (18 hunks)
  • client/i18n/locales/espanol/translations.json (3 hunks)
  • client/i18n/locales/german/intro.json (18 hunks)
  • client/i18n/locales/german/translations.json (3 hunks)
  • client/i18n/locales/italian/intro.json (18 hunks)
  • client/i18n/locales/italian/translations.json (3 hunks)
  • client/i18n/locales/japanese/intro.json (18 hunks)
  • client/i18n/locales/japanese/translations.json (3 hunks)
  • client/i18n/locales/korean/intro.json (18 hunks)
  • client/i18n/locales/korean/translations.json (3 hunks)
  • client/i18n/locales/portuguese/intro.json (20 hunks)
  • client/i18n/locales/portuguese/translations.json (3 hunks)
  • client/i18n/locales/swahili/intro.json (18 hunks)
  • client/i18n/locales/swahili/translations.json (3 hunks)
  • client/i18n/locales/ukrainian/intro.json (18 hunks)
  • client/i18n/locales/ukrainian/translations.json (3 hunks)
  • client/src/client-only-routes/show-daily-coding-challenge.tsx (2 hunks)
  • client/src/components/formHelpers/form-fields.tsx (5 hunks)
  • client/src/components/layouts/global.css (1 hunks)
  • client/src/components/profile/components/time-line.tsx (2 hunks)
  • client/src/redux/prop-types.ts (1 hunks)
  • client/src/templates/Challenges/classic/show.tsx (4 hunks)
  • client/src/templates/Challenges/codeally/show.tsx (2 hunks)
  • client/src/templates/Challenges/components/preview.tsx (1 hunks)
  • client/src/templates/Challenges/exam/show.tsx (3 hunks)
  • client/src/templates/Challenges/fill-in-the-blank/show.tsx (3 hunks)
  • client/src/templates/Challenges/generic/show.tsx (3 hunks)
  • client/src/templates/Challenges/ms-trophy/show.tsx (4 hunks)
  • client/src/templates/Challenges/projects/backend/show.tsx (3 hunks)
  • client/src/templates/Challenges/projects/frontend/show.tsx (3 hunks)
  • client/src/templates/Challenges/quiz/show.tsx (2 hunks)
  • client/src/templates/Introduction/components/super-block-intro.tsx (0 hunks)
  • client/src/templates/Introduction/intro.css (1 hunks)
  • client/src/templates/Introduction/super-block-intro.tsx (1 hunks)
  • curriculum/challenges/english/blocks/lab-factorial-calculator/66c07238b01053abaf812065.md (1 hunks)
  • curriculum/challenges/english/blocks/lecture-accessible-media-elements/672a55fbc2d95a9453151caf.md (3 hunks)
  • curriculum/challenges/english/blocks/lecture-animations-and-accessibility/672aa8d65995be62ef1c7515.md (1 hunks)
  • curriculum/challenges/english/blocks/lecture-html-fundamentals/670803abcb3e980233da4768.md (2 hunks)
  • curriculum/challenges/english/blocks/lecture-html-fundamentals/6708382cf088b216580a9ff1.md (3 hunks)
  • curriculum/challenges/english/blocks/lecture-html-fundamentals/67083868d5fdcb17bf8c14bd.md (4 hunks)
  • curriculum/challenges/english/blocks/lecture-html-fundamentals/670838b10ee87a18e5faff62.md (1 hunks)
  • curriculum/challenges/english/blocks/lecture-importance-of-semantic-html/672985445d7da807c6b4f406.md (2 hunks)
  • curriculum/challenges/english/blocks/lecture-importance-of-semantic-html/672990ecf71a852804ababe7.md (4 hunks)
  • curriculum/challenges/english/blocks/lecture-introduction-to-aria/672a54bc58319c8fe6f78ad4.md (1 hunks)
  • curriculum/challenges/english/blocks/lecture-introduction-to-aria/672a551975938a916c74802c.md (1 hunks)
  • curriculum/challenges/english/blocks/lecture-understanding-form-validation/6733d3a33abdd27cd562bdf2.md (4 hunks)
  • curriculum/challenges/english/blocks/lecture-understanding-html-attributes/6708143cab2b583ecd3324f5.md (5 hunks)
  • curriculum/challenges/english/blocks/lecture-understanding-nuanced-semantic-elements/672995bda6c67e369aaf8588.md (2 hunks)
  • curriculum/challenges/english/blocks/lecture-understanding-performance-in-web-applications/67d2f7cf63fafe7d20270498.md (2 hunks)
  • curriculum/challenges/english/blocks/lecture-understanding-the-html-boilerplate/670839051794aa19fcef6dc8.md (0 hunks)
  • curriculum/challenges/english/blocks/lecture-user-centered-design/672bafe4ef812b78696b0e27.md (3 hunks)
  • curriculum/challenges/english/blocks/lecture-user-centered-design/672baff13bc5b3789691c75c.md (2 hunks)
  • curriculum/challenges/english/blocks/lecture-user-centered-design/672baffc684be178dd02fa06.md (1 hunks)
  • curriculum/challenges/english/blocks/lecture-user-centered-design/672bb009952c7a7904a750cb.md (1 hunks)
  • curriculum/challenges/english/blocks/lecture-user-centered-design/672bb015cfc889794359c4e0.md (1 hunks)
  • curriculum/challenges/english/blocks/lecture-user-centered-design/672bb02009ffc0797ca567ab.md (1 hunks)
  • curriculum/challenges/english/blocks/lecture-user-centered-design/672bb02ecb230779bbbaccd9.md (1 hunks)
  • curriculum/challenges/english/blocks/lecture-user-centered-design/672bb03999f39379f67d8972.md (1 hunks)
  • curriculum/challenges/english/blocks/lecture-what-is-css/672aa5e1f8b935577acfb2b9.md (2 hunks)
  • curriculum/challenges/english/blocks/lecture-what-is-css/672acbbe2891564c4e316164.md (2 hunks)
  • curriculum/challenges/english/blocks/lecture-working-with-audio-and-video-elements/67168278ac6df6a799555db5.md (5 hunks)
  • curriculum/challenges/english/blocks/lecture-working-with-css-flexbox/672aa7f7284b235f46f7d4e9.md (1 hunks)
  • curriculum/challenges/english/blocks/lecture-working-with-forms/6729974ec29be33cb00eb54d.md (4 hunks)
  • curriculum/challenges/english/blocks/lecture-working-with-forms/672a4cd3d59756726657efb8.md (2 hunks)
  • curriculum/challenges/english/blocks/lecture-working-with-forms/672a4cf959443073a6774908.md (3 hunks)
  • curriculum/challenges/english/blocks/lecture-working-with-images-and-svgs/6716825aff3434a71fdc3e99.md (1 hunks)
  • curriculum/challenges/english/blocks/lecture-working-with-links/6716744f7245947a3dd60009.md (1 hunks)
  • curriculum/challenges/english/blocks/lecture-working-with-links/67168323932391a9ee0d3a9e.md (5 hunks)
  • curriculum/challenges/english/blocks/lecture-working-with-media/6716743531fc9a797351c21e.md (2 hunks)
  • curriculum/challenges/english/blocks/lecture-working-with-media/671682b3983489a819507553.md (1 hunks)
  • curriculum/challenges/english/blocks/lecture-working-with-relative-and-absolute-units/672bb83c3a9906945536cff2.md (2 hunks)
  • curriculum/challenges/english/blocks/lecture-working-with-specialized-semantic-elements/672995ffdfd2f337f5f215f8.md (3 hunks)
  • curriculum/challenges/english/blocks/review-semantic-html/671a83934b61f64cefe87a61.md (1 hunks)
  • curriculum/challenges/english/blocks/workshop-build-a-heart-icon/686daa7ed79ceacd0b264e7e.md (1 hunks)
  • curriculum/challenges/english/blocks/workshop-cat-photo-app/5ef9b03c81a63668521804ee.md (1 hunks)
  • curriculum/challenges/english/blocks/workshop-quincys-job-tips/68e90335bd53a901c41dfc13.md (1 hunks)
  • curriculum/i18n-curriculum (1 hunks)
  • curriculum/schema/scene-assets.js (1 hunks)
  • curriculum/structure/blocks/en-a2-certification-exam.json (1 hunks)
  • curriculum/structure/superblocks/back-end-development-and-apis-v9.json (1 hunks)
  • curriculum/structure/superblocks/front-end-development-libraries-v9.json (1 hunks)
  • curriculum/structure/superblocks/javascript-v9.json (2 hunks)
  • curriculum/structure/superblocks/python-v9.json (3 hunks)
  • curriculum/structure/superblocks/relational-databases-v9.json (1 hunks)
  • curriculum/structure/superblocks/responsive-web-design-v9.json (2 hunks)
  • e2e/cert-username-case-navigation.spec.ts (2 hunks)
  • e2e/map.spec.ts (1 hunks)
  • e2e/preview.spec.ts (2 hunks)
  • shared/config/certification-settings.ts (3 hunks)
  • tools/challenge-editor/api/configs/super-block-list.ts (1 hunks)
  • tools/challenge-parser/parser/__fixtures__/with-chinese-mcq.md (1 hunks)
  • tools/challenge-parser/parser/__fixtures__/with-chinese-quizzes.md (1 hunks)
  • tools/challenge-parser/parser/plugins/add-assignment.js (1 hunks)
  • tools/challenge-parser/parser/plugins/add-quizzes.js (1 hunks)
  • tools/challenge-parser/parser/plugins/add-quizzes.test.js (2 hunks)
  • tools/challenge-parser/parser/plugins/add-text.js (2 hunks)
  • tools/challenge-parser/parser/plugins/add-text.test.js (3 hunks)
  • tools/challenge-parser/parser/plugins/add-video-question.js (1 hunks)
  • tools/challenge-parser/parser/plugins/add-video-question.test.js (4 hunks)
  • tools/challenge-parser/parser/plugins/utils/i18n-stringify.js (1 hunks)
  • tools/challenge-parser/parser/plugins/utils/i18n-stringify.test.js (1 hunks)
  • tools/challenge-parser/parser/plugins/utils/mdast-to-html.js (1 hunks)
  • tools/client-plugins/gatsby-source-challenges/create-challenge-nodes.js (1 hunks)
  • tools/daily-challenges/helpers.ts (2 hunks)
  • tools/daily-challenges/types.ts (1 hunks)
💤 Files with no reviewable changes (3)
  • client/src/templates/Introduction/components/super-block-intro.tsx
  • client/gatsby-node.js
  • curriculum/challenges/english/blocks/lecture-understanding-the-html-boilerplate/670839051794aa19fcef6dc8.md
🧰 Additional context used
🪛 LanguageTool
curriculum/challenges/english/blocks/lecture-importance-of-semantic-html/672990ecf71a852804ababe7.md

[style] ~80-~80: This phrase is redundant. Consider using “inside”.
Context: ...or and add a <a href="#">Products</a> inside of the nav and see the changes in the pr...

(OUTSIDE_OF)

curriculum/challenges/english/blocks/lecture-user-centered-design/672bb02ecb230779bbbaccd9.md

[style] ~10-~10: Consider removing “of” to be more concise
Context: ... Don't worry about trying to understand all of the code. The goal of the examples is to sh...

(ALL_OF_THE)

curriculum/challenges/english/blocks/lecture-user-centered-design/672bb015cfc889794359c4e0.md

[style] ~10-~10: Consider removing “of” to be more concise
Context: ... Don't worry about trying to understand all of the code. The goal of the examples is to sh...

(ALL_OF_THE)

curriculum/challenges/english/blocks/lecture-user-centered-design/672baffc684be178dd02fa06.md

[style] ~10-~10: Consider removing “of” to be more concise
Context: ... Don't worry about trying to understand all of the code. The goal of the examples is to sh...

(ALL_OF_THE)

curriculum/challenges/english/blocks/lecture-user-centered-design/672bb03999f39379f67d8972.md

[style] ~10-~10: Consider removing “of” to be more concise
Context: ... Don't worry about trying to understand all of the code. The goal of the examples is to sh...

(ALL_OF_THE)

curriculum/challenges/english/blocks/workshop-cat-photo-app/5ef9b03c81a63668521804ee.md

[style] ~24-~24: Using many exclamation marks might seem excessive (in this case: 3 exclamation marks for a text that’s 661 characters long)
Context: ... /<\s*!doctype\s+html\s*>/i); ``` Your <!DOCTYPE html> must be located at the to...

(EN_EXCESSIVE_EXCLAMATION)

curriculum/challenges/english/blocks/lecture-user-centered-design/672bb02009ffc0797ca567ab.md

[style] ~10-~10: Consider removing “of” to be more concise
Context: ... Don't worry about trying to understand all of the code. The goal of the examples is to sh...

(ALL_OF_THE)

curriculum/challenges/english/blocks/lecture-user-centered-design/672bb009952c7a7904a750cb.md

[style] ~10-~10: Consider removing “of” to be more concise
Context: ... Don't worry about trying to understand all of the code. The goal of the examples is to sh...

(ALL_OF_THE)

curriculum/challenges/english/blocks/lecture-understanding-form-validation/6733d3a33abdd27cd562bdf2.md

[style] ~56-~56: You have already used this phrasing in nearby sentences. Consider replacing it to add variety to your writing.
Context: ...expected. But maybe we don't want that. Maybe, instead, we'd like to show the charact...

(REP_MAYBE)

curriculum/challenges/english/blocks/lecture-html-fundamentals/670803abcb3e980233da4768.md

[style] ~12-~12: This phrase is redundant. Consider using “inside”.
Context: ... element. Add another paragraph element inside of the div element and see the changes i...

(OUTSIDE_OF)


[style] ~31-~31: This phrase is redundant. Consider using “inside”.
Context: ...tionelement below the first one. Then inside of thesectionelement, ah2andp` e...

(OUTSIDE_OF)

curriculum/challenges/english/blocks/review-semantic-html/671a83934b61f64cefe87a61.md

[style] ~86-~86: In contexts where ‘if’ is followed by ‘or’, using ‘whether’ may be more appropriate (and formal).
Context: ...ench. The i element does not indicate if the text is important or not, it only s...

(IF_WHETHER)


[style] ~96-~96: Consider an alternative for the often overused word ‘important’.
Context: ... to bring attention to text that is not important for the meaning of the content. It's co...

(NOT_IMPORTANT)


[style] ~106-~106: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
Context: ...o represent the term being defined. - Description Details (dd) element: used to repre...

(ENGLISH_WORD_REPEAT_BEGINNING_RULE)


[grammar] ~149-~149: Use a hyphen to join words.
Context: ... is, you can show its full form, a human readable description, with the title a...

(QB_NEW_EN_HYPHEN)

curriculum/challenges/english/blocks/lecture-user-centered-design/672baff13bc5b3789691c75c.md

[style] ~10-~10: Consider removing “of” to be more concise
Context: ... Don't worry about trying to understand all of the code. The goal of the examples is to sh...

(ALL_OF_THE)

🪛 markdownlint-cli2 (0.18.1)
tools/challenge-parser/parser/__fixtures__/with-chinese-mcq.md

27-27: Multiple headings with the same content

(MD024, no-duplicate-heading)


49-49: Multiple headings with the same content

(MD024, no-duplicate-heading)

tools/challenge-parser/parser/__fixtures__/with-chinese-quizzes.md

27-27: Multiple headings with the same content

(MD024, no-duplicate-heading)


49-49: Multiple headings with the same content

(MD024, no-duplicate-heading)

@@ -6275,6 +6282,7 @@
},
"front-end-development-libraries-v9": {
"title": "Front End Development Libraries Certification",
"note": "This certification is currently in development and will be available soon. We recommend completing the available courses below to prepare for the certification exam once it is released.",

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

English-only note strings in zh-Hant locale

The new note fields for the v9 certifications (Front End Libraries, Python, Relational Databases, Back End Development & APIs, and Full Stack Developer) are all English-only in this Chinese Traditional locale file.

If the intent is full localization, these should eventually be translated into zh-Hant to match the rest of this file; otherwise users will see a mix of Chinese and English in the same section.

Also applies to: 6627-6627, 7085-7086, 7321-7321, 7439-7439

🤖 Prompt for AI Agents
client/i18n/locales/chinese-traditional/intro.json lines 6285 (and also 6627,
7085-7086, 7321, 7439): the "note" values are in English but this is the zh-Hant
locale; replace these English-only note strings with proper Chinese Traditional
translations that match the tone and meaning of the original (keep JSON string
structure and punctuation), ensure any placeholders or special characters remain
unchanged, and verify encoding/escaping so the file remains valid JSON.

Comment on lines +7438 to +7448
"note": "If you were previously working through our full stack curriculum, don't worry - you're progress is saved. We split it into smaller certifications for you to earn along your journey. This certification is currently in development and will be available soon. Start earning the required certifications so you're ready when it launches.",
"intro": [
"This course provides a comprehensive pathway to becoming a Certified Full Stack Developer, covering all the essential technologies required to build modern, scalable web applications from start to finish.",
"Through a blend of interactive lessons, coding exercises, and real-world projects, you will master both frontend and backend development. You'll work with HTML, CSS, and JavaScript to build responsive user interfaces, explore React and TypeScript for advanced web applications, and learn to manage data with relational databases - and on the backend, you'll use Git, Npm, Node.js, and Python to create powerful server-side solutions.",
"By the end of this course, you'll have the practical skills and experience to confidently develop complete web applications, preparing you for a successful career as a Full Stack Developer.",
"This certification will take you a substantial amount of time and effort to complete. If you start now, you may be ready to start the remaining material and final exam when we launch it in the coming months."
"This certification represents the culmination of your full stack developer journey. It demonstrates your ability to build complete, modern web applications from start to finish.",
"To qualify for the exam, you must earn the following certifications:",
"- Responsive Web Design Certification",
"- JavaScript Certification",
"- Front End Development Libraries Certification",
"- Python Certification",
"- Relational Databases Certification",
"- Back End Development and APIs Certification",
"Pass the exam to earn your Full Stack Developer Certification."

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Fix small grammar issue in Full Stack Developer note

There’s a minor but user-visible grammar error in the full-stack-developer-v9.note text: “you're progress is saved” should be “your progress is saved”.

-    "note": "If you were previously working through our full stack curriculum, don't worry - you're progress is saved. We split it into smaller certifications for you to earn along your journey. This certification is currently in development and will be available soon. Start earning the required certifications so you're ready when it launches.",
+    "note": "If you were previously working through our full stack curriculum, don't worry - your progress is saved. We split it into smaller certifications for you to earn along your journey. This certification is currently in development and will be available soon. Start earning the required certifications so you're ready when it launches.",
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"note": "If you were previously working through our full stack curriculum, don't worry - you're progress is saved. We split it into smaller certifications for you to earn along your journey. This certification is currently in development and will be available soon. Start earning the required certifications so you're ready when it launches.",
"intro": [
"This course provides a comprehensive pathway to becoming a Certified Full Stack Developer, covering all the essential technologies required to build modern, scalable web applications from start to finish.",
"Through a blend of interactive lessons, coding exercises, and real-world projects, you will master both frontend and backend development. You'll work with HTML, CSS, and JavaScript to build responsive user interfaces, explore React and TypeScript for advanced web applications, and learn to manage data with relational databases - and on the backend, you'll use Git, Npm, Node.js, and Python to create powerful server-side solutions.",
"By the end of this course, you'll have the practical skills and experience to confidently develop complete web applications, preparing you for a successful career as a Full Stack Developer.",
"This certification will take you a substantial amount of time and effort to complete. If you start now, you may be ready to start the remaining material and final exam when we launch it in the coming months."
"This certification represents the culmination of your full stack developer journey. It demonstrates your ability to build complete, modern web applications from start to finish.",
"To qualify for the exam, you must earn the following certifications:",
"- Responsive Web Design Certification",
"- JavaScript Certification",
"- Front End Development Libraries Certification",
"- Python Certification",
"- Relational Databases Certification",
"- Back End Development and APIs Certification",
"Pass the exam to earn your Full Stack Developer Certification."
"note": "If you were previously working through our full stack curriculum, don't worry - your progress is saved. We split it into smaller certifications for you to earn along your journey. This certification is currently in development and will be available soon. Start earning the required certifications so you're ready when it launches.",
"intro": [
"This certification represents the culmination of your full stack developer journey. It demonstrates your ability to build complete, modern web applications from start to finish.",
"To qualify for the exam, you must earn the following certifications:",
"- Responsive Web Design Certification",
"- JavaScript Certification",
"- Front End Development Libraries Certification",
"- Python Certification",
"- Relational Databases Certification",
"- Back End Development and APIs Certification",
"Pass the exam to earn your Full Stack Developer Certification."
🤖 Prompt for AI Agents
In client/i18n/locales/chinese-traditional/intro.json around lines 7438 to 7448,
the note string contains a grammar typo "you're progress is saved"; update that
phrase to "your progress is saved" (replace "you're" with "your") so the
sentence reads correctly, then validate the JSON and run a quick linter/locale
build to ensure no formatting issues.

Comment on lines 7437 to +7448
"title": "Certified Full Stack Developer Curriculum",
"note": "If you were previously working through our full stack curriculum, don't worry - you're progress is saved. We split it into smaller certifications for you to earn along your journey. This certification is currently in development and will be available soon. Start earning the required certifications so you're ready when it launches.",
"intro": [
"This course provides a comprehensive pathway to becoming a Certified Full Stack Developer, covering all the essential technologies required to build modern, scalable web applications from start to finish.",
"Through a blend of interactive lessons, coding exercises, and real-world projects, you will master both frontend and backend development. You'll work with HTML, CSS, and JavaScript to build responsive user interfaces, explore React and TypeScript for advanced web applications, and learn to manage data with relational databases - and on the backend, you'll use Git, Npm, Node.js, and Python to create powerful server-side solutions.",
"By the end of this course, you'll have the practical skills and experience to confidently develop complete web applications, preparing you for a successful career as a Full Stack Developer.",
"This certification will take you a substantial amount of time and effort to complete. If you start now, you may be ready to start the remaining material and final exam when we launch it in the coming months."
"This certification represents the culmination of your full stack developer journey. It demonstrates your ability to build complete, modern web applications from start to finish.",
"To qualify for the exam, you must earn the following certifications:",
"- Responsive Web Design Certification",
"- JavaScript Certification",
"- Front End Development Libraries Certification",
"- Python Certification",
"- Relational Databases Certification",
"- Back End Development and APIs Certification",
"Pass the exam to earn your Full Stack Developer Certification."

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Fix grammar in full‑stack v9 note (“you're progress”)

There’s a small typo in the note: “you're progress is saved” → “your progress is saved”. The rest of the messaging and the list of required certifications look good.

-    "note": "If you were previously working through our full stack curriculum, don't worry - you're progress is saved. We split it into smaller certifications for you to earn along your journey. This certification is currently in development and will be available soon. Start earning the required certifications so you're ready when it launches.",
+    "note": "If you were previously working through our full stack curriculum, don't worry - your progress is saved. We split it into smaller certifications for you to earn along your journey. This certification is currently in development and will be available soon. Start earning the required certifications so you're ready when it launches.",
🤖 Prompt for AI Agents
client/i18n/locales/chinese/intro.json around lines 7437 to 7448: the note
string contains a typo "you're progress is saved" — replace "you're" with "your"
so it reads "your progress is saved"; keep the existing sentence structure and
punctuation otherwise, and ensure the JSON string remains valid (proper
quotes/escaping).

Comment on lines +4823 to 4827
"title": "Implement the Shortest Path Algorithm",
"intro": [
"In this workshop you will implement the shortest path algorithm to find the shortest path between two nodes in a graph."
]
},

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Fix typo in BFS description: “bread-first” → “breadth-first”

Right below this block, the breadth-first search workshop intro (Line 4837) says “the bread-first search algorithm”, which is a visible typo:

- "In this workshop, you will use the bread-first search algorithm to generate all valid combinations of parentheses."
+ "In this workshop, you will use the breadth-first search algorithm to generate all valid combinations of parentheses."

The updated shortest-path block here is fine; this suggestion is to keep the surrounding algorithm descriptions accurate.

Committable suggestion skipped: line range outside the PR's diff.

🤖 Prompt for AI Agents
In client/i18n/locales/espanol/intro.json around lines 4823-4827 (and
specifically at ~4837) the workshop intro for breadth-first search contains a
typo (“bread-first”); update the Spanish text to read “breadth-first” (i.e.,
replace “bread-first search” with “breadth-first search”) so the algorithm name
is correct in the localized intro.

Comment on lines +7452 to 7463
"note": "If you were previously working through our full stack curriculum, don't worry - you're progress is saved. We split it into smaller certifications for you to earn along your journey. This certification is currently in development and will be available soon. Start earning the required certifications so you're ready when it launches.",
"intro": [
"This course provides a comprehensive pathway to becoming a Certified Full Stack Developer, covering all the essential technologies required to build modern, scalable web applications from start to finish.",
"Through a blend of interactive lessons, coding exercises, and real-world projects, you will master both frontend and backend development. You'll work with HTML, CSS, and JavaScript to build responsive user interfaces, explore React and TypeScript for advanced web applications, and learn to manage data with relational databases - and on the backend, you'll use Git, Npm, Node.js, and Python to create powerful server-side solutions.",
"By the end of this course, you'll have the practical skills and experience to confidently develop complete web applications, preparing you for a successful career as a Full Stack Developer.",
"This certification will take you a substantial amount of time and effort to complete. If you start now, you may be ready to start the remaining material and final exam when we launch it in the coming months."
"This certification represents the culmination of your full stack developer journey. It demonstrates your ability to build complete, modern web applications from start to finish.",
"To qualify for the exam, you must earn the following certifications:",
"- Responsive Web Design Certification",
"- JavaScript Certification",
"- Front End Development Libraries Certification",
"- Python Certification",
"- Relational Databases Certification",
"- Back End Development and APIs Certification",
"Pass the exam to earn your Full Stack Developer Certification."
],

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Fix typo in full‑stack v9 note (“you're progress” → “your progress”)

There’s a small grammar issue in the note: “you're progress is saved” should be “your progress is saved”. Everything else in the title/intro block reads well and matches the new certification structure.

-    "note": "If you were previously working through our full stack curriculum, don't worry - you're progress is saved. We split it into smaller certifications for you to earn along your journey. This certification is currently in development and will be available soon. Start earning the required certifications so you're ready when it launches.",
+    "note": "If you were previously working through our full stack curriculum, don't worry - your progress is saved. We split it into smaller certifications for you to earn along your journey. This certification is currently in development and will be available soon. Start earning the required certifications so you're ready when it launches.",
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"note": "If you were previously working through our full stack curriculum, don't worry - you're progress is saved. We split it into smaller certifications for you to earn along your journey. This certification is currently in development and will be available soon. Start earning the required certifications so you're ready when it launches.",
"intro": [
"This course provides a comprehensive pathway to becoming a Certified Full Stack Developer, covering all the essential technologies required to build modern, scalable web applications from start to finish.",
"Through a blend of interactive lessons, coding exercises, and real-world projects, you will master both frontend and backend development. You'll work with HTML, CSS, and JavaScript to build responsive user interfaces, explore React and TypeScript for advanced web applications, and learn to manage data with relational databases - and on the backend, you'll use Git, Npm, Node.js, and Python to create powerful server-side solutions.",
"By the end of this course, you'll have the practical skills and experience to confidently develop complete web applications, preparing you for a successful career as a Full Stack Developer.",
"This certification will take you a substantial amount of time and effort to complete. If you start now, you may be ready to start the remaining material and final exam when we launch it in the coming months."
"This certification represents the culmination of your full stack developer journey. It demonstrates your ability to build complete, modern web applications from start to finish.",
"To qualify for the exam, you must earn the following certifications:",
"- Responsive Web Design Certification",
"- JavaScript Certification",
"- Front End Development Libraries Certification",
"- Python Certification",
"- Relational Databases Certification",
"- Back End Development and APIs Certification",
"Pass the exam to earn your Full Stack Developer Certification."
],
"note": "If you were previously working through our full stack curriculum, don't worry - your progress is saved. We split it into smaller certifications for you to earn along your journey. This certification is currently in development and will be available soon. Start earning the required certifications so you're ready when it launches.",
"intro": [
"This certification represents the culmination of your full stack developer journey. It demonstrates your ability to build complete, modern web applications from start to finish.",
"To qualify for the exam, you must earn the following certifications:",
"- Responsive Web Design Certification",
"- JavaScript Certification",
"- Front End Development Libraries Certification",
"- Python Certification",
"- Relational Databases Certification",
"- Back End Development and APIs Certification",
"Pass the exam to earn your Full Stack Developer Certification."
],
🤖 Prompt for AI Agents
client/i18n/locales/german/intro.json lines 7452-7463: The note string contains
a typo "you're progress is saved" which should be "your progress is saved";
update the "note" value to replace "you're" with "your" (keeping the rest of the
sentence, punctuation and JSON string escaping unchanged) so the grammar reads
correctly.

Comment on lines +7452 to +7462
"note": "If you were previously working through our full stack curriculum, don't worry - you're progress is saved. We split it into smaller certifications for you to earn along your journey. This certification is currently in development and will be available soon. Start earning the required certifications so you're ready when it launches.",
"intro": [
"This course provides a comprehensive pathway to becoming a Certified Full Stack Developer, covering all the essential technologies required to build modern, scalable web applications from start to finish.",
"Through a blend of interactive lessons, coding exercises, and real-world projects, you will master both frontend and backend development. You'll work with HTML, CSS, and JavaScript to build responsive user interfaces, explore React and TypeScript for advanced web applications, and learn to manage data with relational databases - and on the backend, you'll use Git, Npm, Node.js, and Python to create powerful server-side solutions.",
"By the end of this course, you'll have the practical skills and experience to confidently develop complete web applications, preparing you for a successful career as a Full Stack Developer.",
"This certification will take you a substantial amount of time and effort to complete. If you start now, you may be ready to start the remaining material and final exam when we launch it in the coming months."
"This certification represents the culmination of your full stack developer journey. It demonstrates your ability to build complete, modern web applications from start to finish.",
"To qualify for the exam, you must earn the following certifications:",
"- Responsive Web Design Certification",
"- JavaScript Certification",
"- Front End Development Libraries Certification",
"- Python Certification",
"- Relational Databases Certification",
"- Back End Development and APIs Certification",
"Pass the exam to earn your Full Stack Developer Certification."

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Fix grammar in Full Stack v9 note (“you're” → “your”)

Minor copy issue:
Current text: don't worry - you're progress is saved.
Should be: don't worry - your progress is saved.

-    "note": "If you were previously working through our full stack curriculum, don't worry - you're progress is saved. We split it into smaller certifications for you to earn along your journey. This certification is currently in development and will be available soon. Start earning the required certifications so you're ready when it launches.",
+    "note": "If you were previously working through our full stack curriculum, don't worry - your progress is saved. We split it into smaller certifications for you to earn along your journey. This certification is currently in development and will be available soon. Start earning the required certifications so you're ready when it launches.",
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"note": "If you were previously working through our full stack curriculum, don't worry - you're progress is saved. We split it into smaller certifications for you to earn along your journey. This certification is currently in development and will be available soon. Start earning the required certifications so you're ready when it launches.",
"intro": [
"This course provides a comprehensive pathway to becoming a Certified Full Stack Developer, covering all the essential technologies required to build modern, scalable web applications from start to finish.",
"Through a blend of interactive lessons, coding exercises, and real-world projects, you will master both frontend and backend development. You'll work with HTML, CSS, and JavaScript to build responsive user interfaces, explore React and TypeScript for advanced web applications, and learn to manage data with relational databases - and on the backend, you'll use Git, Npm, Node.js, and Python to create powerful server-side solutions.",
"By the end of this course, you'll have the practical skills and experience to confidently develop complete web applications, preparing you for a successful career as a Full Stack Developer.",
"This certification will take you a substantial amount of time and effort to complete. If you start now, you may be ready to start the remaining material and final exam when we launch it in the coming months."
"This certification represents the culmination of your full stack developer journey. It demonstrates your ability to build complete, modern web applications from start to finish.",
"To qualify for the exam, you must earn the following certifications:",
"- Responsive Web Design Certification",
"- JavaScript Certification",
"- Front End Development Libraries Certification",
"- Python Certification",
"- Relational Databases Certification",
"- Back End Development and APIs Certification",
"Pass the exam to earn your Full Stack Developer Certification."
"note": "If you were previously working through our full stack curriculum, don't worry - your progress is saved. We split it into smaller certifications for you to earn along your journey. This certification is currently in development and will be available soon. Start earning the required certifications so you're ready when it launches.",
"intro": [
"This certification represents the culmination of your full stack developer journey. It demonstrates your ability to build complete, modern web applications from start to finish.",
"To qualify for the exam, you must earn the following certifications:",
"- Responsive Web Design Certification",
"- JavaScript Certification",
"- Front End Development Libraries Certification",
"- Python Certification",
"- Relational Databases Certification",
"- Back End Development and APIs Certification",
"Pass the exam to earn your Full Stack Developer Certification."
🤖 Prompt for AI Agents
client/i18n/locales/swahili/intro.json lines 7452-7462: Fix the grammar typo in
the note string where "you're progress is saved" should be "your progress is
saved"; update the text to replace "you're" with "your" so the sentence reads
"don't worry - your progress is saved."

Comment on lines +7438 to +7447
"note": "If you were previously working through our full stack curriculum, don't worry - you're progress is saved. We split it into smaller certifications for you to earn along your journey. This certification is currently in development and will be available soon. Start earning the required certifications so you're ready when it launches.",
"intro": [
"This course provides a comprehensive pathway to becoming a Certified Full Stack Developer, covering all the essential technologies required to build modern, scalable web applications from start to finish.",
"Through a blend of interactive lessons, coding exercises, and real-world projects, you will master both frontend and backend development. You'll work with HTML, CSS, and JavaScript to build responsive user interfaces, explore React and TypeScript for advanced web applications, and learn to manage data with relational databases - and on the backend, you'll use Git, Npm, Node.js, and Python to create powerful server-side solutions.",
"By the end of this course, you'll have the practical skills and experience to confidently develop complete web applications, preparing you for a successful career as a Full Stack Developer.",
"This certification will take you a substantial amount of time and effort to complete. If you start now, you may be ready to start the remaining material and final exam when we launch it in the coming months."
"This certification represents the culmination of your full stack developer journey. It demonstrates your ability to build complete, modern web applications from start to finish.",
"To qualify for the exam, you must earn the following certifications:",
"- Responsive Web Design Certification",
"- JavaScript Certification",
"- Front End Development Libraries Certification",
"- Python Certification",
"- Relational Databases Certification",
"- Back End Development and APIs Certification",

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Fix grammar in Full Stack Developer v9 note (you're progressyour progress)

Minor text bug in user-facing copy:

  • "you're progress is saved" should be "your progress is saved".

Other v9 note strings look fine.

-    "note": "If you were previously working through our full stack curriculum, don't worry - you're progress is saved. We split it into smaller certifications for you to earn along your journey. This certification is currently in development and will be available soon. Start earning the required certifications so you're ready when it launches.",
+    "note": "If you were previously working through our full stack curriculum, don't worry - your progress is saved. We split it into smaller certifications for you to earn along your journey. This certification is currently in development and will be available soon. Start earning the required certifications so you're ready when it launches.",
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"note": "If you were previously working through our full stack curriculum, don't worry - you're progress is saved. We split it into smaller certifications for you to earn along your journey. This certification is currently in development and will be available soon. Start earning the required certifications so you're ready when it launches.",
"intro": [
"This course provides a comprehensive pathway to becoming a Certified Full Stack Developer, covering all the essential technologies required to build modern, scalable web applications from start to finish.",
"Through a blend of interactive lessons, coding exercises, and real-world projects, you will master both frontend and backend development. You'll work with HTML, CSS, and JavaScript to build responsive user interfaces, explore React and TypeScript for advanced web applications, and learn to manage data with relational databases - and on the backend, you'll use Git, Npm, Node.js, and Python to create powerful server-side solutions.",
"By the end of this course, you'll have the practical skills and experience to confidently develop complete web applications, preparing you for a successful career as a Full Stack Developer.",
"This certification will take you a substantial amount of time and effort to complete. If you start now, you may be ready to start the remaining material and final exam when we launch it in the coming months."
"This certification represents the culmination of your full stack developer journey. It demonstrates your ability to build complete, modern web applications from start to finish.",
"To qualify for the exam, you must earn the following certifications:",
"- Responsive Web Design Certification",
"- JavaScript Certification",
"- Front End Development Libraries Certification",
"- Python Certification",
"- Relational Databases Certification",
"- Back End Development and APIs Certification",
"note": "If you were previously working through our full stack curriculum, don't worry - your progress is saved. We split it into smaller certifications for you to earn along your journey. This certification is currently in development and will be available soon. Start earning the required certifications so you're ready when it launches.",
"intro": [
"This certification represents the culmination of your full stack developer journey. It demonstrates your ability to build complete, modern web applications from start to finish.",
"To qualify for the exam, you must earn the following certifications:",
"- Responsive Web Design Certification",
"- JavaScript Certification",
"- Front End Development Libraries Certification",
"- Python Certification",
"- Relational Databases Certification",
"- Back End Development and APIs Certification",
🤖 Prompt for AI Agents
In client/i18n/locales/ukrainian/intro.json around lines 7438 to 7447, the note
string contains a grammatical error "you're progress is saved"; update that
substring to "your progress is saved" so the user-facing copy reads correctly,
keeping the rest of the sentence and punctuation unchanged.

Comment on lines +49 to 55
value: string | undefined,
error: unknown,
isURL: boolean,
name: string
) => {
if (!value) return null;
let validationError: string | undefined;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Early return in nullOrWarning will suppress all errors/warnings for empty values

With if (!value) return null;, any empty value short-circuits the function, so:

  • sourceCodeLinkExistsValidator and other validators never run on empty strings.
  • error (e.g. “required” or other form-level errors) is also ignored when the field is empty.

This likely means required GitHub/source-code link messages no longer appear when the field is blank. If that’s not intentional, consider letting explicit errors still show while skipping URL/aux validators for empty values, e.g.:

-  ) => {
-    if (!value) return null;
+  ) => {
+    if (!value && !error) return null;

This preserves the “no warnings on untouched/empty fields” behaviour, while still surfacing real errors from the form layer.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
value: string | undefined,
error: unknown,
isURL: boolean,
name: string
) => {
if (!value) return null;
let validationError: string | undefined;
value: string | undefined,
error: unknown,
isURL: boolean,
name: string
) => {
if (!value && !error) return null;
let validationError: string | undefined;
🤖 Prompt for AI Agents
In client/src/components/formHelpers/form-fields.tsx around lines 49 to 55, the
early return "if (!value) return null" suppresses all validators and hides
explicit form errors for empty values; instead, remove the unconditional early
return and change logic so that when value is empty you skip only URL/aux
validators (like sourceCodeLinkExistsValidator) but still check and return any
provided "error" (or other form-level errors) so required/validation messages
surface for blank fields; implement by branching on !value: run error-handling
path that returns the explicit error/warning, otherwise run the full set of
validators.

Comment on lines 117 to +123
- **Block Quotation (`blockquote`) element**: used to represent a section that is quoted from another source. This element has a `cite` attribute. The value of the `cite` attribute is the URL of the source.

```html
<blockquote cite="https://www.freecodecamp.org/news/learn-to-code-book/">
"Can you imagine what it would be like to be a successful developer? To have built software systems that people rely upon?"
</blockquote>
```

- **Citation (`cite`) element**: used to attribute the source of the referenced work visually. Marks up the title of the reference.

```html
<div>
```html
<blockquote cite="https://www.freecodecamp.org/news/learn-to-code-book/">
"Can you imagine what it would be like to be a successful developer? To have built software systems that people rely upon?"
</blockquote>
<p>
-Quincy Larson, <cite>How to learn to Code and Get a Developer Job [Full Book].</cite>
</p>
</div>
```
```

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Clarify that blockquote’s cite attribute is optional, not required

The text says the blockquote “has a cite attribute” and that the value is the URL. In HTML, cite is optional and can reference the source in other ways (e.g., URN, DOI, not only URLs). Consider rephrasing to “can have a cite attribute whose value identifies the source (often a URL)”.

🤖 Prompt for AI Agents
In
curriculum/challenges/english/blocks/review-semantic-html/671a83934b61f64cefe87a61.md
around lines 117 to 123, the text currently states that blockquote "has a cite
attribute" and implies it's required and only a URL; change the wording to make
cite optional and more flexible—for example, say the blockquote "can have a cite
attribute whose value identifies the source (often a URL, but can be other
identifiers like URNs or DOIs)"—and update the surrounding sentence to reflect
that cite is optional rather than required.

Comment on lines 157 to 167
- **Contact Address (`address`) element**: used to represent the contact information.
- **(Date) Time (`time`) element**: used to represent a date and/or time. The `datetime` attribute is used to translate dates and times into a machine-readable format.

```html
<p>
The reservations are for the <time datetime="20:00">20:00 </time>
</p>
```
```html
<p>
The reservations are for the <time datetime="20:00">20:00 </time>
</p>
```

- **ISO 8601 Date (`datetime`) attribute**: used to represent dates and times in a machine-readable format. The standard format is `YYYY-MM-DDThh:mm:ss`, with the capital `T` being a separator between the date and time.
- **Superscript (`sup`) element**: used to represent superscript text. Common use cases for the `sup` element would include exponents, superior lettering and ordinal numbers.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Align time / datetime example with the ISO 8601 explanation

You describe the datetime value using the full ISO 8601 date‑time format (YYYY-MM-DDThh:mm:ss), but the example only uses 20:00. For consistency and clarity, consider an example like:

<time datetime="2025-12-17T20:00">8:00 PM on December 17, 2025</time>

so learners see a concrete ISO‑style value that matches the text.

🤖 Prompt for AI Agents
In
curriculum/challenges/english/blocks/review-semantic-html/671a83934b61f64cefe87a61.md
around lines 157–167, the time/datetime example uses only "20:00" while the
explanatory text references full ISO 8601 format; update the example to include
a full ISO 8601 datetime value (e.g., YYYY-MM-DDThh:mm or YYYY-MM-DDThh:mm:ss)
in the datetime attribute and provide a human-friendly content string so the
example matches the written explanation and demonstrates both machine-readable
and readable forms.

Sign in to join this conversation on GitHub.
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

1 participant