Non-blocking LOW findings from the M2-S2 (#188) review:
ContactsGrpcService::sync doesn't validate empty account_id (List/Get/Create do) — add the same invalid_argument guard for symmetry.
get_contact is not account-scoped (any authenticated caller can fetch any contact by id) — defer to a future per-account authz story (also affects other read RPCs; whole-daemon authz model).
Contact::new id = ct_{millis}_{pid} + INSERT OR REPLACE: two CreateContact calls in the same millisecond/process collide and silently overwrite. Switch to a UUID. (Pre-existing from M2-S1; CreateContact is the first caller depending on it.)
CLI contact add success string 'saved to address book' → say 'local address book (not yet synced to a server)' to preempt the created-but-not-synced foot-gun (proto/JSON layers already disclose local-only).
Non-blocking LOW findings from the M2-S2 (#188) review:
1. `ContactsGrpcService::sync` doesn't validate empty `account_id` (List/Get/Create do) — add the same `invalid_argument` guard for symmetry.
2. `get_contact` is not account-scoped (any authenticated caller can fetch any contact by id) — defer to a future per-account authz story (also affects other read RPCs; whole-daemon authz model).
3. `Contact::new` id = `ct_{millis}_{pid}` + `INSERT OR REPLACE`: two CreateContact calls in the same millisecond/process collide and silently overwrite. Switch to a UUID. (Pre-existing from M2-S1; CreateContact is the first caller depending on it.)
4. CLI `contact add` success string 'saved to address book' → say 'local address book (not yet synced to a server)' to preempt the created-but-not-synced foot-gun (proto/JSON layers already disclose local-only).
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Non-blocking LOW findings from the M2-S2 (#188) review:
ContactsGrpcService::syncdoesn't validate emptyaccount_id(List/Get/Create do) — add the sameinvalid_argumentguard for symmetry.get_contactis not account-scoped (any authenticated caller can fetch any contact by id) — defer to a future per-account authz story (also affects other read RPCs; whole-daemon authz model).Contact::newid =ct_{millis}_{pid}+INSERT OR REPLACE: two CreateContact calls in the same millisecond/process collide and silently overwrite. Switch to a UUID. (Pre-existing from M2-S1; CreateContact is the first caller depending on it.)contact addsuccess string 'saved to address book' → say 'local address book (not yet synced to a server)' to preempt the created-but-not-synced foot-gun (proto/JSON layers already disclose local-only).