The CV: the employer-shaped projection of the portfolio (DESIGN.md §4).
Strictly a projection — the same entries the timeline shows, curated
by their cv: blocks and ordered by weight, never a second dataset.
Skills are derived from tags across positions and projects, weighted
by duration and recency, each linking back to its story page — a
paper CV claims; this one shows.
today comes from the build options (time is an input, ADR 0005), so
open-ended ranges and the freshness line stay deterministic.
Summary
Functions
Projects the portfolio onto the CV, or nil without a profile —
a CV without a person makes no sense.
Types
@type t() :: %Cherry.CV{ education: [Cherry.Portfolio.Education.t()], oss: [Cherry.Portfolio.OpenSource.t()], positions: [Cherry.Portfolio.Position.t()], profile: Cherry.Portfolio.Profile.t(), projects: [Cherry.Portfolio.Project.t()], skills: [Cherry.CV.Skill.t()], talks: [Cherry.Portfolio.Talk.t()], updated: Date.t() }
Functions
@spec project(Cherry.Portfolio.t(), Date.t()) :: t() | nil
Projects the portfolio onto the CV, or nil without a profile —
a CV without a person makes no sense.
Entries opt in via cv.include (education is included by default:
leaving a degree off a CV is the exception, not the rule).