Repository navigation
Conversation
b73876c to
f4ce87d
Compare
There was a problem hiding this comment.
Ladon verdict: Approve
Approve — clean server-only auth PR with no blocking or medium findings.
What I checked:
- This is a server-only authorization PR: new fail-closed committee-leader mutation service, auth-middleware snapshot rewrite, and Addie tool rebinding. No files under
static/schemas/source/**,docs/reference/**, ordist/**are touched, so no schema↔docs coherence, changeset-scope, oneOf-discriminator, artifact-immutability, or governance-precedent gate applies. - Reviewer confirmed deliberate fail-closed design: bounded WorkOS enforcement client (5s / 0-retry) plus lock_timeout cap in-transaction provider calls; exactly-one-row epoch/audit readbacks roll back on mismatch; request authority is re-hydrated from the primary DB on every path.
- No Critical, High, or Medium findings reported.
High-risk flag: true, but all reasons are (modified) files under server/src/addie/** and server/src/routes/**. Per decision rules, a (modified) high-risk file with no medium-or-higher finding is presumed safe — the flag alone is not an escalation trigger (rows 3 & 5 require a deletion or a medium finding, respectively; neither is present).
Gate checks: gated_paths is false, so row 2 does not fire despite review_decision: REVIEW_REQUIRED. No no-auto-approve team match (row 7 N/A). No prior decision. Fewer than three medium findings (row 8 N/A).
Rows 1–8 all fail to match → row 9 → approve.
The base branch was changed.
b1789a6 to
9b9010f
Compare
c93261a to
77608c1
Compare
| authenticatedWorkosUserId: string, | ||
| selectedOrganizationId: string, | ||
| ): Promise<boolean> { | ||
| const memberships = await workos.userManagement.listOrganizationMemberships({ |
There was a problem hiding this comment.
Medium: listOrganizationMemberships is an unbounded external HTTP call, and it runs twice inside the open transaction — after working_groups and working_group_leaders are locked FOR UPDATE (and, when a row exists, authorization_epochs FOR UPDATE). SET LOCAL statement_timeout/lock_timeout do not bound a JS-side network await; neither does the WorkOS SDK set a default request timeout. Production symptom: a slow or hung WorkOS API leaves this connection idle-in-transaction holding those row locks, so concurrent committee-leadership mutations on the same committee block until the SDK's own TCP timeout releases it — not until lock_timeout. Wrap the provider call in an explicit timeout/abort, or move the authorization decision outside the lock window.
There was a problem hiding this comment.
Ladon verdict: Approve
Approve — security-hardening rewrite of Addie's committee-leader tools, no blocking findings.
This subsequent pass on the #7450 continuation swaps MemberContext identity for an exact authenticated principal enforced by a new transactional service, with fail-closed and concurrency test coverage. Addie/server-only scope; no protocol-surface, schema↔docs, oneOf, released-artifact, or changeset concerns. CODE_VERSION bumped correctly.
Medium findings
- server/src/services/committee-leader-mutation.ts — WorkOS
listOrganizationMembershipsruns (twice) inside the open transaction whileworking_groups/working_group_leadersrows are locked FOR UPDATE with no timeout; a hung provider holds those locks idle-in-transaction. Operational-readiness concern, non-blocking.
Decision path: high_risk is true but all high-risk entries are (modified), not (deleted). The single medium finding is not in category data-loss/schema/infra, so row 4 does not fire. Row 5 requires a (modified) high-risk file AND a medium finding — but the medium concern is on server/src/services/committee-leader-mutation.ts, which is NOT in the high_risk_reasons list (it does not match the high-risk globs), so row 5 does not fire. gated_paths is false; no team gate; prior decision was approve. Fewer than three mediums. Falls through to row 9 → approve.
The base branch was changed.
47b2218 to
42b31ca
Compare
3216b0d to
0c14d9f
Compare
Summary
authWorkosUserId ?? id) and an explicit selected organizationmapped, not deleted, not bot, and bound to a live WorkOS credential under transaction locksSecurity properties
forbiddenversusunavailableresults and no implicit organization selectionRestack and independent review
The prior head
cb02042ba6d66826d3a2d09ba8b30be0e2f01e57was blocked by independent review. Corrected source-tree headf4ce87dc69a1840619340d9abfda876b25770b04addresses the Tavus principal gap, Slack mapping lifecycle validation, live target validation/exact epoch bump, audit exact-one readback, and committed self-removal regression.The corrected source commit was replayed directly from old parent
b1789a6e9a0024b011586c4b73daf935d1d8e9f5onto final #7462 head7b9876d4670e1518dfe15445e1746e4f081e65cb. The old empty CI triggerc93261a5984e87da0c9edd188c7bf809f8a0e9c5was intentionally dropped. All ten non-derived source/test blobs remain byte-identical tof4ce87dc; the filtered semantic patch ID remains3f5a23e9e2b3d4b0196c49eb379939e642b7fed1.The range-diff is one source commit (
f4ce87dc→77608c1f); differences are limited to the Addie tool-surface budget/inventory regenerated against the final dependency andCODE_VERSION2026.09.55→2026.09.56.The earlier clear verdict for head
77608c1fea82e2f971f5e87839b296cade9b61b2is superseded. A subsequent independent audit found that the generated Tavus inventory still modeledCOMMITTEE_LEADER_TOOLSeven though production Tavus refuses those tools. That head must not be treated as ready.A narrow corrective commit
42b31cade0e65154f7bdd87ed19c74b0997131adremoves the stale Tavus generator input and regenerates only the inventory/contract hash. All 13 generated Tavus profiles now contain zero committee mutation tools; every non-Tavus profile is semantically unchanged. The Tavus admin wire-schema maximum is corrected from27836to26275bytes.Independent corrective-delta review verdict: clear, with no findings. Reviewed head
42b31cade0e65154f7bdd87ed19c74b0997131ad, treef648c26faf43eae49f9c7c7520479f55687999af, parent77608c1fea82e2f971f5e87839b296cade9b61b2.Exact-tree workflow evidence
Current remote head
42b31cade0e65154f7bdd87ed19c74b0997131ad: 29 successful checks + 2 expected skips, with zero non-green real checks. GitHub reports merge stateCLEAN. Every workflow below has verifiedheadSha42b31cade0e65154f7bdd87ed19c74b0997131ad:103839197109) and the aggregate (job103839960314)Exact ancestry/tree evidence:
42b31cade0e65154f7bdd87ed19c74b0997131ad^=77608c1fea82e2f971f5e87839b296cade9b61b242b31cade0e65154f7bdd87ed19c74b0997131ad^{tree}=f648c26faf43eae49f9c7c7520479f55687999af7b9876d4670e1518dfe15445e1746e4f081e65cbDependency and merge order
This is intentionally stacked on #7462 at its final independently reviewed, CI-green head
7b9876d4670e1518dfe15445e1746e4f081e65cbfor its immutableAuthorizationSnapshothydration helpers.Exact merge order:
Do not merge this PR before #7462.
This slice only disables the unsafe Tavus committee-mutation exposure; integrated Tavus/Slack-admin authority remains #7450. It does not touch #7452 content routes or migrations 588-594.
Local validation at corrected head
npm run typechecknpm run test:addie-toolsgit diff --checkPartial implementation of #6827; does not close the full umbrella issue.
Open workspace in Conductor
Draft disposition — 2026-10-09
This draft is retained for the stated workstream. Continue on this existing branch; no parallel PR is needed. This disposition does not waive CI, review, migration, or release gates.