docs/access-control-audit.md's escrow table has a row: refund (at/after deadline) | Permissionless (deliberate) | none | unchanged | Match. This audit was written for #30, which closed before #49's fix landed — #49 ("release() has no deadline check — a sponsor can race permissionless refund() to steal back funds from an already-merged contributor") is what introduced GRACE_PERIOD (14 days). As implemented today, refund's permissionless path doesn't open "at/after deadline" at all — it opens at deadline + GRACE_PERIOD, per contracts/escrow/src/lib.rs's refund(): if now < escrow.deadline + GRACE_PERIOD { /* admin only */ }. The audit table's description of when this row's access level kicks in is now factually incorrect, not just incomplete (distinct from the separately-filed issue about this table missing rows for functions added after the audit — this is about an existing row's content being wrong). Update the row to say "at/after deadline + GRACE_PERIOD" and cross-reference #49.
docs/access-control-audit.md's escrow table has a row:refund (at/after deadline) | Permissionless (deliberate) | none | unchanged | Match. This audit was written for #30, which closed before #49's fix landed — #49 ("release() has no deadline check — a sponsor can race permissionless refund() to steal back funds from an already-merged contributor") is what introducedGRACE_PERIOD(14 days). As implemented today,refund's permissionless path doesn't open "at/after deadline" at all — it opens atdeadline + GRACE_PERIOD, percontracts/escrow/src/lib.rs'srefund():if now < escrow.deadline + GRACE_PERIOD { /* admin only */ }. The audit table's description of when this row's access level kicks in is now factually incorrect, not just incomplete (distinct from the separately-filed issue about this table missing rows for functions added after the audit — this is about an existing row's content being wrong). Update the row to say "at/after deadline + GRACE_PERIOD" and cross-reference #49.