Skip to content

feat(templates): give CvSkill the level as the document words it - #628

Merged
DemchaAV merged 1 commit into
feature/template-promotionfrom
feat/cv-skill-note
Aug 31, 2026
Merged

DemchaAV merged 1 commit into
feature/template-promotionfrom
feat/cv-skill-note

Conversation

@DemchaAV

Copy link
Copy Markdown
Owner

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 a RowsSection instead. It could not say both. That is why CharcoalGold sets 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

CvSkill carries note: the level as the document words it. A plain string, blank when absent, like the fields beside it, and reachable through CvSkill.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 CvSkill sees 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, including SkillGroup.of(category, names…).

Every CV preset passes its snapshot and pixel gates untouched, which is the proof that nothing already drawn moved.

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.
@DemchaAV
DemchaAV merged commit 31cdd94 into feature/template-promotion Aug 31, 2026
12 checks passed
@DemchaAV
DemchaAV deleted the feat/cv-skill-note branch August 31, 2026 16:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant