Guide
How Competence works, how to run a round, and what every number means.
1. The method
Based on Andy Sawyer, "Implementing a Skills Matrix Across Data Teams". Each person rates every skill twice:
- Skill level
- How good they are at it now.
- Desire
- How much they want to develop it. A skill someone is good at but doesn't want to do is a different situation from one they're keen on.
Skill level uses the Fibonacci scale 0, 1, 2, 3, 5, 8: the growing steps reflect that skill grows non-linearly, make the top levels deliberately hard to reach, and make people choose instead of rating everything "in the middle". Desire has three points, as in the article: interest doesn't grow like skill, and three clear statements are quicker to answer and more consistent. The article numbers them 0, 1, 2; here they are 1, 2, 3, so that no interest doesn't wipe out a skill in competency (below). Blank means "not assessed", which is not the same as the lowest point. What each score means for this team:
| Score | Skill level | Desire |
|---|---|---|
| {{ l }} | {{ labels.level[l] }} | {{ labels.desire.get(l, "") }} |
These texts can be changed in Admin → Level texts.
- Self and agreed
- The person first rates themselves (self). If talking it through with the group changes a rating, that goes in agreed. Most skills only have a self-rating.
- Level used
- The agreed rating if there is one, otherwise the self-rating. Every figure uses this. Example: self 5, agreed blank → 5. Self 5, agreed 3 → 3.
- Competency
- Level used × desire, from 0 to 24. Desire weights the skill: 1 (not interested) keeps the level, 2 doubles it, 3 (passionate) triples it. High when someone is both good at and keen on a skill.
- Role target
- The level each role should reach in each skill. Blank means no target for that role. Gap = level used − target: negative is below target.
2. Running a round
- Before: check that skills, roles and targets fit the team (section 5) and that everyone is listed in Admin → People.
- Start the round on the Rounds page with a label (e.g. "2026-Q4") and a date. The date decides the order of rounds, and with it what pre-fills and what "previous round" means; a round without a date counts as the newest.
- Start each assessment on the round page and pick the person's role (and team, if you use teams) for this round. It is pre-filled from their previous assessment: self = last round's level used, agreed = blank, desire carried over. Retired skills are left out.
- Rate: each dropdown saves as soon as it changes. Highlighted dropdowns differ from last round, and Last shows last round's level · desire. Go through the self-ratings, then set agreed only where the discussion changes one. "What the levels mean" explains each score, and hovering an option shows its text too. With two or more tags in use, the form can be filtered by tag.
- Afterwards:
- Team overview: headline figures with the change since the previous round, then per-skill figures and flags. Click a column heading to sort.
- Heatmap: skills × people, showing level, desire, competency or gap.
- Person profile: biggest gaps, top interests, changes since the previous round, and the development goals.
- Compare: any two rounds, for the team or one person, with a trend across all rounds.
- People: each person's newest round, role, team, open goals and certifications needing attention.
3. What the numbers mean
All figures use level used and today's role targets, including for past rounds: changing a target changes old gaps too. The team overview compares with the previous round using today's skills, so a skill added since then counts as not assessed then.
Levels, desire and competency are summed up with the median, not the average: the middle value when everyone's ratings are put in order, and with an even number the lower of the two middle ones (of 3 and 5: 3). The scale is uneven (0, 1, 2, 3, 5, 8), so an average like 4.3 is a level nobody holds; the median is always a point on the scale. The other side: a median moves in steps (3 to 5) and can stay put while a few people improve, so small changes may not show. A category's median is the median of its skills' medians.
On the compare page, "Only changed skills" keeps a skill when someone assessed in both rounds has a different level used or desire for it (going from unrated to rated counts). People who joined or left in between don't count, and two people moving in opposite directions still do, even if the team median stays the same. "Retired in between" lists skills retired between the two rounds and leaves them out of the figures; it needs both rounds to have a date.
Teams
Several teams can share the same skills, roles and targets. A person's team is recorded per round, like their role, so someone who moves keeps their old rounds under the old team. With a team chosen, every figure covers that team only, and a comparison with an earlier round uses who was in the team then. Experts needed applies to each team on its own. Certifications follow a person's team in their latest assessment.
Each team can choose the skill categories it uses (Admin → Teams). Its rating forms and team views then only show those skills, so a small team's figures aren't full of skills it never uses; "show every category" on the rating page still allows rating one outside them. The "Everyone" views always count every skill and every person, so the teams' figures don't add up to Everyone's: ratings outside a team's categories, and people without a team that round, only count there.
Per skill (team overview)
- Assessed
- People with a level for the skill.
- 3+ and 5+
- People at level 3 or more (can work independently) and 5 or more (advanced). 5+ is shown against the skill's experts needed.
- Below target, shortfall
- People below their role's target, and the points they are below it, added up.
- Priority-weighted shortfall
- Priority (1–3) × shortfall. Use it to rank what matters most.
- Development candidates
- People with desire 3 (passionate) and level 2 or below: they want it and aren't there yet.
Flags
Checked in this order; a skill gets the first that applies, and only once someone has been assessed in it:
-
{% for name, rule in flags %}
- {{ name }}
- {{ rule }} {% endfor %}
With the default settings (2 experts needed for priority 3), "{{ flags[1][0] }}" fires before "{{ flags[2][0] }}" can. Set experts needed to 1 for a skill to see key-person risks.
Headline figures
- At or above role target
- Share of rated person × skill pairs that have a target and meet it.
- Priority-weighted shortfall per person
- The skills' weighted shortfalls added up and divided by the people assessed. A total would grow with the size of the team; per person, teams and rounds can be compared.
- Team gaps, below expert target, key-person risks
- How many skills carry each flag.
- Open development goals
- Goals that are open or in progress now; this count has no history per round.
Person profile and heatmap
- Top priority gaps
- Skills furthest below target, weighted by priority (priority × points below).
- Top interests
- Desire 2 or 3, highest desire first, then lowest current level.
- Goals
- Progress compares the level used in the round you're looking at with the goal's target level.
- Heatmap
- Skills × people, coloured by level, desire, competency or gap. Click a cell to open that rating.
4. Certifications
Qualifications that are held or not, usually with an expiry date: safety training, licences, cloud or security certifications. They aren't part of rounds; their status is worked out from the dates, as of today:
-
{% for key, label in cert_statuses %}
- {{ label }}
- {{ cert_rules[key] }} {% endfor %}
Which certifications are required depends on the role in a person's latest assessment; someone not assessed yet has none required. Renewing adds a new record and keeps the old one as history; the newest record counts. A record entered by mistake can be deleted. Changing how long a certification stays valid only affects records added afterwards. "Nobody holds it" marks a certification no active person has a valid one of.
5. Changing skills, roles and targets
The starting targets, priorities and experts needed in the shipped catalogues are the author's judgement, not a standard. Review them in Admin → Role targets and Admin → Skills before the first real round.
- Nothing breaks history
- Ratings point at a skill's permanent id, so renaming or moving a skill is safe. Anything with ratings, goals or records is retired (hidden from new rounds, kept in old ones), never deleted. Only unused skills and empty rounds can be deleted.
- Renaming a category
- Admin → Skills, "Rename category" under its heading. All its skills, retired ones too, and the teams that use it follow. To merge two categories, move the skills one by one instead.
- Splitting a skill
- Add the new skills with "copy ratings from" the old one, which copies its ratings from the latest round that has any, then retire the old skill.
- Targets
- Admin → Role targets. With one category shown, the first row sets a role's target for all its skills at once; set the usual level first, then the exceptions. A new skill's suggested targets are the median of its category.
- Priority and experts needed
- Per skill. Priority 3 = crucial now, 2 = useful, 1 = niche.
- Tags
- Optional short labels that cut across categories (e.g. R / Python). A blank tag shows no badge. With two or more in use, pages can be filtered by tag.
- Another team
- A new database can start from a catalogue file instead of the data-team one:
competence init --catalogue empty(one role, no skills),--catalogue dev(a software team), or your own file (empty.tomlin the package explains the layout). Admin → "Export the catalogue" saves this database's catalogue as such a file, without people or ratings. After that, everything is changed here in Admin.
6. Your data
- Personal data
- Ratings are personal data about employees. The app runs on this computer only and can't be reached from other machines. Keep the computer's disk encrypted.
- Where
- This database is
{{ db_path }}. - Backups
- The database is copied to
{{ backups }}every time the app starts, and before each "Set all" in the targets grid. The newest 20 per database are kept. Only the app's own backups are trimmed: a copy you rename (e.g.matrix-before-cleanup.sqlite) is never deleted. - Going back
- There is no undo. To go back to a backup, stop the app and copy the backup over the database file above; anything entered after that backup is lost.
- Off-machine copies
- The backups are on the same disk as the database, so they don't protect against losing the computer. Ask IT how to keep an encrypted copy elsewhere.