BL-021 - the critical-reopen mail reaches the PM and CM, at last
project_sop_team() read sop.data['project']; pushSOP stores every row as
data={sop, state}, so the project block is one level deeper. The lookup
returned [] for every real row, silently, and the on-hold email promised to
'Owner + PM + CM + distribution' has reached only owner + distribution since
the day it shipped. One line: the same nested-first tolerant read
project_qa_group has used all along (whose docstring logged this very bug).
New probe critical_reopen_check (11): the fixture writes the PRODUCTION shape
- a hand-built flat row would have passed against the bug, which is exactly
how it went unverified this long. Sink-verified end to end: assignee + PM +
CM and nobody else; constraint name, title, location, deep link and the house
footer in the body (the footer this body alone used to lack, fixed at CR-014).
Items: BL-021 (closed), CR-011 recipients.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -1623,15 +1623,22 @@ def project_sop_team(db: Session, project_id: Optional[str]) -> list[str]:
|
||||
).first()
|
||||
if not sop:
|
||||
return []
|
||||
proj = (sop.data or {}).get("project") or {}
|
||||
data = sop.data or {}
|
||||
# BL-021, fixed 2026-08-20: pushSOP writes the row as data={sop, state}, so
|
||||
# the project block lives at data['sop']['project']. This read was one
|
||||
# level too shallow - always {} - and the critical-reopen mail never
|
||||
# reached the PM or CM its docstring promises. Same tolerant read as
|
||||
# project_qa_group below: nested shape first, flat shape for hand-written rows.
|
||||
proj = ((data.get("sop") or {}).get("project")
|
||||
or data.get("project") or {})
|
||||
return [i for i in (proj.get("pmId"), proj.get("cmId")) if i]
|
||||
|
||||
|
||||
def project_qa_group(db: Session, project_id: Optional[str]) -> list["models.User"]:
|
||||
"""D2: the QA group named on the project's latest complete SOP. pushSOP writes
|
||||
the row as data={sop, state}, so the project block is data['sop']['project'] -
|
||||
note that project_sop_team above reads data['project'], which that shape never
|
||||
has (BL-021, logged, not fixed here)."""
|
||||
project_sop_team above read the flat shape until BL-021 was fixed
|
||||
(2026-08-20); both now read nested-first, exactly alike."""
|
||||
if not project_id:
|
||||
return []
|
||||
sop = db.scalars(
|
||||
|
||||
Reference in New Issue
Block a user