You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Slice D of the v0.2 "Meaning" wave. Shared design context: docs/superpowers/specs/2026-07-04-impact-roadmap-design.md (PR #47).
Research says tech-stack fit is a recruiter's first filter — and the
report currently says nothing about stack. This slice adds a verified
language mix derived from the subject's own merged work. Unlike
CodersRank/GitRoll-style profiles it is attested, private-repo, and never
touches code: extensions and line counts only, via #49's GraphQL diff-shape
path.
Goal (vertical slice)
Diff-shape data (#49) → extension→language aggregation → schema block →
rendered share bar, end to end.
In scope
Embedded curated extension→language mapping (~40 common languages plus
bucket categories Config (yml/yaml/json/toml/ini/xml…), Docs
(md/rst/adoc/txt…), and Other for unknown or extensionless files).
Table-driven tests over the mapping.
Aggregation basis: the subject's merged PRs with diff data; weight = additions + deletions per file; window-wide aggregate only (no per-repo
attribution).
Shares as whole percents; every language < 3 % folds into Other
(privacy safeguard: niche internal tech never leaks).
Suppression: section omitted with a collaboration.suppressed {section: "language_mix", reason: ...} entry
when < 5 merged PRs have diff data. (Shared additive suppressed block is
also described in the PR-size slice; first to merge introduces it.)
Schema (additive): collaboration.language_mix {basis: "merged_pr_diff_lines", pr_count, total_lines, languages [{name, share_pct}], other_share_pct}. total_lines is the summed diff-line
weight behind the shares — the v0.3 career merge needs it to recombine
mixes from multiple source reports line-weighted (spec: Multi-source
composition).
Render: horizontal share bar (existing SVG chart helpers) with an honesty
caption: "basis: diff lines across N merged pull requests". Neutral
presentation — no proficiency claims, this is exposure, not skill grading.
Out of scope
The repo Languages API (must not be called — it describes the repo,
not the subject). Per-language trend over time (later wave). Skill or
proficiency wording.
Mapping table test: representative extensions resolve to their language
(go→Go, ts/tsx→TypeScript, py→Python, …), config/docs extensions
to their buckets, unknown (xyz) and extensionless (``) to Other.
Weighted aggregation over a multi-PR fixture: shares are line-weighted
(not file-counted) and sum to 100 ± 1 after rounding; total_lines
equals the summed additions+deletions of all measured files
(consistency test).
A language at 2 % in the fixture folds into Other and its name appears
nowhere in JSON or HTML; at 3 % it appears.
Section omitted + suppressed entry at 4 merged PRs with diff data;
present at 5.
Provider reports diff shape unsupported → section absent, report still
validates and renders.
Schema round-trip incl. Validate; pre-v0.2 sample JSON still validates.
Rendered golden: share bar with whole-percent labels and the basis
caption naming the measured PR count.
No file path and no seeded prohibited string appears anywhere in output
(extends the seeded-strings test with a below-threshold language name —
e.g. seed Brainfuck at 1 % and assert absence).
Copy contains no proficiency/grading words (expert, proficient, skilled, mastery added to the wordlist test).
Failure — QA red flags (any one observed → reject the PR)
Any call to the repo Languages API or any REST files/diffs endpoint.
A language below the 3 % threshold named anywhere in output.
Per-repo or per-PR language attribution in JSON or HTML.
Context
Slice D of the v0.2 "Meaning" wave. Shared design context:
docs/superpowers/specs/2026-07-04-impact-roadmap-design.md(PR #47).Research says tech-stack fit is a recruiter's first filter — and the
report currently says nothing about stack. This slice adds a verified
language mix derived from the subject's own merged work. Unlike
CodersRank/GitRoll-style profiles it is attested, private-repo, and never
touches code: extensions and line counts only, via #49's GraphQL diff-shape
path.
Goal (vertical slice)
Diff-shape data (#49) → extension→language aggregation → schema block →
rendered share bar, end to end.
In scope
bucket categories
Config(yml/yaml/json/toml/ini/xml…),Docs(md/rst/adoc/txt…), and
Otherfor unknown or extensionless files).Table-driven tests over the mapping.
additions + deletionsper file; window-wide aggregate only (no per-repoattribution).
Other(privacy safeguard: niche internal tech never leaks).
collaboration.suppressed {section: "language_mix", reason: ...}entrywhen < 5 merged PRs have diff data. (Shared additive
suppressedblock isalso described in the PR-size slice; first to merge introduces it.)
collaboration.language_mix {basis: "merged_pr_diff_lines", pr_count, total_lines, languages [{name, share_pct}], other_share_pct}.total_linesis the summed diff-lineweight behind the shares — the v0.3 career merge needs it to recombine
mixes from multiple source reports line-weighted (spec: Multi-source
composition).
caption: "basis: diff lines across N merged pull requests". Neutral
presentation — no proficiency claims, this is exposure, not skill grading.
Out of scope
not the subject). Per-language trend over time (later wave). Skill or
proficiency wording.
Design constraints
feat: GraphQL diff-shape fetch — per-PR file stats without patch content (GitHub + GitLab) #49's type-level guarantee), Full GitHub collaboration metrics (reviews, comments, merge timing, rework) #3 small-slice folding, Volume/cadence context and time-bucketed trends #4 minimum-sample
suppression, GitHub Action wrapper with Sigstore attestation and pinned-version verification #6 prohibited-strings, GitLab provider adapter with cross-adapter parity tests #7 no-judgment copy.
Acceptance criteria — TDD
Success (write these tests first; all must pass)
(
go→Go,ts/tsx→TypeScript,py→Python, …), config/docs extensionsto their buckets, unknown (
xyz) and extensionless (``) toOther.(not file-counted) and sum to 100 ± 1 after rounding;
total_linesequals the summed additions+deletions of all measured files
(consistency test).
Otherand its name appearsnowhere in JSON or HTML; at 3 % it appears.
suppressedentry at 4 merged PRs with diff data;present at 5.
validates and renders.
Validate; pre-v0.2 sample JSON still validates.caption naming the measured PR count.
(extends the seeded-strings test with a below-threshold language name —
e.g. seed
Brainfuckat 1 % and assert absence).expert,proficient,skilled,masteryadded to the wordlist test).Failure — QA red flags (any one observed → reject the PR)
boundary.
Parallel-work contract
metrics/(new languages file + embedded mapping),render/(new chart wiring + template partial), goldens.report/report.go(new block only),render/templates/sections/30-collaboration.tmpl(include line only).suppressedblock with the PR-size slice: identical shape is specified inboth; whoever merges second rebases.
Definition of done
TDD skill followed; all success criteria green;
go test ./...passes;PR references this issue.