v1.9.0
Contributor identity
- Git addresses bind to board contributors as events — anyone may link, only the link's author or its target may retract.
- Commit authors resolve to the contributor who owns the address, so a person's commits group under one name instead of a second lane. Unclaimed or contested addresses fall back to the raw git name.
- New identity panel behind the header avatar: who you are, which addresses are yours, and which are claimed by two people and resolve to neither.
- Claim addresses at setup, from the panel, or with :emails in the TUI (:emails-unclaim releases one). Over MCP: epiq_contributor_email_link, _unlink, _suggest, _list.
- Nothing links itself — no board write claims an address you didn't pick.
Setup
- Answered step by step rather than retyped: each step opens the next, tab-completes, and arrives seeded with git's name and address.
- Declining works with no board present, and is remembered per board rather than once per machine.
- npm run start:scratch-board walks setup against a throwaway repo on an unconfigured machine.
Code tab
- A ticket's commits as one compacted diff: the oldest's parent against the newest, narrowed to the ticket's own files, naming the files where another ticket's commit landed in the range.
- Comments, filed tickets and review ticks work in that view. Only what can be anchored truthfully is offered.
- The chosen view rides in the URL as ?diff=compacted|commits, so a link names the view it was written about.
- Cards carry their commits' diff stat beside the ref; clicking it opens the ticket on its Code tab.
- Ref matching is pinned to one line of history — a rebase copy on a stale branch was making ranges straddle a divergence (51 files for a ticket that touched three).
TUI
- Enter on a commit reads its patch in the terminal, coloured by what changed rather than by language; o still hands it to the editor.
- Enter on a diff line starts a comment — the same comment the GUI writes. A line that already has one carries a rule in the margin.
- Command-line history outlives the app, kept per project.
- Shift moves the cursor five rows at a time and stops at the ends.
Event log and timeline
- The log covers the whole window, and lists only what the board on screen can act on.
- Ticket refs preview on hover: title, lane, and the opening of the description.
- The bar, timeline and log take a ground of their own below the board.
Internals
- lib/event is now generic over its event map; lib/board is the board as one product on it.
- An event says who by id and the display name comes from the contributor registry, so a rename travels as an event.
Upgrading
- Log files are now named .jsonl. 1.9.0 reads the old ..jsonl form unchanged, but a 1.8.x client reading logs written by 1.9.0 attributes those lines to unknown. On a shared board, upgrade together.