diff --git a/docs/audits/claim-table.md b/docs/audits/claim-table.md index 0836beb829..f98b9e2d09 100644 --- a/docs/audits/claim-table.md +++ b/docs/audits/claim-table.md @@ -190,7 +190,7 @@ The connectors page is a first-touch page. A row marked `first-touch` in the Pag | grants | An owner, an eligible pod member, or the target seat can read a grant | FALSE | Fixed by this PR. The pod branch has no owner exception (`backend/routes/grants.ts:529–532`). | 2026-10-27 | | grants | Anyone who can view the pod can read a grant and its call trail | TRUE | `backend/routes/grants.ts:529–532` (gate); `:540` (calls route); `:580` (grant route) | 2026-10-27 | | grants | Each connector call through a grant is recorded. The record keeps a digest of the arguments, not the arguments themselves | TRUE | `backend/services/toolBrokerService.ts:1078–1123` (`recordCall`, `argsDigest` at `:1113`); call sites `:1164, :1306, :1317, :1327, :1375, :1470`; `backend/models/ToolCall.ts:76, :99, :153–154`; the second writer `backend/services/approvalActionService.ts:608–633` also writes only `argsDigest`. Limit: a parked approval holds the raw arguments in `ApprovalAction.toolCall.canonicalArgs` from park (`backend/services/toolBrokerService.ts:1281`; `backend/models/ApprovalAction.ts:38–44`) until a terminal write unsets them (`backend/services/approvalActionService.ts:537, :857, :904, :1025`). These are call sites, not an exhaustive path audit. | 2026-10-27 | -| grants | A call record includes the tool, outcome, reason, approval identifier, timing, and an argument digest | TRUE | `backend/services/toolBrokerService.ts:1105–1121` (`ToolCall.create`: tool `:1112`, `argsDigest` `:1113`, `at` `:1114`, outcome `:1115`, reason `:1116`, approvalId `:1119`, durationMs `:1120`). The second writer (`backend/services/approvalActionService.ts:620–631`) sets no `at` or `durationMs`; `ToolCall.create` then stamps the write time (`backend/models/ToolCall.ts:258`, `record.at || new Date()`) and stores `duration_ms` as null (`:262`). So an approval-decision record has a time and no duration. | 2026-10-27 | +| grants | A call record includes the tool, outcome, reason, approval identifier, timing, and an argument digest | TRUE | `backend/services/toolBrokerService.ts:1105–1121` (`ToolCall.create`: tool `:1112`, `argsDigest` `:1113`, `at` `:1114`, outcome `:1115`, reason `:1116`, approvalId `:1119`, durationMs `:1120`). The second writer (`backend/services/approvalActionService.ts:620–631`) sets no `at` or `durationMs`; `ToolCall.create` then stamps the write time when `record.at` is unset (`backend/models/ToolCall.ts:258`, which falls back to `new Date()`) and stores `duration_ms` as null (`:262`). So an approval-decision record has a time and no duration. | 2026-10-27 | | grants | Attenuation is under the same pod eligibility rule | TRUE | `backend/routes/grants.ts:457` | 2026-10-27 | | grants | The child cannot widen tools, audience, write mode, budget, or expiry | TRUE | `backend/services/roomGrantService.ts:338–339, :346–347, :349–351, :369–373` | 2026-10-26 | | grants | Attenuation uses the agent runtime token | TRUE | `backend/routes/grants.ts:55–59, :440–442` | 2026-10-27 |