Skip to content

feat: narrative front page + interviewer kit (render-only, rule-derived) #54

Description

@gkanitz

Context

Slice E of the v0.2 "Meaning" wave. Shared design context:
docs/superpowers/specs/2026-07-04-impact-roadmap-design.md (PR #47).

Recruiters think in roles and stories, not counts. This slice adds a
narrative paragraph describing the shape of the subject's collaboration
(authoring↔reviewing mix and its trajectory) and an interviewer kit — three
probe questions derived from the strongest signals. Everything is
render-layer, derived from already-attested numbers via published,
deterministic rules.

Goal (vertical slice)

Rule functions over the report struct → narrative sentences + interviewer
probes → rendered front-page section + derivation annex, end to end.
No schema change, no fetching.

In scope

  • Pure, unit-testable rule functions in render (or a small sub-package),
    each with a stable rule ID.
  • Profile-mix rule: r = reviews_given.total / pull_requests.authored;
    r > 1.5 → review-weighted phrasing; r < 0.67 → authoring-weighted;
    otherwise balanced. authored == 0 → the authoring comparison is skipped
    (never a division blow-up or filler sentence).
  • Trajectory rule: split the cadence trend buckets into first/second
    half; compute r per half from bucket counts; skip the sentence when either
    half has < 10 combined events. Relative shift > +0.30 → "shifted toward
    reviewing"; < −0.30 → "shifted toward authoring"; otherwise no sentence.
  • Interviewer kit: exactly three probes chosen by documented priority:
    (1) deep reviews present → how they give review feedback; (2) rework stats
    present → how they handle revision cycles; (3) time-to-merge present → how
    they scope PRs; (4) cadence trend present → consistency habits;
    (5) language mix present → depth in the top language. Take the first
    three whose data exists; fewer only when fewer exist. Each phrased as a
    question for the interviewer, grounded in the number it cites.
  • Derivation annex: the technical annex lists every rule that fired
    (rule ID + one-line explanation), fulfilling the spec's "how this
    narrative was derived" honesty requirement.
  • Sentence templates enumerated in testdata, keyed by rule ID.
  • Rule semantics changes require an owner comment on this issue; phrasing
    refinement is free as long as goldens and the wordlist tests pass.

Out of scope

Design constraints

Acceptance criteria — TDD

Success (write these tests first; all must pass)

  1. Rule-function unit tests: profile mix at r = 1.51 (review-weighted),
    0.66 (authoring-weighted), 1.0 (balanced), authored = 0 (skip);
    trajectory at +0.31 (fires), +0.29 (silent), sparse halves (silent).
  2. Golden narratives for fixture permutations: review-weighted,
    authoring-weighted, balanced, with/without trajectory, sparse report
    (minimal sections) — each renders the expected sentences and nothing
    else. No placeholder text ever ("N/A", "unknown", empty braces).
  3. Interviewer kit: full report → exactly 3 probes in priority order;
    report missing rework and languages → the next-priority probes fill in;
    minimal report → fewer probes, section omitted entirely when zero.
  4. Every numeral rendered in narrative/probes also appears in the report
    JSON (extraction test) — the narrative can never invent a number.
  5. Derivation annex lists exactly the rule IDs that fired, matching the
    goldens.
  6. Wordlist test over narrative + probes: no grading adjectives
    (excellent, strong, weak, slow, fast, top, elite, poor)
    and no seniority labels (junior, senior, staff, principal).
  7. Prohibited-strings golden test passes over the new section.
  8. Reports without the narrative's inputs still render (graceful omission,
    no errors) — asserted on the sparse golden.

Failure — QA red flags (any one observed → reject the PR)

  • A sentence not traceable to a listed rule ID, or an annex listing rules
    that did not fire.
  • Invented or derived-but-unattested numbers in copy.
  • Grading/seniority vocabulary, or judgment phrasing smuggled into
    templates.
  • Placeholder text in any permutation.
  • Rule semantics differing from this issue without owner sign-off in the
    issue thread.

Parallel-work contract

  • Territory: render/ — new rules file(s), new template partial (new
    numbered section file before 30-collaboration, e.g.
    render/templates/sections/25-narrative.tmpl), testdata goldens.
  • Shared, additive-only: render/render.go (wiring),
    render/templates/layout.tmpl (include line).
  • Depends on: feat: banded context layer — cited typical ranges under every KPI #48 merged first is recommended (front page reads better
    with context lines present and goldens then settle once), but there is no
    build dependency. Golden-file conflicts with parallel render slices are
    expected — merges are serialized; rebase and regenerate.

Definition of done

TDD skill followed; all success criteria green; go test ./... passes;
PR references this issue.

Metadata

Metadata

Assignees

No one assigned

    Labels

    readyLoop-ready: this org's picker reads this labelready-for-agentTriage complete; ready for an agent to pick up

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions