@terreno/mcp 57.19.2 → 57.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (197) hide show
  1. package/CHANGELOG.md +393 -0
  2. package/README.md +32 -269
  3. package/dist/bootstrap.d.ts +12 -0
  4. package/dist/bootstrap.d.ts.map +1 -1
  5. package/dist/bootstrap.js +77 -122
  6. package/dist/bootstrap.js.map +1 -1
  7. package/dist/docs/guidelines/ui/guidelines/core.md +1 -1
  8. package/dist/docs/resources/overview.md +4 -2
  9. package/dist/docs/resources/patterns.md +237 -176
  10. package/dist/docs/resources/ui.md +48 -17
  11. package/dist/docs/templates/bootstrap/frontend/app/(tabs)/profile.template.tsx +0 -26
  12. package/dist/docs/templates/bootstrap/frontend/app/_layout.template.tsx +3 -2
  13. package/dist/docs/templates/bootstrap/frontend/app/login.template.tsx +1 -1
  14. package/dist/docs/upgrades/57.20.0.md +238 -0
  15. package/dist/docs/versioned/next/approval-rubric.md +30 -12
  16. package/dist/docs/versioned/next/explanation/README.md +5 -0
  17. package/dist/docs/versioned/next/explanation/account-linking.md +169 -0
  18. package/dist/docs/versioned/next/explanation/admin-interface.md +1 -1
  19. package/dist/docs/versioned/next/explanation/agent-guidelines.md +173 -0
  20. package/dist/docs/versioned/next/explanation/ai-development-loop.md +196 -0
  21. package/dist/docs/versioned/next/explanation/authentication.md +45 -1
  22. package/dist/docs/versioned/next/explanation/consent-forms.md +105 -0
  23. package/dist/docs/versioned/next/explanation/example-coverage.md +1 -0
  24. package/dist/docs/versioned/next/explanation/local-first-data.md +1 -1
  25. package/dist/docs/versioned/next/explanation/organizations.md +37 -0
  26. package/dist/docs/versioned/next/explanation/planning-plugins.md +4 -0
  27. package/dist/docs/versioned/next/explanation/responsive-design.md +143 -0
  28. package/dist/docs/versioned/next/explanation/roadmap-seed-issues.md +11 -0
  29. package/dist/docs/versioned/next/explanation/schema-metadata.md +5 -0
  30. package/dist/docs/versioned/next/how-to/README.md +7 -2
  31. package/dist/docs/versioned/next/how-to/audit-log.md +22 -3
  32. package/dist/docs/versioned/next/how-to/automate-terreno-upgrades.md +169 -0
  33. package/dist/docs/versioned/next/how-to/build-list-detail-screens.md +160 -0
  34. package/dist/docs/versioned/next/how-to/circleci.md +15 -5
  35. package/dist/docs/versioned/next/how-to/configure-better-auth.md +673 -53
  36. package/dist/docs/versioned/next/how-to/create-a-terreno-app.md +8 -5
  37. package/dist/docs/versioned/next/how-to/debug-with-mcp.md +393 -23
  38. package/dist/docs/versioned/next/how-to/enable-mcp-oauth.md +54 -3
  39. package/dist/docs/versioned/next/how-to/migrate-rtk-to-syncdb.md +9 -0
  40. package/dist/docs/versioned/next/how-to/password-reset.md +1 -1
  41. package/dist/docs/versioned/next/how-to/recover-locked-out-user.md +112 -0
  42. package/dist/docs/versioned/next/how-to/run-tests-locally.md +37 -8
  43. package/dist/docs/versioned/next/how-to/set-up-social-login.md +424 -0
  44. package/dist/docs/versioned/next/how-to/set-up-terreno-mcp.md +241 -36
  45. package/dist/docs/versioned/next/how-to/sign-consent-on-behalf.md +139 -0
  46. package/dist/docs/versioned/next/how-to/upgrade-terreno.md +4 -0
  47. package/dist/docs/versioned/next/implementationPlans/ai-dev-loop-boost.md +47 -32
  48. package/dist/docs/versioned/next/implementationPlans/auth-experience.md +952 -0
  49. package/dist/docs/versioned/next/implementationPlans/consent-forms.md +8 -0
  50. package/dist/docs/versioned/next/implementationPlans/list-detail-layout.md +297 -0
  51. package/dist/docs/versioned/next/implementationPlans/login-redesign/HANDOFF.md +211 -0
  52. package/dist/docs/versioned/next/implementationPlans/login-redesign/boards/AnotherWay.html +121 -0
  53. package/dist/docs/versioned/next/implementationPlans/login-redesign/boards/BackupCode.html +72 -0
  54. package/dist/docs/versioned/next/implementationPlans/login-redesign/boards/Cancelled.html +87 -0
  55. package/dist/docs/versioned/next/implementationPlans/login-redesign/boards/ContinueEmail.html +64 -0
  56. package/dist/docs/versioned/next/implementationPlans/login-redesign/boards/FirstVisit.html +81 -0
  57. package/dist/docs/versioned/next/implementationPlans/login-redesign/boards/Main.html +88 -0
  58. package/dist/docs/versioned/next/implementationPlans/login-redesign/boards/ManageAccounts.html +77 -0
  59. package/dist/docs/versioned/next/implementationPlans/login-redesign/boards/NotLinked.html +92 -0
  60. package/dist/docs/versioned/next/implementationPlans/login-redesign/boards/SigningIn.html +60 -0
  61. package/dist/docs/versioned/next/implementationPlans/login-redesign/boards/TwoFactor.html +76 -0
  62. package/dist/docs/versioned/next/implementationPlans/login-redesign/boards/TwoFactorError.html +81 -0
  63. package/dist/docs/versioned/next/implementationPlans/login-redesign/boards/WrongPassword.html +69 -0
  64. package/dist/docs/versioned/next/implementationPlans/mcp-boost-parity.md +1 -1
  65. package/dist/docs/versioned/next/plans/2026-10-23-provisional-consent.md +297 -0
  66. package/dist/docs/versioned/next/plans/2026-10-29-fix-mcp-oauth-native-and-machine.md +68 -0
  67. package/dist/docs/versioned/next/reference/README.md +1 -0
  68. package/dist/docs/versioned/next/reference/account-security.md +700 -0
  69. package/dist/docs/versioned/next/reference/admin-backend.md +3 -1
  70. package/dist/docs/versioned/next/reference/admin-frontend.md +225 -1
  71. package/dist/docs/versioned/next/reference/api.md +461 -35
  72. package/dist/docs/versioned/next/reference/cli.md +1 -1
  73. package/dist/docs/versioned/next/reference/comms.md +8 -0
  74. package/dist/docs/versioned/next/reference/create-terreno-app.md +3 -1
  75. package/dist/docs/versioned/next/reference/environment-variables.md +9 -3
  76. package/dist/docs/versioned/next/reference/legacy/rtk.md +19 -3
  77. package/dist/docs/versioned/next/reference/lifecycle-plugin.md +6 -0
  78. package/dist/docs/versioned/next/reference/mcp-server.md +1158 -441
  79. package/dist/docs/versioned/next/reference/syncdb.md +8 -1
  80. package/dist/docs/versioned/next/reference/ui.md +1271 -27
  81. package/dist/docs/versioned/next/tasks/ai-dev-loop-boost.md +28 -16
  82. package/dist/docs/versioned/next/tutorials/README.md +4 -0
  83. package/dist/httpApp.d.ts +14 -0
  84. package/dist/httpApp.d.ts.map +1 -0
  85. package/dist/httpApp.js +99 -0
  86. package/dist/httpApp.js.map +1 -0
  87. package/dist/index.js +8 -90
  88. package/dist/index.js.map +1 -1
  89. package/dist/local/localTools.d.ts.map +1 -1
  90. package/dist/local/localTools.js +44 -14
  91. package/dist/local/localTools.js.map +1 -1
  92. package/dist/local/metro/metroDevSession.d.ts +18 -0
  93. package/dist/local/metro/metroDevSession.d.ts.map +1 -1
  94. package/dist/local/metro/metroDevSession.js +42 -3
  95. package/dist/local/metro/metroDevSession.js.map +1 -1
  96. package/dist/local/tools/databaseQuery.d.ts.map +1 -1
  97. package/dist/local/tools/databaseQuery.js +3 -13
  98. package/dist/local/tools/databaseQuery.js.map +1 -1
  99. package/dist/local/tools/databaseSchema.d.ts.map +1 -1
  100. package/dist/local/tools/databaseSchema.js +3 -13
  101. package/dist/local/tools/databaseSchema.js.map +1 -1
  102. package/dist/local/tools/localMongo.d.ts +10 -0
  103. package/dist/local/tools/localMongo.d.ts.map +1 -0
  104. package/dist/local/tools/localMongo.js +30 -0
  105. package/dist/local/tools/localMongo.js.map +1 -0
  106. package/dist/local/tools/runtime.d.ts +18 -2
  107. package/dist/local/tools/runtime.d.ts.map +1 -1
  108. package/dist/local/tools/runtime.js +75 -20
  109. package/dist/local/tools/runtime.js.map +1 -1
  110. package/dist/local/tools/syncDb.d.ts +11 -0
  111. package/dist/local/tools/syncDb.d.ts.map +1 -1
  112. package/dist/local/tools/syncDb.js +15 -3
  113. package/dist/local/tools/syncDb.js.map +1 -1
  114. package/dist/rateLimit.d.ts +35 -0
  115. package/dist/rateLimit.d.ts.map +1 -0
  116. package/dist/rateLimit.js +112 -0
  117. package/dist/rateLimit.js.map +1 -0
  118. package/dist/tools.d.ts.map +1 -1
  119. package/dist/tools.js +42 -60
  120. package/dist/tools.js.map +1 -1
  121. package/package.json +4 -3
  122. package/src/docs/guidelines/ui/guidelines/core.md +1 -1
  123. package/src/docs/resources/overview.md +4 -2
  124. package/src/docs/resources/patterns.md +237 -176
  125. package/src/docs/resources/ui.md +48 -17
  126. package/src/docs/templates/bootstrap/frontend/app/(tabs)/profile.template.tsx +0 -26
  127. package/src/docs/templates/bootstrap/frontend/app/_layout.template.tsx +3 -2
  128. package/src/docs/templates/bootstrap/frontend/app/login.template.tsx +1 -1
  129. package/src/docs/upgrades/57.20.0.md +238 -0
  130. package/src/docs/versioned/next/approval-rubric.md +30 -12
  131. package/src/docs/versioned/next/explanation/README.md +5 -0
  132. package/src/docs/versioned/next/explanation/account-linking.md +169 -0
  133. package/src/docs/versioned/next/explanation/admin-interface.md +1 -1
  134. package/src/docs/versioned/next/explanation/agent-guidelines.md +173 -0
  135. package/src/docs/versioned/next/explanation/ai-development-loop.md +196 -0
  136. package/src/docs/versioned/next/explanation/authentication.md +45 -1
  137. package/src/docs/versioned/next/explanation/consent-forms.md +105 -0
  138. package/src/docs/versioned/next/explanation/example-coverage.md +1 -0
  139. package/src/docs/versioned/next/explanation/local-first-data.md +1 -1
  140. package/src/docs/versioned/next/explanation/organizations.md +37 -0
  141. package/src/docs/versioned/next/explanation/planning-plugins.md +4 -0
  142. package/src/docs/versioned/next/explanation/responsive-design.md +143 -0
  143. package/src/docs/versioned/next/explanation/roadmap-seed-issues.md +11 -0
  144. package/src/docs/versioned/next/explanation/schema-metadata.md +5 -0
  145. package/src/docs/versioned/next/how-to/README.md +7 -2
  146. package/src/docs/versioned/next/how-to/audit-log.md +22 -3
  147. package/src/docs/versioned/next/how-to/automate-terreno-upgrades.md +169 -0
  148. package/src/docs/versioned/next/how-to/build-list-detail-screens.md +160 -0
  149. package/src/docs/versioned/next/how-to/circleci.md +15 -5
  150. package/src/docs/versioned/next/how-to/configure-better-auth.md +673 -53
  151. package/src/docs/versioned/next/how-to/create-a-terreno-app.md +8 -5
  152. package/src/docs/versioned/next/how-to/debug-with-mcp.md +393 -23
  153. package/src/docs/versioned/next/how-to/enable-mcp-oauth.md +54 -3
  154. package/src/docs/versioned/next/how-to/migrate-rtk-to-syncdb.md +9 -0
  155. package/src/docs/versioned/next/how-to/password-reset.md +1 -1
  156. package/src/docs/versioned/next/how-to/recover-locked-out-user.md +112 -0
  157. package/src/docs/versioned/next/how-to/run-tests-locally.md +37 -8
  158. package/src/docs/versioned/next/how-to/set-up-social-login.md +424 -0
  159. package/src/docs/versioned/next/how-to/set-up-terreno-mcp.md +241 -36
  160. package/src/docs/versioned/next/how-to/sign-consent-on-behalf.md +139 -0
  161. package/src/docs/versioned/next/how-to/upgrade-terreno.md +4 -0
  162. package/src/docs/versioned/next/implementationPlans/ai-dev-loop-boost.md +47 -32
  163. package/src/docs/versioned/next/implementationPlans/auth-experience.md +952 -0
  164. package/src/docs/versioned/next/implementationPlans/consent-forms.md +8 -0
  165. package/src/docs/versioned/next/implementationPlans/list-detail-layout.md +297 -0
  166. package/src/docs/versioned/next/implementationPlans/login-redesign/HANDOFF.md +211 -0
  167. package/src/docs/versioned/next/implementationPlans/login-redesign/boards/AnotherWay.html +121 -0
  168. package/src/docs/versioned/next/implementationPlans/login-redesign/boards/BackupCode.html +72 -0
  169. package/src/docs/versioned/next/implementationPlans/login-redesign/boards/Cancelled.html +87 -0
  170. package/src/docs/versioned/next/implementationPlans/login-redesign/boards/ContinueEmail.html +64 -0
  171. package/src/docs/versioned/next/implementationPlans/login-redesign/boards/FirstVisit.html +81 -0
  172. package/src/docs/versioned/next/implementationPlans/login-redesign/boards/Main.html +88 -0
  173. package/src/docs/versioned/next/implementationPlans/login-redesign/boards/ManageAccounts.html +77 -0
  174. package/src/docs/versioned/next/implementationPlans/login-redesign/boards/NotLinked.html +92 -0
  175. package/src/docs/versioned/next/implementationPlans/login-redesign/boards/SigningIn.html +60 -0
  176. package/src/docs/versioned/next/implementationPlans/login-redesign/boards/TwoFactor.html +76 -0
  177. package/src/docs/versioned/next/implementationPlans/login-redesign/boards/TwoFactorError.html +81 -0
  178. package/src/docs/versioned/next/implementationPlans/login-redesign/boards/WrongPassword.html +69 -0
  179. package/src/docs/versioned/next/implementationPlans/mcp-boost-parity.md +1 -1
  180. package/src/docs/versioned/next/plans/2026-10-23-provisional-consent.md +297 -0
  181. package/src/docs/versioned/next/plans/2026-10-29-fix-mcp-oauth-native-and-machine.md +68 -0
  182. package/src/docs/versioned/next/reference/README.md +1 -0
  183. package/src/docs/versioned/next/reference/account-security.md +700 -0
  184. package/src/docs/versioned/next/reference/admin-backend.md +3 -1
  185. package/src/docs/versioned/next/reference/admin-frontend.md +225 -1
  186. package/src/docs/versioned/next/reference/api.md +461 -35
  187. package/src/docs/versioned/next/reference/cli.md +1 -1
  188. package/src/docs/versioned/next/reference/comms.md +8 -0
  189. package/src/docs/versioned/next/reference/create-terreno-app.md +3 -1
  190. package/src/docs/versioned/next/reference/environment-variables.md +9 -3
  191. package/src/docs/versioned/next/reference/legacy/rtk.md +19 -3
  192. package/src/docs/versioned/next/reference/lifecycle-plugin.md +6 -0
  193. package/src/docs/versioned/next/reference/mcp-server.md +1158 -441
  194. package/src/docs/versioned/next/reference/syncdb.md +8 -1
  195. package/src/docs/versioned/next/reference/ui.md +1271 -27
  196. package/src/docs/versioned/next/tasks/ai-dev-loop-boost.md +28 -16
  197. package/src/docs/versioned/next/tutorials/README.md +4 -0
@@ -0,0 +1,160 @@
1
+ # Build a list/detail screen
2
+
3
+ Put the list and its detail route in one route group, and make `ListDetailLayout` the group's
4
+ layout. On a phone the list pushes the detail. On a tablet or a wide browser the list stays in a
5
+ left pane and the detail opens beside it. The URL always names the open item.
6
+
7
+ ```text
8
+ app/mail/
9
+ _layout.tsx ListDetailLayout
10
+ index.tsx ListDetailIndex
11
+ [id].tsx the detail screen
12
+ ```
13
+
14
+ ```tsx
15
+ // app/mail/_layout.tsx
16
+ import {ListDetailLayout, Text} from "@terreno/ui";
17
+ import type React from "react";
18
+
19
+ import {MailList} from "@/components/MailList";
20
+
21
+ // A deep link to /mail/3 on a phone still has the list to go back to.
22
+ export const unstable_settings = {initialRouteName: "index"};
23
+
24
+ const MailLayout: React.FC = () => (
25
+ <ListDetailLayout
26
+ detailHref={(id) => `/mail/${id}`}
27
+ emptyDetail={<Text>Select a message</Text>}
28
+ indexHref="/mail"
29
+ list={<MailList />}
30
+ screenOptions={{title: "Inbox"}}
31
+ />
32
+ );
33
+ export default MailLayout;
34
+ ```
35
+
36
+ ```tsx
37
+ // app/mail/index.tsx
38
+ import {ListDetailIndex} from "@terreno/ui";
39
+ import type React from "react";
40
+
41
+ const MailIndex: React.FC = () => <ListDetailIndex />;
42
+ export default MailIndex;
43
+ ```
44
+
45
+ ```tsx
46
+ // app/mail/[id].tsx
47
+ import {Page, Text} from "@terreno/ui";
48
+ import {useLocalSearchParams} from "expo-router";
49
+ import type React from "react";
50
+
51
+ const MailMessage: React.FC = () => {
52
+ const {id} = useLocalSearchParams<{id: string}>();
53
+ return (
54
+ <Page>
55
+ <Text>Message {id}</Text>
56
+ </Page>
57
+ );
58
+ };
59
+ export default MailMessage;
60
+ ```
61
+
62
+ ## Select rows from the list
63
+
64
+ Read the open item and open others with `useListDetail()`. Mark the open row as selected so
65
+ screen readers announce it. On web a clickable `Box` row sends this as `aria-current="true"`.
66
+
67
+ ```tsx
68
+ import {Box, Text, useListDetail} from "@terreno/ui";
69
+ import type React from "react";
70
+
71
+ export const MailRow: React.FC<{id: string; subject: string}> = ({id, subject}) => {
72
+ const {select, selectedId} = useListDetail();
73
+ const isSelected = id === selectedId;
74
+ return (
75
+ <Box
76
+ accessibilityHint="Opens the message"
77
+ accessibilityLabel={subject}
78
+ accessibilityState={{selected: isSelected}}
79
+ color={isSelected ? "primary" : "base"}
80
+ onClick={() => select(id)}
81
+ padding={3}
82
+ testID={`mail-row-${id}`}
83
+ >
84
+ <Text color={isSelected ? "inverted" : "primary"}>{subject}</Text>
85
+ </Box>
86
+ );
87
+ };
88
+ ```
89
+
90
+ | Call | Stacked (phone) | Split (tablet, wide web) |
91
+ | --- | --- | --- |
92
+ | `select(id)`, nothing open | Pushes `detailHref(id)` | Pushes `detailHref(id)` |
93
+ | `select(id)`, another item open | Pushes `detailHref(id)` | Replaces the open detail |
94
+ | `select(selectedId)` | Pushes again | Does nothing |
95
+ | `clear()` | `router.dismissTo(indexHref)`: pops back to the list inside this group | Same |
96
+ | `clear()`, nothing open | Does nothing | Does nothing |
97
+
98
+ Because split mode replaces the open detail, the stack is never deeper than the list plus one
99
+ detail, so back returns to the list after a rotation too. When split, the header's back button
100
+ (`list-detail-leave`) leaves the whole group instead, since the list is already on screen.
101
+
102
+ When another screen opens a detail directly, push it with `withAnchor` so the list sits below it
103
+ and back lands on the list instead of leaving the group:
104
+
105
+ ```tsx
106
+ router.push("/mail/3", {withAnchor: true});
107
+ <Link href="/mail/3" withAnchor>Open message</Link>
108
+ ```
109
+
110
+ `selectedId` is the `paramName` param (default `id`) of the route directly below `indexHref`
111
+ whose segment is `detailRoute` (default `[id]`). An `id` from a parent dynamic segment, such as
112
+ `/orgs/[id]/mail`, never counts.
113
+
114
+ ## Publish the detail URL
115
+
116
+ A static web export (`web.output: "static"`) writes an HTML file only for paths
117
+ `generateStaticParams` returns. Without it, opening `/mail/3` directly is a 404 on a host that
118
+ does not rewrite unknown paths.
119
+
120
+ ```tsx
121
+ // app/mail/[id].tsx
122
+ export const generateStaticParams = (): {id: string}[] =>
123
+ messages.map((message) => ({id: message.id}));
124
+ ```
125
+
126
+ Ids that are not known at build time need the host fallback from
127
+ [Build for web](build-for-web.md): Netlify `_redirects` with `/* /index.html 200`, or the Vercel
128
+ rewrite in [Deploy to Vercel](deploy-to-vercel.md). The demo inbox exports one page per fixture
129
+ message at `/demo/list-detail/:id` and `/demo/sidebar-navigation/mail/:id`. The Netlify demo
130
+ deploy also writes that fallback, so an id outside the fixtures still opens the missing-message
131
+ screen.
132
+
133
+ ## Keep list state across the breakpoint
134
+
135
+ The open item survives a rotation or a browser resize. The `list` element does not: it moves
136
+ between the index screen and the left pane, so it remounts. Keep filters, search text, and other
137
+ list state in the route (`router.setParams`) or a store.
138
+
139
+ ## Nest it inside a sidebar
140
+
141
+ `ListDetailLayout` measures its own width, so it splits correctly inside `SidebarNavigation` or
142
+ an admin rail. Make the group a screen of the sidebar navigator:
143
+
144
+ ```text
145
+ app/workspace/
146
+ _layout.tsx SidebarNavigation with <SidebarNavigation.Screen name="mail" />
147
+ mail/_layout.tsx ListDetailLayout with indexHref="/workspace/mail"
148
+ mail/index.tsx
149
+ mail/[id].tsx
150
+ ```
151
+
152
+ ## Choose SplitPage instead
153
+
154
+ Use `SplitPage` when the list and detail do not have their own routes, such as a picker inside a
155
+ modal. `SplitPage` keeps the selection in component state, so it has no URL, deep links, or back
156
+ navigation for the open item.
157
+
158
+ ## Reference
159
+
160
+ Props, defaults, and testIDs: [`ListDetailLayout`](../reference/ui.md#listdetaillayout).
@@ -106,7 +106,9 @@ when the package imports them. Coverage-script unit tests run in the cheap
106
106
  Playwright runs five shards after `e2e-prepare` (`auth`, `app`, `admin-core`,
107
107
  `admin-table`, `syncdb`) instead of one container per spec file. Each shard
108
108
  first checks the [affected gate](#e2e-affected-gate) and halts when no changed
109
- file can reach it. Repository
109
+ file can reach it. The cross-site bearer specs run beside them in `e2e-cross-site`,
110
+ which builds its own web bundle and backend (`playwright.config.ts` with
111
+ `E2E_CROSS_SITE_BEARER=true`), has no affected gate, and is not a required check. Repository
110
112
  policy checks share one `repo-policies` job so eight small checkouts do not
111
113
  sit in the concurrency queue. `repo-policies` uses Node 22.14 because Knip's
112
114
  oxc-parser throws `ERR_REQUIRE_ESM` on the shared 22.11 executor.
@@ -316,6 +318,7 @@ the same commands through the parameterized `packages-ci` job, gated by
316
318
  | Admin SPA Build and E2E | `admin-spa-ci` |
317
319
  | Lint, compile, and coverage (matrix package) | `packages-ci` (`admin-backend`, `admin-frontend`, `api-health`, `feature-flags`, `test`) |
318
320
  | E2E · `<shard>` | `e2e` (matrix `shard`: `auth`, `app`, `admin-core`, `admin-table`, `syncdb`) |
321
+ | _(cross-site bearer specs, not required)_ | `e2e-cross-site` (after `e2e-prepare`; also the explicit-linking pass) |
319
322
  | E2E Load · syncdb-loadlab | `e2e-load` (trigger-gated, see below) |
320
323
  | Admin SPA Backend Integration E2E | `admin-spa-integration` |
321
324
  | _(e2e compile+export once)_ | `e2e-prepare` |
@@ -368,10 +371,17 @@ To teach the agent from what reviewers actually say, run
368
371
  <file>` of pasted comments): it opens one PR editing `docs/approval-rubric.md` and the
369
372
  path rules from the review comments since the last pass.
370
373
 
371
- Rollout: `approveLevels` is `[]`, so every PR gets a `COMMENT` review that says the
372
- risk level and why, and nothing approves. After a dozen PRs, compare the levels with
373
- how humans reviewed them, tune the path rules and rubric, then set
374
- `"approveLevels": ["low"]` in a one-line PR. The prompts and answers behind each
374
+ Levels and human approvals (defined in `docs/approval-rubric.md`):
375
+
376
+ | Level | Human approvals | Examples |
377
+ | --- | --- | --- |
378
+ | low | None once automated review and security checks are green | docs, copy, internal-only features, additive changes behind a flag |
379
+ | medium | One person | ordinary product changes, and sensitive areas such as caching, app updates, and AI system prompts |
380
+ | high | One person | security-related code: auth, permissions, secrets, crypto, PHI handling |
381
+
382
+ `approveLevels` is `["low"]`, so the App's approval satisfies master's one-review rule
383
+ for low PRs. Medium and high PRs get a `COMMENT` review that says the risk level and
384
+ why, and a human approves. The prompts and answers behind each
375
385
  verdict are stored as the `brewery-approve` job artifact. Full reference:
376
386
  [brewery `docs/approve.md`](https://github.com/joshgachnang/brewery/blob/master/docs/approve.md).
377
387