@terreno/mcp 57.6.1 → 57.8.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 (143) hide show
  1. package/dist/docs/resources/ui.md +5 -4
  2. package/dist/docs/upgrades/57.7.0.md +64 -0
  3. package/dist/docs/upgrades/57.8.0.md +61 -0
  4. package/dist/docs/upgrades/58.0.0.md +4 -0
  5. package/dist/docs/versioned/next/explanation/example-coverage.md +1 -0
  6. package/dist/docs/versioned/next/explanation/loop-engineering.md +32 -3
  7. package/dist/docs/versioned/next/explanation/model-router-actions.md +1 -1
  8. package/dist/docs/versioned/next/explanation/repository-settings.md +12 -5
  9. package/dist/docs/versioned/next/explanation/roadmap-process.md +41 -19
  10. package/dist/docs/versioned/next/explanation/roadmap-seed-issues.md +285 -22
  11. package/dist/docs/versioned/next/explanation/static-analysis.md +3 -2
  12. package/dist/docs/versioned/next/explanation/test-isolation.md +42 -0
  13. package/dist/docs/versioned/next/how-to/circleci.md +121 -64
  14. package/dist/docs/versioned/next/how-to/github-actions-ci.md +4 -3
  15. package/dist/docs/versioned/next/how-to/preview-demo.md +19 -0
  16. package/dist/docs/versioned/next/how-to/product-announcements.md +3 -0
  17. package/dist/docs/versioned/next/how-to/run-tests-locally.md +23 -2
  18. package/dist/docs/versioned/next/implementationPlans/IP_TEMPLATE.md +3 -1
  19. package/dist/docs/versioned/next/implementationPlans/admin-improvements.md +1 -1
  20. package/dist/docs/versioned/next/implementationPlans/admin-scripts-durable-jobs.md +2 -1
  21. package/dist/docs/versioned/next/implementationPlans/agent-ui-blocks.md +1 -0
  22. package/dist/docs/versioned/next/implementationPlans/ai-agents-and-failover.md +1 -0
  23. package/dist/docs/versioned/next/implementationPlans/ai-observability.md +1 -0
  24. package/dist/docs/versioned/next/implementationPlans/announcements-surfaces.md +1 -1
  25. package/dist/docs/versioned/next/implementationPlans/announcements.md +2 -1
  26. package/dist/docs/versioned/next/implementationPlans/app-mcp-server.md +1 -0
  27. package/dist/docs/versioned/next/implementationPlans/better-auth-strict-oauth-provider.md +2 -1
  28. package/dist/docs/versioned/next/implementationPlans/can-as-permission-seam.md +1 -1
  29. package/dist/docs/versioned/next/implementationPlans/collection-registry.md +1 -1
  30. package/dist/docs/versioned/next/implementationPlans/comms-adapter-expo-push.md +1 -1
  31. package/dist/docs/versioned/next/implementationPlans/comms-adapter-twilio-sms.md +1 -1
  32. package/dist/docs/versioned/next/implementationPlans/comms-admin-dashboard.md +1 -1
  33. package/dist/docs/versioned/next/implementationPlans/compile-pipeline-dedup.md +2 -1
  34. package/dist/docs/versioned/next/implementationPlans/datatable-server-side-filtering.md +1 -1
  35. package/dist/docs/versioned/next/implementationPlans/demo-workshop.md +219 -0
  36. package/dist/docs/versioned/next/implementationPlans/describe-model-schema.md +1 -1
  37. package/dist/docs/versioned/next/implementationPlans/docs-reference-coverage.md +1 -1
  38. package/dist/docs/versioned/next/implementationPlans/docs-site-and-versioning.md +1 -1
  39. package/dist/docs/versioned/next/implementationPlans/examples-demo-coverage.md +1 -1
  40. package/dist/docs/versioned/next/implementationPlans/framework-audit-log.md +1 -1
  41. package/dist/docs/versioned/next/implementationPlans/gpt-chat-mascot.md +1 -0
  42. package/dist/docs/versioned/next/implementationPlans/inbound-webhooks.md +1 -1
  43. package/dist/docs/versioned/next/implementationPlans/knip-cleanup.md +1 -0
  44. package/dist/docs/versioned/next/implementationPlans/mcp-doc-sync-off-compile-path.md +2 -1
  45. package/dist/docs/versioned/next/implementationPlans/mcp-service-tokens.md +2 -1
  46. package/dist/docs/versioned/next/implementationPlans/migrate-admin-to-syncdb.md +2 -1
  47. package/dist/docs/versioned/next/implementationPlans/migrate-cicd-to-circleci.md +1 -1
  48. package/dist/docs/versioned/next/implementationPlans/mongodb-migrations-tooling.md +1 -1
  49. package/dist/docs/versioned/next/implementationPlans/notification-center.md +1 -1
  50. package/dist/docs/versioned/next/implementationPlans/org-management-ui.md +1 -1
  51. package/dist/docs/versioned/next/implementationPlans/password-reset-and-email-verification.md +1 -1
  52. package/dist/docs/versioned/next/implementationPlans/rate-limiting.md +1 -1
  53. package/dist/docs/versioned/next/implementationPlans/remove-legacy-realtime.md +1 -0
  54. package/dist/docs/versioned/next/implementationPlans/support-agent.md +1 -0
  55. package/dist/docs/versioned/next/implementationPlans/syncdb-codegen.md +1 -1
  56. package/dist/docs/versioned/next/implementationPlans/terreno-langfuse-integration.md +1 -1
  57. package/dist/docs/versioned/next/implementationPlans/upgrade-guides-and-skill.md +1 -1
  58. package/dist/docs/versioned/next/reference/ai.md +3 -1
  59. package/dist/docs/versioned/next/reference/announcement-release-packs.md +146 -0
  60. package/dist/docs/versioned/next/reference/announcements.md +7 -3
  61. package/dist/docs/versioned/next/reference/api.md +1 -0
  62. package/dist/docs/versioned/next/reference/environment-variables.md +1 -0
  63. package/dist/docs/versioned/next/reference/lifecycle-plugin.md +2 -2
  64. package/dist/docs/versioned/next/reference/test.md +1 -1
  65. package/dist/docs/versioned/next/reference/ui.md +79 -8
  66. package/dist/docs/versioned/next/tasks/can-as-permission-seam.md +4 -4
  67. package/dist/docs/versioned/next/tasks/collection-registry.md +6 -6
  68. package/dist/docs/versioned/next/tasks/demo-workshop.md +150 -0
  69. package/dist/docs/versioned/next/tasks/describe-model-schema.md +5 -5
  70. package/dist/docs/versioned/next/tasks/migrate-cicd-to-circleci.md +6 -3
  71. package/package.json +2 -2
  72. package/src/docs/resources/ui.md +5 -4
  73. package/src/docs/upgrades/57.7.0.md +64 -0
  74. package/src/docs/upgrades/57.8.0.md +61 -0
  75. package/src/docs/upgrades/58.0.0.md +4 -0
  76. package/src/docs/versioned/next/explanation/example-coverage.md +1 -0
  77. package/src/docs/versioned/next/explanation/loop-engineering.md +32 -3
  78. package/src/docs/versioned/next/explanation/model-router-actions.md +1 -1
  79. package/src/docs/versioned/next/explanation/repository-settings.md +12 -5
  80. package/src/docs/versioned/next/explanation/roadmap-process.md +41 -19
  81. package/src/docs/versioned/next/explanation/roadmap-seed-issues.md +285 -22
  82. package/src/docs/versioned/next/explanation/static-analysis.md +3 -2
  83. package/src/docs/versioned/next/explanation/test-isolation.md +42 -0
  84. package/src/docs/versioned/next/how-to/circleci.md +121 -64
  85. package/src/docs/versioned/next/how-to/github-actions-ci.md +4 -3
  86. package/src/docs/versioned/next/how-to/preview-demo.md +19 -0
  87. package/src/docs/versioned/next/how-to/product-announcements.md +3 -0
  88. package/src/docs/versioned/next/how-to/run-tests-locally.md +23 -2
  89. package/src/docs/versioned/next/implementationPlans/IP_TEMPLATE.md +3 -1
  90. package/src/docs/versioned/next/implementationPlans/admin-improvements.md +1 -1
  91. package/src/docs/versioned/next/implementationPlans/admin-scripts-durable-jobs.md +2 -1
  92. package/src/docs/versioned/next/implementationPlans/agent-ui-blocks.md +1 -0
  93. package/src/docs/versioned/next/implementationPlans/ai-agents-and-failover.md +1 -0
  94. package/src/docs/versioned/next/implementationPlans/ai-observability.md +1 -0
  95. package/src/docs/versioned/next/implementationPlans/announcements-surfaces.md +1 -1
  96. package/src/docs/versioned/next/implementationPlans/announcements.md +2 -1
  97. package/src/docs/versioned/next/implementationPlans/app-mcp-server.md +1 -0
  98. package/src/docs/versioned/next/implementationPlans/better-auth-strict-oauth-provider.md +2 -1
  99. package/src/docs/versioned/next/implementationPlans/can-as-permission-seam.md +1 -1
  100. package/src/docs/versioned/next/implementationPlans/collection-registry.md +1 -1
  101. package/src/docs/versioned/next/implementationPlans/comms-adapter-expo-push.md +1 -1
  102. package/src/docs/versioned/next/implementationPlans/comms-adapter-twilio-sms.md +1 -1
  103. package/src/docs/versioned/next/implementationPlans/comms-admin-dashboard.md +1 -1
  104. package/src/docs/versioned/next/implementationPlans/compile-pipeline-dedup.md +2 -1
  105. package/src/docs/versioned/next/implementationPlans/datatable-server-side-filtering.md +1 -1
  106. package/src/docs/versioned/next/implementationPlans/demo-workshop.md +219 -0
  107. package/src/docs/versioned/next/implementationPlans/describe-model-schema.md +1 -1
  108. package/src/docs/versioned/next/implementationPlans/docs-reference-coverage.md +1 -1
  109. package/src/docs/versioned/next/implementationPlans/docs-site-and-versioning.md +1 -1
  110. package/src/docs/versioned/next/implementationPlans/examples-demo-coverage.md +1 -1
  111. package/src/docs/versioned/next/implementationPlans/framework-audit-log.md +1 -1
  112. package/src/docs/versioned/next/implementationPlans/gpt-chat-mascot.md +1 -0
  113. package/src/docs/versioned/next/implementationPlans/inbound-webhooks.md +1 -1
  114. package/src/docs/versioned/next/implementationPlans/knip-cleanup.md +1 -0
  115. package/src/docs/versioned/next/implementationPlans/mcp-doc-sync-off-compile-path.md +2 -1
  116. package/src/docs/versioned/next/implementationPlans/mcp-service-tokens.md +2 -1
  117. package/src/docs/versioned/next/implementationPlans/migrate-admin-to-syncdb.md +2 -1
  118. package/src/docs/versioned/next/implementationPlans/migrate-cicd-to-circleci.md +1 -1
  119. package/src/docs/versioned/next/implementationPlans/mongodb-migrations-tooling.md +1 -1
  120. package/src/docs/versioned/next/implementationPlans/notification-center.md +1 -1
  121. package/src/docs/versioned/next/implementationPlans/org-management-ui.md +1 -1
  122. package/src/docs/versioned/next/implementationPlans/password-reset-and-email-verification.md +1 -1
  123. package/src/docs/versioned/next/implementationPlans/rate-limiting.md +1 -1
  124. package/src/docs/versioned/next/implementationPlans/remove-legacy-realtime.md +1 -0
  125. package/src/docs/versioned/next/implementationPlans/support-agent.md +1 -0
  126. package/src/docs/versioned/next/implementationPlans/syncdb-codegen.md +1 -1
  127. package/src/docs/versioned/next/implementationPlans/terreno-langfuse-integration.md +1 -1
  128. package/src/docs/versioned/next/implementationPlans/upgrade-guides-and-skill.md +1 -1
  129. package/src/docs/versioned/next/reference/ai.md +3 -1
  130. package/src/docs/versioned/next/reference/announcement-release-packs.md +146 -0
  131. package/src/docs/versioned/next/reference/announcements.md +7 -3
  132. package/src/docs/versioned/next/reference/api.md +1 -0
  133. package/src/docs/versioned/next/reference/environment-variables.md +1 -0
  134. package/src/docs/versioned/next/reference/lifecycle-plugin.md +2 -2
  135. package/src/docs/versioned/next/reference/test.md +1 -1
  136. package/src/docs/versioned/next/reference/ui.md +79 -8
  137. package/src/docs/versioned/next/tasks/can-as-permission-seam.md +4 -4
  138. package/src/docs/versioned/next/tasks/collection-registry.md +6 -6
  139. package/src/docs/versioned/next/tasks/demo-workshop.md +150 -0
  140. package/src/docs/versioned/next/tasks/describe-model-schema.md +5 -5
  141. package/src/docs/versioned/next/tasks/migrate-cicd-to-circleci.md +6 -3
  142. package/dist/docs/ui-types-documentation.json +0 -33
  143. package/src/docs/ui-types-documentation.json +0 -33
@@ -253,7 +253,7 @@ radiusSm, radiusMd, radiusLg, radiusXl, radius2xl, radius3xl
253
253
  ## Utilities
254
254
 
255
255
  ```typescript
256
- import { useStoredState, MediaQuery, isMobileDevice } from "@terreno/ui";
256
+ import { useStoredState, MediaQuery, isNarrowViewport } from "@terreno/ui";
257
257
 
258
258
  // Persist state to storage
259
259
  const [value, setValue] = useStoredState("key", defaultValue);
@@ -263,9 +263,10 @@ const [value, setValue] = useStoredState("key", defaultValue);
263
263
  <DesktopLayout />
264
264
  </MediaQuery>
265
265
 
266
- // Device detection
267
- if (isMobileDevice()) {
268
- // Mobile-specific code
266
+ // Current window is below the desktop breakpoint.
267
+ // isMobileDevice() is deprecated in favor of isNarrowViewport().
268
+ if (isNarrowViewport()) {
269
+ // Narrow-viewport code
269
270
  }
270
271
  ```
271
272
 
@@ -0,0 +1,64 @@
1
+ # Upgrading to 57.7.0
2
+
3
+ **Action required:** No
4
+ **Affected packages:** @terreno/ui
5
+
6
+ ## Summary
7
+
8
+ Bump every `@terreno/*` package together to `57.7.0`. `@terreno/ui`'s `Filter` is now `DropdownPanel`. Existing `Filter` and `FilterProps` imports keep working until Terreno 58. Panels stay on screen, render through the `TerrenoProvider` portal on native, and accept styled or custom triggers. No Expo upgrade is required if you are already on `57.x`.
9
+
10
+ ## Breaking changes
11
+
12
+ None
13
+
14
+ ## Deprecations
15
+
16
+ ### `Filter` and `FilterProps`
17
+
18
+ **What changed**
19
+
20
+ `Filter` is renamed to `DropdownPanel`. `Filter` and `FilterProps` stay exported as deprecated aliases and are removed in Terreno 58. `FilterSelectMenu`, `FilterBoolean`, `FilterAccordion`, and `FilterChangesBadge` keep their names.
21
+
22
+ **Why**
23
+
24
+ The control is a general compositional dropdown (trigger, anchored panel, optional Apply/Clear/Cancel footer), not a filter-only widget.
25
+
26
+ **Migration**
27
+
28
+ ```tsx
29
+ // Before
30
+ import {Filter} from "@terreno/ui";
31
+
32
+ <Filter label="Status">{children}</Filter>;
33
+
34
+ // After
35
+ import {DropdownPanel} from "@terreno/ui";
36
+
37
+ <DropdownPanel label="Status">{children}</DropdownPanel>;
38
+ ```
39
+
40
+ ## Changed behavior
41
+
42
+ ### Panels stay on screen and escape clipping
43
+
44
+ **What changed**
45
+
46
+ `DropdownPanel` (including the `Filter` alias) right-aligns to its trigger when a left-aligned panel would cross the right viewport edge, clamps to an 8px screen margin, flips above the trigger when there is no usable room below, and scrolls its body with the footer pinned when the content is taller than the space available. On native it renders through the `TerrenoProvider` portal host, so the panel is no longer clipped inside scroll views or cards. Without a host it stays an inline overlay.
47
+
48
+ **Why**
49
+
50
+ Left-aligned panels ran off screen, and inline overlays were clipped by parent scroll views.
51
+
52
+ **Migration**
53
+
54
+ No call-site change is required. Pass `align` or `maxPanelHeight` to override the automatic layout. Apps that position their own panels can call `computeDropdownPanelLayout`.
55
+
56
+ ## New capabilities
57
+
58
+ `DropdownPanel` triggers accept `triggerVariant` (any `Button` variant), `applyButtonVariant`, `triggerSize` on labeled triggers, `fullWidth`, and `renderTrigger` for a fully custom trigger.
59
+
60
+ ## Verification
61
+
62
+ - `bun add` every `@terreno/*` dependency to `57.7.0`, then `bun run compile` at the app root
63
+ - Open a screen that uses `Filter` or `DropdownPanel` and confirm the panel stays inside the viewport, including near the right edge and inside a scrolling parent
64
+ - Replace `Filter` imports with `DropdownPanel` before upgrading to Terreno 58
@@ -0,0 +1,61 @@
1
+ # Upgrading to 57.8.0
2
+
3
+ **Action required:** No
4
+ **Affected packages:** @terreno/ui, @terreno/announcements
5
+
6
+ ## Summary
7
+
8
+ Bump every lockstep `@terreno/*` package together to `57.8.0`. `@terreno/ui` adds opt-in `SplitPage` web layouts and `IconButton` `backgroundOpacity`, and deprecates `isMobileDevice` in favor of `isNarrowViewport` (the old function still returns the same result). `@terreno/announcements` can import a Markdown release pack through `POST /announcements/import-release`. `DropdownPanel` anchors to its trigger, and `/gpt/prompt` emits each generated image once. No Expo upgrade is required if you are already on `57.x`.
9
+
10
+ ## Breaking changes
11
+
12
+ None
13
+
14
+ ## Deprecations
15
+
16
+ ### `isMobileDevice`
17
+
18
+ **What changed**
19
+
20
+ `isMobileDevice` is deprecated. `isNarrowViewport` is the supported name. Both stay exported and return the same boolean: true when the window is below the supported desktop floor (web width under 1024, native width under 1024).
21
+
22
+ **Why**
23
+
24
+ `isMobileDevice` described a window-width check. The new name matches that behavior.
25
+
26
+ **Migration**
27
+
28
+ ```typescript
29
+ // Before
30
+ import {isMobileDevice} from "@terreno/ui";
31
+
32
+ if (isMobileDevice()) {
33
+ // narrow layout
34
+ }
35
+
36
+ // After
37
+ import {isNarrowViewport} from "@terreno/ui";
38
+
39
+ if (isNarrowViewport()) {
40
+ // narrow layout
41
+ }
42
+ ```
43
+
44
+ ## New capabilities
45
+
46
+ `SplitPage` web props are opt-in. Existing callers keep the previous layout.
47
+
48
+ - `desktopChildrenMinWidth` keeps one or two desktop children at least that many pixels wide and scrolls the row when it is tighter. More than two children keeps the segmented control.
49
+ - `narrowViewportChildLabels`, `narrowViewportSelectionActive`, `narrowViewportSelectionKey`, and `narrowViewportListButtonLabel` replace the dotted narrow swiper with a labeled pager.
50
+ - `narrowBelowWidth` uses the narrow layout when the window width is less than or equal to that pixel value. Omit it to follow `isNarrowViewport()`.
51
+ - Native `SplitPage` ignores these props.
52
+ - `IconButton` `backgroundOpacity` tints only that button's background.
53
+
54
+ `@terreno/announcements` accepts a `terreno.announcement-pack/v1` directory (`pack.yaml` plus one Markdown file per announcement) at `POST /announcements/import-release`. Imports are idempotent by product, release version, channel, and slug, default to drafts, and publish immediately when `publish: true`. Admin auth or bearer `ANNOUNCEMENTS_UPLOAD_TOKEN` can call the route. The token is optional.
55
+
56
+ ## Verification
57
+
58
+ - `bun add` every lockstep `@terreno/*` dependency to `57.8.0`, then `bun run compile` at the app root
59
+ - Replace `isMobileDevice` imports with `isNarrowViewport` before a future major removes the alias
60
+ - Open a `DropdownPanel` whose trigger is not at the start of its row and confirm the panel opens on the trigger
61
+ - Import a draft announcement pack with `POST /announcements/import-release` and confirm a second import updates the same slug instead of inserting a duplicate
@@ -2,6 +2,10 @@
2
2
 
3
3
  This file is a placeholder until Terreno 58 is cut. When that release ships, expand this page into a full upgrade note.
4
4
 
5
+ ## `Filter` and `FilterProps` are removed
6
+
7
+ `@terreno/ui` removes the `Filter` and `FilterProps` aliases added as deprecations in 57.7.0. Import `DropdownPanel` and `DropdownPanelProps`. `FilterSelectMenu`, `FilterBoolean`, `FilterAccordion`, and `FilterChangesBadge` keep their names. See [57.7.0](57.7.0.md).
8
+
5
9
  ## HTTP rate limiting defaults on
6
10
 
7
11
  `TerrenoApp` will enable HTTP rate limiting by default (memory store unless you pass `store`). Apps that must stay unlimited must pass an explicit off once 58 defines that API.
@@ -20,6 +20,7 @@ that file (and its imports) to a working example. Gaps stay explicit.
20
20
  | Feature flags + live updates | yes — `FeatureFlagsApp` in `example-backend/src/server.ts`, seed `example-backend/src/scripts/seed-feature-flags.ts` | yes — `useTerrenoFeatureFlags` in `example-frontend/app/_layout.tsx` | Socket-backed live updates share the realtime connection. |
21
21
  | Websockets / realtime | yes — `RealtimeApp` in `example-backend/src/server.ts`, `example-backend/src/websockets.ts` | yes — `useSocketConnection` in `example-frontend/app/_layout.tsx` | Sync deltas also use the socket (`SyncApp` + `@terreno/syncdb`). |
22
22
  | Consent forms | yes — `example-backend/src/consentDefinitions.ts`, seed scripts | yes — `example-frontend/app/(tabs)/consents.tsx`, admin `example-frontend/app/admin/consent-forms/` | First-login flow is covered by e2e (`example-frontend/e2e/consents.spec.ts`). |
23
+ | Product announcements | yes — `AnnouncementsApp` in `example-backend/src/server.ts`, release upload token via `ANNOUNCEMENTS_UPLOAD_TOKEN`, seed `example-backend/src/scripts/seed-announcements.ts`, sample release pack `example-backend/announcements/releases/1.14.0/` with `bun run announcements:pack` | yes — `AnnouncementNavigator` in `example-frontend/app/_layout.tsx` and admin announcement routes | Release packs support multiple Markdown surfaces and idempotent draft or explicit live API import. |
23
24
  | File upload / GCS | yes — `example-backend/src/api/settings.ts`, AI file routes in `example-backend/src/api/ai.ts` | yes — `example-frontend/app/(tabs)/files.tsx`, `example-frontend/app/gcs-settings.tsx` | |
24
25
  | Better Auth | yes — `example-backend/src/utils/betterAuthConfig.ts`, `BetterAuthApp` in `example-backend/src/server.ts` | yes — `example-frontend/app/login.tsx`, `example-frontend/lib/betterAuth.ts` | Default `AUTH_PROVIDER` is `better-auth`. |
25
26
  | syncdb local-first | yes — `SyncApp` in `example-backend/src/server.ts` | yes — `example-frontend/store/syncdb.ts`, `example-frontend/app/(tabs)/index.tsx` | PR #869 closed without merge; `@terreno/syncdb` shipped on the launch line and is the example todos path. |
@@ -49,7 +49,7 @@ the inner loop until the approved task list is done. Roast never invokes Pick. B
49
49
  Taste additionally wait while async review bots are running, preferring provider CLI
50
50
  watch hooks or harness event subscriptions over timer polling. Taste also waits in a
51
51
  loop for product CI with `gh` or `circleci` until jobs are terminal or the wait times
52
- out. Before any push it always pulls latest `master`, then records last-run failed tests
52
+ out. Before any push it fetches latest `master` (merging it only when needed), then records last-run failed tests
53
53
  and re-verifies them locally, then runs the repository's root
54
54
  `prepush` package script in a no-context subagent when present (falling back to affected
55
55
  package lint, typecheck, and tests), then pushes and watches CI.
@@ -82,8 +82,8 @@ acceptance criteria. Taste is one reactive iteration, not an unbounded fix-until
82
82
  daemon. It waits until async review bots (Bugbot, CodeQL, and similar) on the current
83
83
  head have reported, then waits in a loop for product CI using GitHub CLI
84
84
  (`gh pr checks --watch`, `gh run watch`) or CircleCI CLI (`circleci run watch`) until
85
- jobs are terminal or the wait times out. Before any push it always pulls latest
86
- `master`, records last-run failed tests and re-verifies them locally, then runs root
85
+ jobs are terminal or the wait times out. Before any push it fetches latest
86
+ `master` (merging it only when needed), records last-run failed tests and re-verifies them locally, then runs root
87
87
  `prepush` when present in a fresh subagent with no parent
88
88
  conversation. If absent, it proves affected-package lint, typecheck, and tests instead.
89
89
  It then pushes and watches CI, emits `PASS`, `FAIL`, `BLOCKED`, or `PENDING`, and exits.
@@ -139,6 +139,35 @@ or transports it and Brew excludes it from commits unless repository policy says
139
139
  otherwise. Stage results follow the plugin's JSON-schema-backed YAML contract and never
140
140
  contain chain-of-thought or transcripts.
141
141
 
142
+ ## Commits and pushes
143
+
144
+ Every pushed commit starts a full CI run. Harnesses such as Cursor cloud agents push
145
+ every commit automatically, so commit count turns directly into CI runs. Before these
146
+ rules, one 30-commit dashboard PR had ten "mark slice roasted" commits and ten "harden"
147
+ follow-ups, and `ui-ci` stayed red on every commit after the first.
148
+
149
+ - One behavior-scoped commit per task, after Roast `PASS`: code, tests, docs, and the
150
+ task-file mark together. Roast-driven fixes fold into that commit.
151
+ - Progress lives in execution state, not in standalone task-file commits.
152
+ - Pick and Roast never push. Brew pushes once. Taste pushes at most once per reaction.
153
+ - Pick does not continue on a head whose product CI shows a branch-caused failure.
154
+ - Pick lists a behavior's edge cases before coding, so Roast proves them instead of
155
+ discovering them.
156
+ - Roast runs the gate CI will run (root `prepush`, which mirrors the triggered CI jobs),
157
+ not only the task's test file.
158
+ - Taste fetches `master` before every push but merges it only when the PR conflicts, a
159
+ failure traces to base drift, or the branch is otherwise merge-ready.
160
+
161
+ ## Direct invocation
162
+
163
+ Outer loops (`terreno-planning-loop`, `terreno-taste-sweep`) consume Taste `PENDING`
164
+ and invoke Taste again. When a human invokes Taste directly, no loop is waiting, so a
165
+ `PENDING` would only tell them to come back later. In that case Taste uses
166
+ **standalone entry**: it waits in-process with native watches and reacts again. It
167
+ stops on `PASS`, `BLOCKED`, or `FAIL`, or after 3 fix pushes or 3 hours of waiting,
168
+ which ends as `BLOCKED` with one concrete human action. A directly invoked Brew
169
+ starts Taste as its next stage instead of exiting.
170
+
142
171
  ## Retry and stop rules
143
172
 
144
173
  - Pick implements one task, Roast proves it, then Pick takes the next unblocked task.
@@ -101,7 +101,7 @@ HTTP method and scope map to a CRUD permission check:
101
101
  **403** — denied after the instance document is loaded (e.g. `IsOwner` with a document that fails the check).
102
102
  **401** — unauthenticated when a permission requires auth (from existing auth middleware).
103
103
 
104
- `authenticateMiddleware` honors the router’s `allowAnonymous` option, same as CRUD.
104
+ `authenticateMiddleware` honors the router’s `allowAnonymous` option, same as CRUD. An action may set `allowAnonymous: true` to accept unauthenticated requests without making the router's CRUD routes or other actions anonymous. Keep a non-empty permission such as `Permissions.IsAny` and authenticate any service token in the handler.
105
105
 
106
106
  ## Validation
107
107
 
@@ -51,11 +51,18 @@ as GitHub App checks; they are not CircleCI jobs.
51
51
 
52
52
  **Path:** Settings → Environments
53
53
 
54
- Same-repo PR jobs in `cd.yml` (`Terraform preview`, `Tasks deploy (preview)`,
55
- `Backend deploy (preview)`) skip when `head.repo.full_name != github.repository`.
56
- Also restrict the `gcp-cd-preview` environment (create it on first deploy if missing) with a
57
- **deployment branch policy** or **required reviewers** so a fork that edits
58
- `cd.yml` cannot mint a prod WIF token.
54
+ `cd.yml` is disabled; CircleCI `gcp-cd-preview` performs GCP previews and
55
+ halts on fork PRs. While the GitHub WIF provider still exists, keep the
56
+ `gcp-cd-preview` environment restricted with a **deployment branch policy** or
57
+ **required reviewers** so a fork that re-enables `cd.yml` cannot mint a prod
58
+ WIF token.
59
+
60
+ ### Actions secrets for CircleCI hooks
61
+
62
+ `preview-cleanup.yml` (PR close) and `publish-on-tag.yml` (manual publish demo
63
+ redeploy) start CircleCI pipelines. Set the secret `CIRCLECI_TOKEN` and the
64
+ variable `CIRCLECI_PIPELINE_DEFINITION_ID` under Settings → Secrets and
65
+ variables → Actions.
59
66
 
60
67
  ## Merge settings
61
68
 
@@ -88,11 +88,10 @@ half applies:
88
88
  | 1 | Announcements | Announcement | Maintainers only | Official release notes, breaking changes, deprecations, and launch updates from the Terreno team. |
89
89
  | 2 | Q&A | Question / Answer | Anyone | Ask how to use Terreno. Search existing threads first; accepted answers may become how-to guides in `docs/how-to/`. |
90
90
  | 3 | Ideas | Open-ended | Anyone | Feature ideas and improvements before they are shaped. This is the intake funnel — do not open a tracking issue until a maintainer promotes your idea. |
91
- | 4 | Hacktoberfest | Open-ended | Anyone | Pitch something to build during Hacktoberfest and upvote the ideas you want. Popular, well-scoped ideas become `hacktoberfest` issues anyone can pick up. |
92
- | 5 | Agents & AI | Open-ended | Anyone | MCP setup, Cursor/Claude skills, agent workflows, and prompt patterns for building with Terreno. |
93
- | 6 | RFCs | Open-ended | Anyone | Substantial proposals that change public API or add packages. Use the RFC discussion template; accepted RFCs become IPs. |
94
- | 7 | Show and tell | Open-ended | Anyone | Apps and experiments built with Terreno. Share what you shipped and what friction you hit. |
95
- | 8 | Docs feedback | Open-ended | Anyone | Report missing or confusing documentation. Link the page URL; recurring feedback becomes docs PRs. |
91
+ | 4 | Agents & AI | Open-ended | Anyone | MCP setup, Cursor/Claude skills, agent workflows, and prompt patterns for building with Terreno. |
92
+ | 5 | RFCs | Open-ended | Anyone | Substantial proposals that change public API or add packages. Use the RFC discussion template; accepted RFCs become IPs. |
93
+ | 6 | Show and tell | Open-ended | Anyone | Apps and experiments built with Terreno. Share what you shipped and what friction you hit. |
94
+ | 7 | Docs feedback | Open-ended | Anyone | Report missing or confusing documentation. Link the page URL; recurring feedback becomes docs PRs. |
96
95
 
97
96
  ### Pinned posts
98
97
 
@@ -127,24 +126,29 @@ When an answer repeats, maintainers turn it into a how-to doc via PR.
127
126
  - Do **not** open a feature issue directly — maintainers promote accepted ideas to tracked issues on the [Terreno Roadmap](https://github.com/TerrenoLabs/terreno/projects) board.
128
127
  - For API/package-level design, use the **RFCs** category instead.
129
128
  - Bugs → [Bug report](https://github.com/TerrenoLabs/terreno/issues/new?template=bug_report.yml).
129
+ - **Hacktoberfest pitches live here too.** Tick the Hacktoberfest box on the form; maintainers apply the [`hacktoberfest`](https://github.com/TerrenoLabs/terreno/discussions?discussions_q=label%3Ahacktoberfest) label. 👍 the pitches you want built.
130
130
  ```
131
131
 
132
- #### Hacktoberfest
132
+ #### Hacktoberfest (inside Ideas)
133
133
 
134
- ```markdown
135
- **Pitch Hacktoberfest ideas here, and 👍 the ones you want built.**
136
-
137
- 1. [Start a Hacktoberfest discussion](https://github.com/TerrenoLabs/terreno/discussions/new?category=hacktoberfest) — the form asks for the idea, area, rough size, and what "done" looks like.
138
- 2. Upvote and comment on other pitches. Upvotes are how maintainers rank them.
139
- 3. Maintainers turn popular, well-scoped ideas into issues labeled [`hacktoberfest`](https://github.com/TerrenoLabs/terreno/issues?q=is%3Aissue+is%3Aopen+label%3Ahacktoberfest) and link them back here. Pick one up by commenting on the issue.
134
+ Hacktoberfest does not get its own category. Pitches are Ideas discussions carrying the
135
+ `hacktoberfest` label, so upvotes, promotion, and search all use the same path as any other
136
+ idea.
140
137
 
141
- Longer-term feature ideas → **Ideas**. Bugs → [Bug report](https://github.com/TerrenoLabs/terreno/issues/new?template=bug_report.yml).
142
- ```
138
+ 1. [Start an Ideas discussion](https://github.com/TerrenoLabs/terreno/discussions/new?category=ideas)
139
+ and tick **This is a Hacktoberfest pitch**. Give the area, rough size, and what "done" looks
140
+ like.
141
+ 2. A maintainer applies the [`hacktoberfest`](https://github.com/TerrenoLabs/terreno/discussions?discussions_q=label%3Ahacktoberfest)
142
+ label and the matching `area:*` label. Upvotes are how maintainers rank pitches.
143
+ 3. Popular, well-scoped pitches become issues labeled
144
+ [`hacktoberfest`](https://github.com/TerrenoLabs/terreno/issues?q=is%3Aissue+is%3Aopen+label%3Ahacktoberfest),
145
+ linked back to the discussion. Pick one up by commenting on the issue.
143
146
 
144
- Promotion follows the Ideas path, with one change: a Hacktoberfest idea small enough to finish
147
+ Promotion follows the Ideas path, with one change: a Hacktoberfest pitch small enough to finish
145
148
  in a weekend becomes a `hacktoberfest` + `good first issue` work item directly (see
146
149
  [GitHub issue lifecycle](../how-to/github-issue-lifecycle.md)) instead of a `Shaping` roadmap
147
- item. Larger ones go through `roadmap-promote` like any other idea.
150
+ item. Larger ones get `hacktoberfest` + `help wanted` and go through `roadmap-promote` like any
151
+ other idea.
148
152
 
149
153
  #### Agents & AI
150
154
 
@@ -397,10 +401,10 @@ do not claim completion until done.
397
401
 
398
402
  | Workflow | Trigger | Purpose |
399
403
  | -------- | ------- | ------- |
400
- | [`.github/workflows/triage.yml`](https://github.com/TerrenoLabs/terreno/blob/master/.github/workflows/triage.yml) | Issue opened | `status:needs-triage` + `area:*` from package dropdown + `type:*` from Kind when present |
404
+ | [`.github/workflows/triage.yml`](https://github.com/TerrenoLabs/terreno/blob/master/.github/workflows/triage.yml) | Issue opened | `status:needs-triage` + `area:*` from package dropdown + `type:*` from Kind when present; `area:*` / `type:*` labels the issue was opened with win, so `roadmap:sync` issues are not asked for an area |
401
405
  | [`.github/workflows/roadmap-generate.yml`](https://github.com/TerrenoLabs/terreno/blob/master/.github/workflows/roadmap-generate.yml) | Daily + manual | `roadmap:sync --check` for board drift, then regenerate `ROADMAP.md` from the board and open a pull request when it changes |
402
406
  | [`.github/workflows/roadmap-sync.yml`](https://github.com/TerrenoLabs/terreno/blob/master/.github/workflows/roadmap-sync.yml) | Taxonomy files change on `master` + manual | Apply labels and reconcile the board's fields and items |
403
- | [`.github/workflows/roadmap-reconcile.yml`](https://github.com/TerrenoLabs/terreno/blob/master/.github/workflows/roadmap-reconcile.yml) | IP or task files change on `master` + manual | Advance status from IP headers, push to the board, regenerate `ROADMAP.md` |
407
+ | [`.github/workflows/roadmap-reconcile.yml`](https://github.com/TerrenoLabs/terreno/blob/master/.github/workflows/roadmap-reconcile.yml) | IP or task files change on `master` + manual | Advance status from IP headers, add an entry for every new IP, open its tracking issue, push to the board, regenerate `ROADMAP.md` |
404
408
  All three share the `roadmap` concurrency group. They write the same board, and interleaving
405
409
  them produces confusing partial states. After the group lock is acquired, each job refreshes
406
410
  to the latest branch HEAD so a queued `roadmap-sync` cannot overwrite statuses that
@@ -413,7 +417,7 @@ The full loop, each arrow with exactly one writer:
413
417
 
414
418
  ```
415
419
  docs/implementationPlans/*.md ──roadmap:reconcile──▶ roadmap-seed-issues.md
416
- docs/tasks/*.md (Status only) │
420
+ docs/tasks/*.md (Status + new entries) │
417
421
  roadmap:sync
418
422
  ▼
419
423
  Project board
@@ -439,6 +443,24 @@ reported by `--check` and is never overwritten. Cards that are not in
439
443
  [`roadmap-seed-issues.md`](roadmap-seed-issues.md) are also `--check` failures; apply does
440
444
  not delete them. Maintainers own the board's *state* and `Community interest`.
441
445
 
446
+ **New IPs reach the roadmap on merge.** When a merged plan has no entry,
447
+ `roadmap:reconcile --fix` scaffolds one: the title from the IP's H1, the summary from the first
448
+ paragraph of `## Goal`, and links to the IP and its task list (when `docs/tasks/<slug>.md`
449
+ exists). Area, Target, and Impact come from an optional IP header:
450
+
451
+ ```markdown
452
+ **Roadmap:** Area=`api`, Target=`Next`, Impact=`Feature`
453
+ ```
454
+
455
+ Without that header they are inferred: Area from the packages named in the header block
456
+ (default `dx`); Target `Released` for shipped work, `Future` for drafts, `58` when a
457
+ `**Target:**` line names 58, otherwise `Next`; Impact `Breaking` when the `**Target:**` line
458
+ says so, otherwise `Feature`. Edit the scaffolded section afterward if a guess is wrong. The
459
+ workflow then runs `roadmap:sync --create-missing-ip-issues`, which opens a tracking issue
460
+ only for entries backed by an IP. Drafts land as `Shaping`. Moving an entry to `Shipped` also
461
+ moves its Target to `Released`. `ROADMAP.md` links each entry's IP and, when one exists, its
462
+ task list.
463
+
442
464
  **Status automation is monotonic.** `roadmap:reconcile --fix` advances status and applies
443
465
  supersessions, but never walks a status backwards and never revives declined work. IP headers
444
466
  go stale far more often than boards do — several plans still read `Draft` for work that