- Shipped
- August 12, 2026 at 8:47 PM UTC
- Author
- Kamo
- Commit
- 8c6ee4b
Both summarize methods are @Transactional(readOnly = true). Each issues six or seven reads whose figures are cross-checked ACROSS query boundaries: countOverdueByMemberForOrg's own javadoc promises the per-member figures sum to `overdue`, an invariant spanning two separate reads that can only hold under one snapshot. Without it each read commits on its own and a delivery landing mid-summary makes the compliance matrix disagree with the pillar above it. envelopeMissing -> executionIncomplete. The field never measured a missing envelope: it read the EXECUTION_INCOMPLETE bucket straight off the histogram. The real signal — a signable document with no envelope — is the PRE-delivery defect **************** reports, a different fact at a different lifecycle point. Renamed rather than reimplemented because the UI label ("Execution incomplete") was already honest, so the identifier was the only thing lying about itself; the org-level envelope-missing query remains unbuilt and the javadoc says so rather than leaving it implied by a name. averageScore is one AVG over GRADED_STATES, org-wide. It sampled the 200 most recently DELIVERED assignments while passRate was org-wide, so a card could print "83% pass rate / mean score 55" with both true of different people — and the sample was drawn on DELIVERY, which correlates with nothing about scoring: one large assignment delivered this morning displaced every graded row and the mean went null while the pass rate sat unchanged. The pass rate's denominator now reads the same GRADED_STATES constant, so the two populations cannot drift apart by edit. Null-when-nothing-graded is preserved on both. WIRE CHANGE: legal.envelopeMissing -> legal.executionIncomplete. HrResourceAccess -> HrSummaryAccess: it has always gated all three blocks and canReadAnything is the whole endpoint's admission check, so a name scoped to resources understates its blast radius. AttentionRow.daysOverdue said "always positive"; DAYS.between truncates, so a row two hours overdue reads 0. Non-negative — presence in the list is the test for lateness, not `> 0`. The overdue predicate split is untouched: legal OPEN_STATES, training REMINDABLE_STATES, AWAITING_GRADING never overdue.