feat(templates): give CvSkill the level as the document words it - #628
Merged
Merged
Conversation
A rated skill could say how much — a number in [0, 1] a preset draws as dots or a meter — or it could say it in words by not being a skill at all and living in a RowsSection instead. It could not say both, which is why CharcoalGold sets its languages as rows: that design writes "Native" and "B2 – Upper Intermediate" out, and a number could not carry them back. A design that shows a rating and names it in the same line had nowhere to go. CvSkill now carries `note`, a plain string blank when absent, reachable through CvSkill.of(name, level, note). The two channels stay separate because a number cannot carry a wording and a wording cannot be measured into a meter; a preset draws whichever it has room for, or both. The two-argument constructor and both existing factories are kept explicitly, so existing calls compile and link unchanged and every skill built through them still carries no note.
This was referenced Aug 31, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why
A rated skill could say how much — a number in
[0, 1]a preset draws as dots or a meter — or it could say it in words, by not being a skill at all and living in aRowsSectioninstead. It could not say both. That is whyCharcoalGoldsets its languages as rows and says so in its documentation: that design writes "Native" and "B2 – Upper Intermediate" out, and a number could not carry them back.The next CV in the promotion queue shows a rating and names it on the same line — "Spanish · Professional Working · ●●●○○" — and had nowhere in the model to put it.
What
CvSkillcarriesnote: the level as the document words it. A plain string, blank when absent, like the fields beside it, and reachable throughCvSkill.of(name, level, note).The two channels stay separate rather than one becoming a formatted string, because a number cannot carry a wording and a wording cannot be measured into a meter — a preset draws whichever of the two it has room for, or both.
The two-argument constructor and both existing factories are kept explicitly, so existing calls compile and link unchanged; only a record deconstruction pattern over
CvSkillsees the extra component.Tests
./mvnw -B -ntp clean verify -pl :graph-compose-core,:graph-compose-render-pdf,:graph-compose-render-docx,:graph-compose-render-pptx,:graph-compose-templates,:graph-compose-testing,:graph-compose-qa,:graph-compose-coverage -am— BUILD SUCCESS.CvSkillNoteTest(7) pins what the note normalises — null and blank become empty, surrounding space is trimmed — and that every way of building a skill that predates it still compiles and still produces a skill without one, includingSkillGroup.of(category, names…).Every CV preset passes its snapshot and pixel gates untouched, which is the proof that nothing already drawn moved.