Skip to content

attention: own-PR team requests demand the team; triage becomes a per-repo choice - #22

Merged
eslerm merged 2 commits into
chainguard-sandbox:mainfrom
eslerm:attention-honesty
Aug 13, 2026
Merged

attention: own-PR team requests demand the team; triage becomes a per-repo choice#22
eslerm merged 2 commits into
chainguard-sandbox:mainfrom
eslerm:attention-honesty

Conversation

@eslerm

@eslerm eslerm commented Aug 13, 2026

Copy link
Copy Markdown
Collaborator

Two judgment fixes and one disclosure in the attention derivation, all
read-side — found by daily use of the archive against real repos — plus
one gate hardening the change itself demanded.

  • A team review request on the viewer's own PR no longer lands in
    waiting_on_me.
    An author cannot review their own PR, so the request
    demands the rest of the team. The exclusion rests on
    login_eq(author, viewer) — structural certainty, not uncertainty, so
    it suppresses no demand addressed to the viewer (GitHub forbids
    user-kind self-requests; only the team path reaches this case). In real
    use this was ~8 of 39 waiting_on_me rows.
  • New per-repo triage config field (default on at project scope,
    refused at working scope, where there is no sweep to gate): turns
    needs_reviewer/untriaged off for repos the operator archives but
    does not route. Read-side like teams — never in the sync fingerprint,
    so editing it re-derives buckets instantly and cold-starts nothing; the
    fingerprint test now pins the exact key set so a read-side knob can
    never leak in unnoticed. Scope chooses what is archived; triage chooses
    what is owed.
  • people_prs rows disclose threads_unresolved — the structural
    discriminator between a stalled PR nobody reviews (zero, days old) and
    one already mid-review. Additive under schema_version: 1.
  • make check now type-checks the fuzz workspace. The harnesses
    reference the main crate's public types, so a rename can orphan the
    exact witness carrying the renamed invariant; this diff was its own
    first catch — attention_derive still spelled the old field and
    asserted the old polarity until the new gate leg flagged it. Stable
    cargo suffices to type-check; seconds of cost.

Verification: make check green including the new leg; the bucket
oracle sweeps the full signal cube with both polarity directions pinned
(a request on someone else's PR is never suppressed; a request on your
own is never yours); one integration witness per change (own-PR
exclusion with a declared-team control; the triage flip on one archive
proving only the maintainer buckets move); the repaired attention_derive
harness carries both request-polarity directions and ran a 10.9M-execution
soak with zero findings; attention goldens regenerated additive-only;
diff mutation sweep 30 mutants, 28 caught, 2 unviable, 0 missed.

eslerm added 2 commits August 13, 2026 13:39
…a per-repo choice

Two judgment fixes and one disclosure, all read-side.

A team review request reaching the viewer on their OWN PR no longer lands
in waiting_on_me: an author cannot review their own PR, so the request
demands the rest of the team. The exclusion rests on login_eq(author,
viewer) — structural certainty, not uncertainty, so it suppresses no
demand addressed to the viewer. GitHub forbids user-kind self-requests,
so only the team path could ever reach this case. The oracle test's
polarity assertion narrows accordingly and gains the inverse pin; an
integration witness seats the rule against SQL-fed signals with the
declared-team control alongside.

Project scope stops bundling the maintainer duty with the whole-stream
archive: a new per-repo `triage` field (default on at project scope,
refused at working scope, where there is no sweep to gate) turns
needs_reviewer and untriaged off for repos the operator archives but does
not route. Read-side like `teams` — never in the sync fingerprint, so
editing it re-derives buckets instantly and cold-starts nothing. Scope
chooses what is archived; triage chooses what is owed.

people_prs rows disclose `threads_unresolved` — the structural
discriminator between a stalled PR nobody reviews (zero, days old) and
one already mid-review (many). The judgment stays with the reader.

The attention_derive fuzz harness sweeps with the rename and its
request-polarity witness narrows the same way the oracle did — both
directions now witnessed, so neither regression direction is silent.

Verification: make check green; the bucket oracle sweeps the full signal
cube with both polarity directions pinned; one integration witness per
change (own-PR exclusion with a declared-team control; the triage flip
on one archive proving only the maintainer buckets move); the repaired
fuzz harness ran 10.9M executions in a 45s soak with zero findings;
attention goldens regenerated additive-only; diff mutation sweep 30
mutants, 28 caught, 2 unviable, 0 missed.
The harnesses reference the main crate's public types, so a rename there
can orphan the exact witness that carried the renamed invariant — and
fuzz-targets-check pins only the file/[[bin]] pairing, not compilation.
Stable cargo suffices to type-check (only running targets needs
nightly), so the gate catches it for seconds of cost after the first
build. This diff is its own first catch: attention_derive spelled the
old field name and asserted the old polarity until this gate's dry run
flagged it.
@eslerm
eslerm force-pushed the attention-honesty branch from 93d6d14 to 0584fe8 Compare August 13, 2026 20:39
@eslerm
eslerm merged commit 6a8a5d6 into chainguard-sandbox:main Aug 13, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant